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

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

1、十进制转换为二进制

2、二进制转换为十进制

3、十进制转换为八进制

4、八进制转换为十进制

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

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

7、二进制转换为八进制

8、八进制转换为二进制

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

10、退出

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


#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;
}