yyqx_8023 2021-06-28 17:54 采纳率: 50%
浏览 293
已结题

请设计一个进制转换器,要求能够实现二进制、八进制、十进制、十六进制之间的相互转化

  1. 请设计一个进制转换器,要求能够实现二进制、八进制、十进制、十六进制之间的相互转化,需要设计菜单来选择不同的模式实现不同进制的相互转换。菜单如下:

1、十进制转换为二进制

2、二进制转换为十进制

3、十进制转换为八进制

4、八进制转换为十进制

5、十进制转换为十六进制

6、十六进制转换为十进制

7、二进制转换为八进制

8、八进制转换为二进制

9、十六进制转换为二进制

10、退出

程序运行之后,用户首先需要输入所要进行的进制转换功能对应的数字,例如:要进行“二进制转换为十进制”,则输入2;程序就进入相应的功能,并提示用户输入一个相应的数字(需要对该数字的合法性做验证,例如判断其是否为二进制数);用户输入数字之后,程序自动转换为相应进制的数并输出结果;然后再询问用户是否继续转换,若是则输入Y继续进行相应进制的转换,否则输入N,返回至主菜单界面。

  • 写回答

1条回答 默认 最新

  • 羽小兮 2023-06-01 10:40
    关注
    
    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月10日
  • 已采纳回答 6月2日

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用