纯C语言实现进制之间的输入转换输出,下附代码只是实现了数据的显示,若要更改使其返回转换后的数值也是比较容易的。个人感觉C++编写会更加容易一些,烦请读者自己更改。其中有部分繁琐冗杂的地方还请大家见谅Orz
核心思想:
1)求模取余法实现十进制对其他进制的转换
2)通过字符数组存储要转换的二/八/十六进制数据,再逐位存储到整型数组当中
3)通过位数与幂的关系完成对十进制的转换
附代码:
1.C语言原版
#include<stdio.h>
void DecBinary(); // 十进制-->二进制
void DecOct(); // 十进制-->八进制
void DecHex(); // 十进制-->十六进制
void BinaryDec(); // 二进制-->十进制
void OctDec(); // 八进制-->十进制
void HexDec(); // 十六进制-->十进制
int input(); // 十进制转换的输入重复代码封装为一个函数
int exp(int n); // 十进制转换二进制的幂计算
int exp1(int n); // 十进制转换八进制的幂计算
int exp2(int n); // 十进制转换十六进制的幂计算
void menu();
int main()
{
int choice = 0;
do
{
menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
DecBinary();
break;
case 2:
DecOct();
break;
case 3:
DecHex();
break;
case 4:
BinaryDec();
break;
case 5:
OctDec();
break;
case 6:
HexDec();
break;
case 0:
break;
default:
printf("选项无效.\n");
break;
}
} while (choice != 0);
getchar();
//std::cin.get();
return 0;
}
void menu()
{
printf("-------------------------------------\n");
printf("| 1) 十进制 --> 二进制 |\n");
printf("| 2) 十进制 --> 八进制 |\n");
printf("| 3) 十进制 --> 十六进制 |\n");
printf("| 4) 二进制 --> 十进制 |\n");
printf("| 5) 八进制 --> 十进制 |\n");
printf("| 6) 十六进制 --> 十进制 |\n");
printf("| 0) 退出 |\n");
printf("-------------------------------------\n");
printf("Please input the choice:\n");
}
int input()
{
int n;
printf("请输入需要转换的十进制数: ");
scanf("%d", &n);
return n;
}
int exp(int n)
{
int result = 1;
for (int i = 0; i < n; i++)
{
result *= 2;
}
return result;
}
int exp1(int n)
{
int result = 1;
for (int i = 0; i < n; i++)
{
result *= 8;
}
return result;
}
int exp2(int n)
{
int result = 1;
for (int i = 0; i < n; i++)
{
result *= 16;
}
return result;
}
void DecBinary()
{
int n = input();
int ary[32];
int i = 0;
printf("%d对应的二进制数为:", n);
while (n != 0)
{
ary[i] = (n % 2);
i++;
n /= 2;
}
for (i-=1; i >= 0; i--)
{
printf("%d", ary[i]);
}
printf("\n");
}
void DecOct()
{
int n = input();
int ary[32];
int i = 0;
printf("%d对应的八进制数为:", n);
while (n > 0)
{
ary[i] = (n % 8);
i++;
n /= 8;
}
for (i -= 1; i >= 0; i--)
{
printf("%d", ary[i]);
}
printf("\n");
}
void DecHex()
{
int n = input();
char ary[32];
int i = 0;
printf("%d对应的十六进制数为:0x", n);
while (n > 0)
{
if(n%16<10)
ary[i] = (n % 16);
switch (n%16)
{
case 10:
ary[i] = 'A';
break;
case 11:
ary[i] = 'B';
break;
case 12:
ary[i] = 'C';
break;
case 13:
ary[i] = 'D';
break;
case 14:
ary[i] = 'E';
break;
case 15:
ary[i] = 'F';
break;
default:
break;
}
i++;
n /= 16;
}
for (i -= 1; i >= 0; i--)
{
if (ary[i] < 10)
printf("%d", ary[i]);
else
printf("%c", ary[i]);
}
printf("\n");
}
void BinaryDec()
{
char bina[32];
int dec[32], result;
int count = 0, judge = 0;
scanf("%s", bina);
getchar();
for (int i = 0; i < 32; i++)
{
if (bina[i] != '\0')
{
if (bina[i] > '1' || bina[i] < '0')
{
printf("输入的不是二进制数!\n");
judge = 1;
break;
}
}
if (bina[i] >= '0' &&bina[i] <= '1')
{
dec[i] = bina[i] - '0';
count++;
continue;
}
break;
}
result = 0;
if (judge == 0)
{
for (int i = 0; i <count ; i++)
{
if (dec[i] == 1)
{
result += exp(count - i - 1);
}
}
printf("%s对应的十进制数为:%d\n", bina, result);
}
}
void OctDec()
{
char Oct[32];
int dec[32], result;
int count = 0, judge = 0;
scanf("%s", Oct);
for (int i = 0; i < 32; i++)
{
if (Oct[i] != '\0')
{
if (Oct[i] > '7' || Oct[i] < '0')
{
printf("输入的不是八进制数!\n");
judge = 1;
break;
}
}
if (Oct[i] >= '0' &&Oct[i] <= '7')
{
dec[i] = Oct[i] - '0';
count++;
continue;
}
break;
}
result = 0;
if (judge == 0)
{
for (int i = 0; i < count; i++)
{
if (dec[i] >= 0 && i != count - 1)
{
result += dec[i]*exp1(count - i - 1);
}
if (i == count - 1)
result += dec[i];
}
printf("%s对应的十进制数为:%d\n", Oct, result);
}
}
void HexDec()
{
char Hex[32];
int dec[32], result;
int cout = 0, judge = 0;
scanf("s", Hex);
for (int i = 0; i < 32; i++)
{
if (Hex[i] != '\0')
{
if (Hex[i] > 'F' || (Hex[i] > 57 && Hex[i] < 65) || Hex[i] < '0')
{
printf("输入的不是十六进制数!\n");
judge = 1;
break;
}
}
if (Hex[i] >= '0' &&Hex[i] <= '9')
{
dec[i] = Hex[i] - '0';
count++;
continue;
}
if (Hex[i] >= 'A' &&Hex[i] <= 'F')
{
dec[i] = Hex[i] - 55;
count++;
continue;
}
break;
}
result = 0;
if (judge == 0)
{
for (int i = 0; i < count; i++)
{
if (dec[i] >= 0 && i != count - 1)
{
result += dec[i]*exp2(count - i - 1);
}
if (i == count - 1)
result += dec[i];
}
printf("%s对应的十进制数为:%d\n", Hex, result);
}
}
2.VS2017中成功运行的版本(作者使用的编译器)
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPRECATE
void DecBinary();
void DecOct();
void DecHex();
void BinaryDec();
void OctDec();
void HexDec();
int input();
int exp(int n);
int exp1(int n);
int exp2(int n);
void menu();
int main()
{
int choice = 0;
do
{
menu();
scanf_s("%d", &choice);
switch (choice)
{
case 1:
DecBinary();
break;
case 2:
DecOct();
break;
case 3:
DecHex();
break;
case 4:
BinaryDec();
break;
case 5:
OctDec();
break;
case 6:
HexDec();
break;
case 0:
break;
default:
printf("选项无效.\n");
break;
}
} while (choice != 0);
getchar();
//std::cin.get();
return 0;
}
void menu()
{
printf("-------------------------------------\n");
printf("| 1) 十进制 --> 二进制 |\n");
printf("| 2) 十进制 --> 八进制 |\n");
printf("| 3) 十进制 --> 十六进制 |\n");
printf("| 4) 二进制 --> 十进制 |\n");
printf("| 5) 八进制 --> 十进制 |\n");
printf("| 6) 十六进制 --> 十进制 |\n");
printf("| 0) 退出 |\n");
printf("-------------------------------------\n");
printf("Please input the choice:\n");
}
int input()
{
int n;
printf("请输入需要转换的十进制数: ");
scanf_s("%d", &n);
return n;
}
int exp(int n)
{
int result = 1;
for (int i = 0; i < n; i++)
{
result *= 2;
}
return result;
}
int exp1(int n)
{
int result = 1;
for (int i = 0; i < n; i++)
{
result *= 8;
}
return result;
}
int exp2(int n)
{
int result = 1;
for (int i = 0; i < n; i++)
{
result *= 16;
}
return result;
}
void DecBinary()
{
int n = input();
int ary[32];
int i = 0;
printf("%d对应的二进制数为:", n);
while (n != 0)
{
ary[i] = (n % 2);
i++;
n /= 2;
}
for (i-=1; i >= 0; i--)
{
printf("%d", ary[i]);
}
printf("\n");
}
void DecOct()
{
int n = input();
int ary[32];
int i = 0;
printf("%d对应的八进制数为:", n);
while (n > 0)
{
ary[i] = (n % 8);
i++;
n /= 8;
}
for (i -= 1; i >= 0; i--)
{
printf("%d", ary[i]);
}
printf("\n");
}
void DecHex()
{
int n = input();
char ary[32];
int i = 0;
printf("%d对应的十六进制数为:0x", n);
while (n > 0)
{
if(n%16<10)
ary[i] = (n % 16);
switch (n%16)
{
case 10:
ary[i] = 'A';
break;
case 11:
ary[i] = 'B';
break;
case 12:
ary[i] = 'C';
break;
case 13:
ary[i] = 'D';
break;
case 14:
ary[i] = 'E';
break;
case 15:
ary[i] = 'F';
break;
default:
break;
}
i++;
n /= 16;
}
for (i -= 1; i >= 0; i--)
{
if (ary[i] < 10)
printf("%d", ary[i]);
else
printf("%c", ary[i]);
}
printf("\n");
}
void BinaryDec()
{
char bina[32];
int dec[32], result;
int count = 0, judge = 0;
scanf_s("%s", bina, 32);
getchar();
for (int i = 0; i < 32; i++)
{
if (bina[i] != '\0')
{
if (bina[i] > '1' || bina[i] < '0')
{
printf("输入的不是二进制数!\n");
judge = 1;
break;
}
}
if (bina[i] >= '0' &&bina[i] <= '1')
{
dec[i] = bina[i] - '0';
count++;
continue;
}
break;
}
result = 0;
if (judge == 0)
{
for (int i = 0; i <count ; i++)
{
if (dec[i] == 1)
{
result += exp(count - i - 1);
}
}
printf("%s对应的十进制数为:%d\n", bina, result);
}
}
void OctDec()
{
char Oct[32];
int dec[32], result;
int count = 0, judge = 0;
scanf_s("%s", Oct, 32);
for (int i = 0; i < 32; i++)
{
if (Oct[i] != '\0')
{
if (Oct[i] > '7' || Oct[i] < '0')
{
printf("输入的不是八进制数!\n");
judge = 1;
break;
}
}
if (Oct[i] >= '0' &&Oct[i] <= '7')
{
dec[i] = Oct[i] - '0';
count++;
continue;
}
break;
}
result = 0;
if (judge == 0)
{
for (int i = 0; i < count; i++)
{
if (dec[i] >= 0 && i != count - 1)
{
result += dec[i]*exp1(count - i - 1);
}
if (i == count - 1)
result += dec[i];
}
printf("%s对应的十进制数为:%d\n", Oct, result);
}
}
void HexDec()
{
char Hex[32];
int dec[32], result;
int count = 0, judge = 0;
scanf_s("%s", Hex, 32);
for (int i = 0; i < 32; i++)
{
if (Hex[i] != '\0')
{
if (Hex[i] > 'F' || (Hex[i] > 57 && Hex[i] < 65) || Hex[i] < '0')
{
printf("输入的不是十六进制数!\n");
judge = 1;
break;
}
}
if (Hex[i] >= '0' &&Hex[i] <= '9')
{
dec[i] = Hex[i] - '0';
count++;
continue;
}
if (Hex[i] >= 'A' &&Hex[i] <= 'F')
{
dec[i] = Hex[i] - 55;
count++;
continue;
}
break;
}
result = 0;
if (judge == 0)
{
for (int i = 0; i < count; i++)
{
if (dec[i] >= 0 && i != count - 1)
{
result += dec[i]*exp2(count - i - 1);
}
if (i == count - 1)
result += dec[i];
}
printf("%s对应的十进制数为:%d\n", Hex, result);
}
}