进制转换器

穿精又带淫゛_ 提交于 2019-12-04 04:37:29

进制转化器!

一.程序的运行截图

二进制转八进制,判断输入的二进制是否正确

八进制转二进制

八进制转16进制

十六进制转八进制

判断序号输入是否正确,二进制转16进制

二.额外功能

判断输入的数错误后提示输入正确的数,而不是退出程序。

三.运用到的函数

1.用来将16进制数转化为10进制数

long fun(char* s)//16进制转10进制
{
    int i, t;             //t记录临时加的数 
    long sum = 0;
    t = 0;
    for (i = 0;s[i];i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
            t = s[i] - '0';       //当字符是0~9时保持原数不变
        if (s[i] >= 'a' && s[i] <= 'z')
            t = s[i] - 'a' + 10;
        if (s[i] >= 'A' && s[i] <= 'Z')
            t = s[i] - 'A' + 10;
        sum = sum * 16 + t;
    }
    return sum;
}

2.用于将2,8,10进制转化为10进制

int  ten1(int a, int b) // 2,8,10进制转10进制
{
    int t = 0, product = 1;
    while (a != 0) {
        t = t + (a % 10) * product;
        a = a / 10;
        product = product * b;
    }
    return t;
}

3.用于判断2,8,10进制数是否正确

int judge(int m, int n)//m为输入的数,n为数制,用来判断2,8,10进制是否正确
{
    int i, t;
    t = 0;
    int flag;
    flag = 1;
do {
    t = m % 10;
    m /= 10;
    if (t < 0 || t >= n)flag = 0;
} while (m != 0);
    return flag;
}

4.用于判读十六进制数是否正确

int judge16(char a[]) //用来判断16进制数是否正确
{
    int len, i;
    int w = 1;
    len = strlen(a);
    for (i = 0; i < len; i++)
    {
        if (a[i] < '0' || a[i]>'9' || a[i] < 'A' || a[i]>'F') {
            w = 0;
        }
    }
    return w;
}

四.main函数

int main()
{
    int ynumber, ten;
    int choose1, choose2;
    int i, x, y, item;
    item = 0;
    char b[100];
    x = y = 0;
    //输入目标函数
    printf("--------------------------------------------\n");
    printf("请输入你的数制形式\n");
    printf("[1] 二进制\n");
    printf("[2] 八进制\n");
    printf("[3] 十进制\n");
    printf("[4] 十六进制\n");
    printf("--------------------------------------------\n");
begin1:scanf("%d", &choose1);
    //将已知数制转化为数字
    switch (choose1) {
    case 1:x = 2;break;
    case 2:x = 8;break;
    case 3:x = 10;break;
    case 4:x = 16;break;
    default:printf("请选择正确的序号");goto begin1;break;
    }
    printf("请输入你的数:");
    if (choose1 != 4)begin2:scanf("%d", &ynumber);
    else begin3:scanf ("%s", &b[100]);
    //判断输入的数字是否正确
    if (x != 16) {
        if (judge(ynumber, x)==0 ){
            printf("请输入正确的数");
            goto begin2;
        }
    }
    else {
        if (judge16(b) == 0){
            printf("请输入正确的数");
            goto begin3;
        }
    }
    //将其转化为10进制数字
    if (x != 16)
    {
        ten = ten1(ynumber, x);
    }
    else {
        int m;
        char s[N];
        ten = fun(s);
    }
    printf("--------------------------------------------\n");
    printf("目标数制形式");
    printf("[1] 二进制\n");
    printf("[2] 八进制\n");
    printf("[3] 十进制\n");
    printf("[4] 十六进制\n");
    printf("--------------------------------------------\n");
began:scanf("%d", &choose2);
    //选择目标的进制
    switch (choose2) {
    case 1:y = 2;break;
    case 2:y = 8;break;
    case 3:y = 10;break;
    case 4:y = 16;break;
    default:printf("请选择正确的序号");goto began;break;
    }
    //转化为目标进制
    if (choose2 == 4) {
        int a[100];
        int q;
        q = 0;
        int yushu;
        int m = 0;
        char hex[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
        while (ten > 0)
        {
            yushu = ten % 16;
            a[q++] = yushu;
            ten = ten / 16;
        }
        printf("转化为十六进制的数为:0x");
        for (q = q - 1;q >= 0;q--)//倒序输出 
        {
            m = a[q];
            printf("%c", hex[m]);
        } printf("\n");
    }
    else {
        int c[100];
        int count = 0;
        do {
            c[count++] = ten % y;
            ten = ten / y;
        } while (ten != 0);

        for (int i1 = count - 1;i1 >= 0;i1--) {
            printf("%d", c[i1]);
        }
    }
    return 0;
}

五.思维导图

六.遇到的问题

1.十六进制转化为10进制,及10进制转化为16进制无从下手

解决:查资料,用字符串来解决相关转化

2.运行函数超时,无法继续进行

解决:设置断点,发现while函数进行条件错误

2.负数问题

解决:目前还没有解决。。。。

4.判断数字是否合法一个函数解决不了

解决:分开变成两个函数。。。。

七.代码互评

张旭

void putmenu(void) {
    puts("^-^欢迎进入进制转换器初始界面!!!\n");
    puts("请选择您要输入的进制类型为:(输入前置代号即可)");
    puts("[1]——二进制数!");
    puts("[2]——八进制数!");
    puts("[3]——十进制数!");
    printf("[4]——十六进制数!\n您的选择是: ");
}
void getmenu(void) {
    puts("\n^-^请选择您要输出的进制类型!!!(输入前置代号即可)");
    puts("[1]——二进制数!");
    puts("[2]——八进制数!");
    puts("[3]——十进制数!");
    printf("[4]——十六进制数!\n您的选择是: ");
}
void hint(int intype) {
    switch (intype) {
    case 1:printf("\n请输入您的二进制数:"); break;
    case 2:printf("\n请输入您的八进制数:"); break;
    case 3:printf("\n请输入您的十进制数:"); break;
    case 4:printf("\n请输入您的十六进制数:"); break;
    default:puts("选择无法识别!!!请重新输入!\n"); break;
    }
}

用函数写菜单,让main函数变得很简洁

int judge(char number[], int intype) {
    if (intype == 1) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] != 48 && number[i] != 49) {
                return 0;
            }
        }
        return 1;
    }
    else if (intype == 2) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] < 48 || number[i]>56) {
                return 0;
            }
        }
        return 1;
    }
    else if (intype == 3) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] < 48 || number[i]>57) {
                return 0;
            }
        }
        return 1;
    }
    else if (intype == 4) {
        for (int i = 0; number[i] != '\0'; i++) {
            if (number[i] < 48 || (number[i] > 57 && number[i] < 65) || number[i]>70) {
                return 0;
            }
        }
        return 1;
    }
}

将输入都存入数组中就可以用一个函数判断了,很方便。解决了我的问题

八.总结

收获

1.对数组有了新的理解,发现其很有用。

2.要做一个程序要考虑很多东西,不像PTA那样有针对性,要考虑到可能发生的事。

3.做程序要思路清晰,这样才能让代码不乱。最好再做一下必要的注释,找东西方便。

4.可以通过设置断点来找程序出错的地方。

对函数的理解

函数可以让你的程序变得十分简洁,不会混乱,合理的运用函数,让你的代码更容易理解,同时也更容易对程序进行修改。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!