C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[47901] 소스가 제대로 실행되지 않았지만 원리만 정리합니다.
조대현.Clau [casanebula] 1034 읽음    2007-01-26 11:01
김석훈 님이 쓰신 글 :
: 문자열을 입력받아 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으로 뒤집습니다. 그런데 마지막 소스가 좀 이상해서 오류가 나네요.
////////////////////////////////////////////////////////////////////////////////////////////////////
: }
:
: 완벽하게 동작하는 소스입니다..
:
: 제가 옆에 체크한부분 좀 설명해주세요
:
: 이틀밤새서 고민해서 그런가 아..머리가 안돌아갑니다..
:
: 자세하게 아니라도 제발 대답 좀 부탁드려요..

+ -

관련 글 리스트
47900 이 소스..무슨말인지 도저히 모르겠어요.. 김석훈 954 2007/01/26
47901     소스가 제대로 실행되지 않았지만 원리만 정리합니다. 조대현.Clau 1034 2007/01/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.