함수로 빼거나 하지 않는 순수한 초보의 코딩력이다.

 

2진법을 10진법으로 바꾸는 것은 생각보다 어려운 것이였다.

 

 

 

1.  이진법을 미리 입력하는 것이 아닌 직접 입력하기

 

2.  이진법을 십진법으로 바꾼 계산한 계산식이 표현될 것

 

3. 결과물에는 안나오지만 위치에 따른 첨자(자리 번호)를 이용해 계산

 

이 목표이고

 

 

subscript -> 첨자( 5자리 숫자면  [5][4][3][2][1]로 자릿 수를 표현 )

exponent -> 지수( 2^3 = 8 일 때  3을 나타냄,    0011 이면 2^1 + 2^0 으로 1,0이 지수임)

binaryCount -> 이진수에서 1을 검출하여

 

0001  -> 1                // 1이 2개 이상부터  '+' 기호가 추가됨 

0101  -> 2^2 + 1      // 지수가 0 일 땐  2^0 이 아닌 1로 표현

0110  -> 2^2 + 2^1

 

이런식으로 표현 가능하다.

 

 

포인터를 이용하여  문자포인터 -> 숫자(정수)포인터에 넣어 출력

 

숫자 포인터는 중간에 pow 함수를 이용한 계산 때문에 double을 써야하지만 결국엔 int형으로 바꿔야 해서 생략

 

 

flag와 count를 이용하여 특정 문자(0, 1)가 아니면 넘어가지 않도록 함

 

 

 

 

문자를 %d 나  int 로 표시하면 아스키 코드 값이 나오기 때문에 -48을 사용하는 수작업이 필요

 

 

pow 함수를 쓰면 2^0 이든 0^0 이든  1 로 나타내기  0일때 결과값에서  -1 해줘야함

 

pow 함수 사용 부분은 사실

binaryToDecimal[subscript] = ((int)binary[i] - 48) * pow(2.0, exponent);

라고 하면 바로 위 캡쳐의 코드가 필요 없다.

 

 

 

결과물

 

 

아래는 전체 코드이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>     // strlen
#include <stdlib.h>     // malloc, free
#include <math.h>       // pow

int main(){

    char* binary;
    binary = malloc(sizeof(char)*1024);
    int* binaryToDecimal;
    binaryToDecimal = malloc(sizeof(int)*1024);

    int flag = 0;       //while 문 지속
    int count = 0;      //0,1만으로 이뤄졌는지 확인용 횟수
    int subscript;      //첨자
    double exponent;    //지수
    int binaryCount = 0;
    int decimal = 0;


    printf("---------------------------\n");


    do{
        printf("이진수를 입력하세요 : ");
        count = 0;
        scanf("%s", binary);                    // 입력
        int length = strlen(binary);            // 입력된 포인터 문자열의 길이
 

        for (int i = 0; i < length; i++)
        {
            if (binary[i] != '0' && binary[i] != '1')   //0,1 아니면 처음부터 다시 입력
            {
                flag = 1;
                break;                                  
            }
            count++;                                    //확인된 문자열 길이만큼 +1
        }

        if(length == count)   // 입력받은 문자열 길이랑 확인 횟수 같으면 다음으로 진행
        {
            flag = 0;
        }


    }while(flag);


    printf("---------------------------\n");


    for (int i = 0; i < count; i++)
    {

        subscript = count - i;          // 첨자 자리
        exponent = subscript - 1;       // 첨자 위치에 따른 지수 계산
        
        binaryToDecimal[subscript] = pow(2.0*((int)binary[i] - 48), exponent);     // 거듭제곱 계산

        decimal += binaryToDecimal[subscript];                                     // 거듭제곱 합

        if(binary[i] == '1')        // 이진법의 1의 갯수
            binaryCount++;


        if(binary[i] - 48 != 0)                 //이진수 표현식에서 1 찾아냄
        {   
            if (binaryCount > 1)                // 1이 2개 이상부터 + 추가  
                printf("+ ");

            if(exponent != 0)                   // 마지막 자리 이외에 나머지는 지수형 : 2^()로 표현
                printf("2^%.0f ", exponent);
            else                                // 마지막 자리는 2^0 = 1
                printf("1");               
//              printf("2^%.0f", exponent);     2^0 표현
        }
    }


    if ((int)binary[count-1]-48 == 0)   //0의 0 제곱은 1이라서  1110 <- 맨 끝자리가 0이면  -1 해주기
    {
        decimal -= 1;
    } 
    
    printf(" = %d\n", decimal);
    printf("--------------------------\n");
    printf("십진수 결과 값 : %d\n", decimal);

    free(binary);               //동적 할당 해제
    free(binaryToDecimal);      //동적 할당 해제

    return 0;
}

 

 

 

'C' 카테고리의 다른 글

C언어 이분검색(binarySearch)  (0) 2021.04.18

+ Recent posts