[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번 문제는 단순히 조사하는 문제였기 때문에 게시하지 않았습니다
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 4.3장 연습문제 (2) | 2017.07.09 |
---|---|
명품 C언어 프로젝트 4.2장 연습문제 (2) | 2017.07.06 |
명품 C언어 프로젝트 3.8장 연습문제 (0) | 2017.07.01 |
명품 C언어 프로젝트 3.7장 연습문제 (0) | 2017.06.28 |
명품 C언어 프로젝트 3.6장 연습문제 (0) | 2017.06.23 |