|
김석훈 님이 쓰신 글 :
: 문자열을 입력받아 10진수 숫자만 2진수로 변환하는 소스를 만들어야 합니다..
:
: 예를들어 i am 12 years old를 입력하면 12는 2진수로 바뀌어서 i am 00001100 years old로 출력하게 하느 소스를 만들어야 합니다..
:
: #include <stdio.h>
:
: int get_digit(int decimal);
: void convert_num(char *num, int decimal); <<--괄호안의것
////////////////////////////////////////////////////////////////////////////////////////////////////
char *num : char형 포인트죠. 이 주소를 시작으로 배열로 사용할 수 있습니다.
int decimal : 이 소스에서 decimal은 10진수 값을 뜻하죠. 예제문의 12가 해당됩니다.
////////////////////////////////////////////////////////////////////////////////////////////////////
:
: void main()
: {
: char num[255]={0}, question[255]={0};
: int decimal=0, digit=0, i=0;
:
: printf("십진수 숫자만 이진수로 바꿔서 출력하는 프로그램입니다.\n");
: printf("아무 문장과 십진수 숫자를 입력해 주세요.\n");
: gets(question);
:
: while(1)
: {
: if(question[i]=='\0')
: break;
: if((question[i]>='0')&&(question[i]<='9'))
: {
: sscanf(&question[i], "%d", &decimal); <<--무슨말이에요?sscanf를 안쓰고 하는 방법 없 읋까요?
////////////////////////////////////////////////////////////////////////////////////////////////////
sscanf 함수로 i번째를 시작으로 하는 완성된 10진수 숫자를 뽑아냅니다.
문자위치(i) 123
해당문자 12A
i가 1이때 sscanf로 %d형식으로 추출하면 12가 리턴되죠.
////////////////////////////////////////////////////////////////////////////////////////////////////
: digit=get_digit(decimal);
////////////////////////////////////////////////////////////////////////////////////////////////////
해당 decimal(10진수 값)의 자릿수를 구합니다.
////////////////////////////////////////////////////////////////////////////////////////////////////
:
: convert_num(num, decimal);
////////////////////////////////////////////////////////////////////////////////////////////////////
10진수값을 2진수값으로 변환하죠. 12 -> 1100
////////////////////////////////////////////////////////////////////////////////////////////////////
: printf("%s", num);
: i=i+digit; <<-이 if문안의 모든흐름이 이해가 잘 안되네여..
////////////////////////////////////////////////////////////////////////////////////////////////////
위의 sscanf로 10진수값을 읽을때 2자리를 읽었다면 그만큼 자리이동을 위해 decimal의 자릿수(digit)만큼 더합니다.
////////////////////////////////////////////////////////////////////////////////////////////////////
: }
: else
: printf("%c", question[i++]);
: }
: printf("\n");
: }
:
: int get_digit(int decimal)
: {
: int i=0;
: if (decimal==0)
: return 0;
: while (decimal>0)
: {
: decimal=decimal/10; <<----이건 왜 썼을까여?ㅠㅠ
////////////////////////////////////////////////////////////////////////////////////////////////////
10진수 자릿수를 구하는 부분입니다.
while을 통해 decimal이 0이상일때 반복하죠. 계속 10으로 나누면 몇자린지 나오죠.
12345를 예로들면
1) 12345 / 10 = 1234 : i = 1
2) 1234 / 10 = 123 : i = 2
3) 123 / 10 = 12 : i = 3
4) 12 / 10 = 1 : i = 4
5) 1 / 10 = 0 : i = 5
그래서 i가 5자리라는 결과를 주죠.
////////////////////////////////////////////////////////////////////////////////////////////////////
: i++;
: }
: return i;
: }
:
: void convert_num(char *num, int decimal)
: {
: int i = 0, remainder=0;
: char temp[255]={0};
:
: if (decimal==0)
: {
: num[0]='0'; <--배열에 0이 들어간거랑 null이 들어간거랑 무슨뜻이져?
////////////////////////////////////////////////////////////////////////////////////////////////////
c에선 문자열의 끝을 null(ascii값 0)로 구분하죠. 참고로 '0'은 null값이 아닙니다.
0이라는 문자를 나타냅니다. 즉 ascii값 48번에 해당하죠.
그래서 배열에는 차례대로
0
\n
이 들어갑니다. "0" 이런 문자열을 완성시키죠.
////////////////////////////////////////////////////////////////////////////////////////////////////
: num[1]=0;
: return;
: }
: while(decimal>0)
: {
: remainder=decimal%2;
: temp[i]=remainder+'0'; <<==문자열도 아닌데 null을 왜 넣었을까ㅣ여?ㅡㅡ
////////////////////////////////////////////////////////////////////////////////////////////////////
역시 '0'은 null이 아닙니다.
'0'은 ascii값 48을 가집니다. 여기에 remainder값을 더해서 원하는 숫자의 ascii값을 얻어내는 겁니다.
temp[i]는 char형이기에 0,1을 넣으면 해당하는 ascii문자가 들어갑니다.
이 문자을 if형태로 바꾸면 다음과 같이 되죠.
if(remainder == 0)
temp[i] = '0';
else
temp[i] = '1';
이것을 한줄로 표현했다고 생각하시면 됩니다. 이해가 안된다면 c에서 문자열 표현 원리와 ascii값에대해 조금만 공부하시면 될 것 같습니다.
////////////////////////////////////////////////////////////////////////////////////////////////////
: decimal=decimal/2;
: i++;
: }
: temp[i]=0;
: for(int j=0;j<i;j++)
: num[j]=temp[(i-j)-1];
: num[j]=0;
////////////////////////////////////////////////////////////////////////////////////////////////////
이 함수는 12를 2진수로 바꿀때 0011 형식으로 거꾸로 바꿉니다.
그래서 마지막 for문에서 1100으로 뒤집습니다. 그런데 마지막 소스가 좀 이상해서 오류가 나네요.
////////////////////////////////////////////////////////////////////////////////////////////////////
: }
:
: 완벽하게 동작하는 소스입니다..
:
: 제가 옆에 체크한부분 좀 설명해주세요
:
: 이틀밤새서 고민해서 그런가 아..머리가 안돌아갑니다..
:
: 자세하게 아니라도 제발 대답 좀 부탁드려요..
|