1. 課題功能描述
本程序的功能,就是實現自然數的十進制、二進制、八進制、十六進制轉換。即根據用戶選擇的進制和輸入的數據,轉換得到該數所對應的十進制、二進制、八進制和十六進制數。
2. 問題詳細描述
程序運行時,首先由用戶選擇輸入數據所使用的進制,如:
歡迎使用進制轉換程序!
1. 十進制
2. 二進制
3. 八進制
4. 十六進制
0. 退出
請選擇輸入數據的進制:
用戶選擇後,再輸入數據,如選擇3(八進制),則顯示:
請輸入八進制數據:
輸入數據後,程序進行轉換,最後輸出該數所對應的十進制、二進制、八進制和十六進制數。如輸出:
轉換結果:
十進制 21809
二進制 101010100110001
八進制 52461
十六進制 5531
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int menu(){
int n;
printf("歡迎使用進制轉換程序!\n");
printf(" 1. 十進制\n");
printf(" 2. 二進制\n");
printf(" 3. 八進制\n");
printf(" 4. 十六進制\n");
printf(" 0. 退出\n");
printf("請選擇輸入數據的進制:\n");
while(true){
scanf("%d", &n);
switch(n){
case 1:printf("請選擇輸入十進制數據:\n");
return 10;
case 2:printf("請選擇輸入二進制數據:\n");
return 2;
case 3:printf("請選擇輸入八進制數據:\n");
return 8;
case 4:printf("請選擇輸入十六進制數據:\n");
return 16;
case 0:printf("退出!\n");
return 0;
default:printf("選擇有誤!請重新選擇!");
}
}
}
//把r進制的數轉換成十進制
int RtoD(int r, char *n){
int res = 0, tmp, base = 1, len;
len = strlen(n) - 1;
while(len >= 0){
if(isdigit(n[len]))
tmp = n[len] - '0';
else if(islower(n[len]))
tmp = n[len] - 'a' + 10;
else
tmp = n[len] - 'A' + 10;
res += tmp * base;
base *= r;
len--;
}
return res;
}
//十進制轉換成對應的r進制
void DtoR(int n,int r)
{
if(n)
{
DtoR(n/r,r);
printf("%X", n%r);
}
}
void print(int n){
printf("十進制:%d\n", n);
printf("二進制:");
DtoR(n, 2);
printf("\n");
printf("八進制:");
DtoR(n, 8);
printf("\n");
printf("十六進制:");
DtoR(n, 16);
printf("\n");
}
//判斷數是否合法
int judge(char *s, int n){
int i, r = n - 1, tmp;
for(i = 0; s[i] != '\0'; i++){
if(isdigit(s[i]))
tmp = s[i] - '0';
else if(islower(s[i]))
tmp = s[i] - 'a' + 10;
else if(isupper(s[i]))
tmp = s[i] - 'A' + 10;
else
return 0;
if(tmp > r)
return 0;
}
return 1;
}
int main(){
int N, num;
char str[1000];
while(N = menu(), N) {
scanf("%s", str);
if(!judge(str, N)){
printf("輸入數據有誤!請重新輸入!\n");
continue;
}
num = RtoD(N, str);
print(num);
}
return 0;
}