본문 바로가기

C

System Software _ project 3

 # 아래의 텍스트 파일 “numb.s” open하여, 숫자 단어들에 대한 unsigned 정수를 구한 후 전체 합을 출력한다(, X’...’ 형태이면 16진수이고, C’...’ 형태이면 ASCII 코드들로 이루어진 16진수를 의미함).

 

-smple3.c

                      [실행결과]

 

1.단어를 int get_token_sum()함수로부터 받아오면 우선 문자 맨 앞 cp[0]을 확인하여 어떤 방식으로 변환할 것인지 파악한다.

 

2. ‘X’이면 16진수를 10진수로 바꿔주고 합을 계산해준다.

 

3.’C’이면 아스키코드 16진수를 10진수로 바꾸어 해당 숫자를 더해준다.

 

4. 이 둘다 아니면 그냥 정수이다. cp는 문자열 임으로 숫자로 바꾸어 합을 더해준다.

 

<소스코드>

#include <stdio.h>

#include<stdlib.h>

#include <string.h>

#include<math.h>

int get_token_sum(char *bp);

int main() {

             FILE *fp;

             char buf[80];

             int sum = 0;

             if ((fp = fopen("numb.s", "r")) == NULL) {

                           fprintf(stderr, "file not found...\n"); exit(1);

             }

             while(fgets(buf, sizeof(buf), fp) != NULL) {

                           sum += get_token_sum(buf);

             }

             fclose(fp);

             printf("Sum of token = %d\n", sum);

}

int get_token_sum(char *bp)

{

             char *cp;

             int i;

             char *what;

             int res;

             int sum=0;

             for(cp = strtok(bp, " \t\n"); cp != NULL; ) {

                          if(cp[0]=='X'){    //16진수 변환

                                                     res=0;

                                                     int len = strlen(cp);

                                                     for(i=2; i<len-1; i++){

                                                                  if('A'<=cp[i]&&cp[i]<='F')

                                                                               cp[i]+=10-'A';

                     else

                                                                               cp[i]-='0';

                     res+=cp[i]*pow(16,len-2-i);                        

                                                      }            

                                        sum+=res;

                           }

                           else if(cp[0]=='C'){    //16진수 아스키코드 -->10진수로 변환

                                                     res=0;

                                                     int len = strlen(cp);

                                                     for(i=2; i<len-1; i++){

                                                                  if('A'<=cp[i]&&cp[i]<='F')

                                                                               cp[i]+=10-'A';

                     else

                                                                               cp[i]-='0';

                     res+=cp[i]*pow(16,len-2-i);                        

                                                      }            

                                        sum+=res;

                           }

              else{          //그냥 숫자일때 

                                       int num;    

                                       num = atoi(cp);

                                       sum+=num;

                          }

                                       cp = strtok(NULL, " \t\n");  

              }

             return(sum);

                         

}

'C' 카테고리의 다른 글

Kruskal MST  (0) 2019.07.01