C语言:进制转换器,实现二进制、八进制、十进制、十六进制之间的相互转化
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int dec2bin(int n) { // 十进制转二进制
if (n == 0) {
return 0;
} else {
return (n % 2 + 10 * dec2bin(n / 2));
}
}
int bin2dec(char* s) { // 二进制转十进制
int len = strlen(s);
int ans = 0;
for (int i = 0; i < len; i++) {
if (!isdigit(s[i]) || s[i] < '0' || s[i] > '1') { // 判断是否为二进制数
printf("输入不合法,请输入二进制数\n");
return -1;
}
ans = ans * 2 + s[i] - '0';
}
return ans;
}
int dec2oct(int n) { // 十进制转八进制
if (n == 0) {
return 0;
} else {
return (n % 8 + 10 * dec2oct(n / 8));
}
}
int oct2dec(char* s) { // 八进制转十进制
int len = strlen(s);
int ans = 0;
for (int i = 0; i < len; i++) {
if (!isdigit(s[i]) || s[i] < '0' || s[i] > '7') { // 判断是否为八进制数
printf("输入不合法,请输入八进制数\n");
return -1;
}
ans = ans * 8 + s[i] - '0';
}
return ans;
}
char* dec2hex(int n) { // 十进制转十六进制
char* hex = (char*)malloc(100);
int temp, i = 1, j;
while (n != 0) {
temp = n % 16;
if (temp < 10) {
temp = temp + 48;
} else {
temp = temp + 55;
}
hex[i++] = temp;
n = n / 16;
}
hex[0] = '0';
hex[i] = '\0';
for (j = 1; j <= i / 2; j++) { // 倒序输出十六进制数
temp = hex[j];
hex[j] = hex[i - j];
hex[i - j] = temp;
}
return hex;
}
int hex2dec(char* s) { // 十六进制转十进制
int len = strlen(s);
int ans = 0;
for (int i = 0; i < len; i++) {
if (!isalnum(s[i])) { // 判断是否为十六进制数
printf("输入不合法,请输入十六进制数\n");
return -1;
}
if (isdigit(s[i])) {
ans = ans * 16 + s[i] - '0';
} else {
ans = ans * 16 + s[i] - 'A' + 10;
}
}
return ans;
}
int bin2oct(char* s) { // 二进制转八进制
int n = bin2dec(s);
if (n == -1) {
return -1;
} else {
return dec2oct(n);
}
}
char* oct2bin(char* s) { // 八进制转二进制
int n = oct2dec(s);
if (n == -1) {
return "输入不合法,请输入八进制数\n";
} else {
return dec2bin(n);
}
}
char* hex2bin(char* s) { // 十六进制转二进制
int n = hex2dec(s);
if (n == -1) {
return "输入不合法,请输入十六进制数\n";
} else {
return dec2bin(n);
}
}
int main() {
while (1) {
printf("请输入需要进行的操作:\n");
printf("1、十进制转换为二进制\n");
printf("2、二进制转换为十进制\n");
printf("3、十进制转换为八进制\n");
printf("4、八进制转换为十进制\n");
printf("5、十进制转换为十六进制\n");
printf("6、十六进制转换为十进制\n");
printf("7、二进制转换为八进制\n");
printf("8、八进制转换为二进制\n");
printf("9、十六进制转换为二进制\n");
printf("10、退出\n");
int opt;
scanf("%d", &opt);
char num[100];
switch (opt) {
case 1: // 十进制转二进制
printf("请输入十进制数:\n");
int n1;
scanf("%d", &n1);
printf("%d的二进制表示为:%d\n", n1, dec2bin(n1));
break;
case 2: // 二进制转十进制
printf("请输入二进制数(只能包含0和1):\n");
scanf("%s", num);
printf("%s的十进制表示为:%d\n", num, bin2dec(num));
break;
case 3: // 十进制转八进制
printf("请输入十进制数:\n");
int n3;
scanf("%d", &n3);
printf("%d的八进制表示为:%d\n", n3, dec2oct(n3));
break;
case 4: // 八进制转十进制
printf("请输入八进制数(只能包含0~7):\n");
scanf("%s", num);
printf("%s的十进制表示为:%d\n", num, oct2dec(num));
break;
case 5: // 十进制转十六进制
printf("请输入十进制数:\n");
int n5;
scanf("%d", &n5);
printf("%d的十六进制表示为:%s\n", n5, dec2hex(n5));
break;
case 6: // 十六进制转十进制
printf("请输入十六进制数:\n");
scanf("%s", num);
printf("%s的十进制表示为:%d\n", num, hex2dec(num));
break;
case 7: // 二进制转八进制
printf("请输入二进制数(只能包含0和1):\n");
scanf("%s", num);
printf("%s的八进制表示为:%d\n", num, bin2oct(num));
break;
case 8: // 八进制转二进制
printf("请输入八进制数(只能包含0~7):\n");
scanf("%s", num);
printf("%s的二进制表示为:%s\n", num, oct2bin(num));
break;
case 9: // 十六进制转二进制
printf("请输入十六进制数:\n");
scanf("%s", num);
printf("%s的二进制表示为:%s\n", num, hex2bin(num));
break;
case 10: // 退出
return 0;
default:
printf("输入不合法,请重新输入\n");
}
while (1) {
printf("是否继续进行转换(Y/N)?\n");
char c;
scanf(" %c", &c);
if (c == 'Y' || c == 'y') {
break;
} else if (c == 'N' || c == 'n') {
return 0;
} else {
printf("输入不合法,请重新输入\n");
}
}
}
return 0;
}
该程序首先输出菜单供用户选择需要进行的转换类型,并提示用户输入相应的数字。接着,根据用户输入的数字,程序进入相应的功能函数中。对于输入的数值,在进行相应转换之前,都会进行有效性验证,判断其是否为合法的二进制数、八进制数或十六进制数。最后,程序会询问用户是否继续转换,如果用户输入的是Y,则返回到选择菜单部分;否则,退出整个程序。
本文作者:羽小兮
本文链接:https://www.cnblogs.com/cloud-sword/p/17477483.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律