C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 4.1장 연습문제

꾸준함. 2017. 7. 5. 16:39

[1번 문제]

/*

입력한 10진 정수에 대해 진수(2, 8, 16) 별로 선택적으로 변환하여 출력하는 프로그램을 작성합니다

*/

#include <stdio.h>

 

long dec_to_bin(long n);

long dec_to_octal(long n);

char hexa(int n);

void dec_to_hexa(long n);

 

int main(void)

{

        long number;

        int sel;

        printf("10진 정수 입력: ");

        scanf("%ld", &number);

        printf("몇진법으로 변환하시겠습니까?\n1. 2진법, 2. 8진법, 3. 16진법: ");

        scanf("%d", &sel);

        printf("\n");

        switch (sel)

        {

        case 1:

               printf("%ld 2진수로 바꾸면 %ld\n", number, dec_to_bin(number));

               break;

        case 2:

               printf("%ld 8진수로 바꾸면 %ld\n", number, dec_to_octal(number));

               break;

        case 3:

               printf("%ld 16진수로 바꾸면 ", number);

               dec_to_hexa(number);

               break;

        default:

               printf("숫자를 잘 못 입력하셨습니다\n");

               return -1;

        }

        return 0;

}

 

long dec_to_bin(long n)

{

        if (n <= 1)

               return n;

        return dec_to_bin(n / 2) * 10 + n % 2;

}

 

long dec_to_octal(long n)

{

        if (n <= 7)

               return n;

        return dec_to_octal(n / 8) * 10 + n % 8;

}

 

char hexa(int n)

{

        switch (n)

        {

        case 10:

               return 'A';

               break;

        case 11:

               return 'B';

               break;

        case 12:

               return 'C';

               break;

        case 13:

               return 'D';

               break;

        case 14:

               return 'E';

               break;

        case 15:

               return 'F';

               break;

        default:

               return n + 48;

        }

}

 

void dec_to_hexa(long n)

{

        char result[20];

        char *endptr; //strtol

        int idx = 0;

        int quotinent, remainder;

        long number;

 

        do

        {

               quotinent = n / 16; //

               remainder = n % 16; //나머지

               result[idx] = hexa(remainder); //나머지를 하나씩

               idx++;

               n = quotinent;

        } while (quotinent >= 16);

 

        if (quotinent == 0)

               idx--;

        else

               result[idx] = hexa(quotinent);

 

        for (int i = idx; i >= 0; i--)

               printf("%c", result[i]);

        printf("\n");

}


[2번 문제]

/*

입력한 10진 정수를 16진수로 변환하는 함수와 프로그램을 작성하시오

*/

#include <stdio.h>

#include <stdlib.h>

 

char hexa(int n);

void dec_to_hexa(long n);

 

int main(void)

{

        long number;

        printf("10진수 입력: ");

        scanf("%ld", &number);

 

        printf("16진수로 전환하면: ");

        dec_to_hexa(number);

        return 0;

}

 

char hexa(int n)

{

        switch (n)

        {

        case 10:

               return 'A';

               break;

        case 11:

               return 'B';

               break;

        case 12:

               return 'C';

               break;

        case 13:

               return 'D';

               break;

        case 14:

               return 'E';

               break;

        case 15:

               return 'F';

               break;

        default:

               return n + 48;

        }

}

 

void dec_to_hexa(long n)

{

        char result[20];

        char *endptr; //strtol

        int idx = 0;

        int quotinent, remainder;

        long number;

 

        do

        {

               quotinent = n / 16; //

               remainder = n % 16; //나머지

               result[idx] = hexa(remainder); //나머지를 하나씩

               idx++;

               n = quotinent;

        } while (quotinent >= 16);

 

        if (quotinent == 0)

               idx--;

        else

               result[idx] = hexa(quotinent);

 

        for (int i=idx; i >= 0; i--)

               printf("%c", result[i]);

        printf("\n");

}


[3번 문제]

/*

입력한 2진수를 각각 10진수와 8진수로 변환하는 함수와 프로그램을 작성하시오

*/

#include <stdio.h>

#include <string.h>

#include <math.h>

 

long bin_to_dec(char num[]);

long dec_to_octal(long n);

 

int main(void)

{

        char num[20]; //이진수를 넣어줄 배열

        printf("이진수 입력: ");

        scanf("%s", num);

        printf("10진수로 전환하면: %ld\n", bin_to_dec(num));

        printf("8진수로 전환하면: %ld\n", dec_to_octal(bin_to_dec(num)));

        return 0;

}

 

long bin_to_dec(char num[])

{

        long result = 0, idx = 0;

        for (int i = (strlen(num) - 1); i >= 0; i--)

               if (num[idx++] == '1')

                       result += pow(2, i); //1일 경우 2^i를 곱해준다

        return result;

}

 

long dec_to_octal(long n) //10진수로 우선 전환하고 거기서 8진수로 바꿔준다

{

        if (n <= 7)

               return n;

        return dec_to_octal(n / 8) * 10 + n % 8;

}


[5번 문제]

/*

[문제 4]를 응용하여 변환할 정수와 변환할 진수를 인자로 사용하는 함수를 작성합니다

 

문제 4 '입력한 값이 몇 진수 정수인지를 구분하는 함수를 작성합니다'였는데 이는 알 수 없으므로 풀지 않았습니다.

*/

#include <stdio.h>

 

int convertNumber(int num, int jinsu, char *number);

 

int main(void)

{

        int num, jinsu, len;

        char number[100];

        while (1)

        {

               printf("정수 입력:(0 입력시 종료) ");

               scanf("%d", &num);

               if (num == 0)

                       break;

               printf("진수 입력: ");

               scanf("%d", &jinsu);

               len = convertNumber(num, jinsu, number);

               for (int i=len; i>=0; i--)

                       printf("%c", number[i]);

               printf("\n");

        }

        return 0;

}

 

int convertNumber(int num, int jinsu, char *number)

{

        int i;

        for (i = 0; num; i++)

        {

               number[i] = num % jinsu; //진수 변환

               num /= jinsu;

               if (number[i] >= 10)

                       number[i] += 'A' - 10; //16진수일 경우를 고려

               else

                       number[i] += '0';

        }

        number[i] = 0; //문자열의 끝을 알리는 \n

        if (i>32)

               return 0;

        else

               return i;

}



개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저


*4번 문제는 난해한 문제여서 풀지 않았고 6번 문제는 단순히 조사하는 문제였기 때문에 게시하지 않았습니다

반응형