进制转换器V1.0_Beta

喜夏-厌秋 提交于 2019-12-04 04:40:28

一.截图部分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二.代码部分:

char2num()

作用:将字符转化成对应的数字
       e.g.   '9'->9    'A'->10

int char2num(char ch) {
    if (ch >= '0' && ch <= '9') {
        return ch - '0';
    }
    else {
        return ch - 'A' + 10;
    }
}
char 

num2char()

作用:将数字转化成对应的字符
       e.g.   9->'9'    10->'A'

char num2char(int num) {
    if (num >= 0 && num <= 9) {
        return (char)('0' + num);
    }
    else {
        return (char)('A' + num - 10);
    }
}

is_false()

作用:判断输入是否正确,对返回0,错返回1

int is_flase(char ch[], int n) {
    int i, len, flag = 0;
    len = strlen(ch);
    for (i = 0; i < len; i++) {
        if (char2num(ch[i]) < 0 || char2num(ch[i]) >= n)
            flag = 1;
    }
    return flag;
}

any2ten()

作用:将任意进制转化为十进制

int any2ten(char str[],int key) {
    int cnt, len, i, sum = 0, item = 1;
    len = strlen(str);
    for (i = 1; i < len; i++) {
        item *= key;
    }
    for (i = 0; i < len; i++) {
        cnt = char2num(str[i]);
        sum += cnt * item;
        item /= key;
    }
    return sum;
}

ten2any()

作用:将十进制转化为任意进制

void ten2any(int n,int key) {
    int i, len = 0;
    char a[10000];
    while (n) {
        a[len] = num2char(n % key);
        n /= key;
        len++;
    }
    switch (key) {
    case 2:printf(" -->二进制是:"); break;
    case 8:printf(" -->八进制是:"); break;
    case 16:printf("    -->十六进制是:"); break;
    }
    for (i = len - 1; i >= 0; i--) {
        printf("%c", a[i]);
    }
    printf("\n");
}

main()

int main() {
    int n, result, flag = 1, now, k;
    char a[10000];
    printf("--------------------------------------------------\n");
    while (flag) {
        printf("--------------------------------------------------\n");
        printf("    请输入当前进制:");
        scanf("%d", &now);
        printf("    请输入你要转换的数:");
        switch (now) {
        case 2:
            getchar();
            gets_s(a);
            if (is_flase(a, now)) {
                printf("        输入错误!请重试!\n");
                goto lab;
            }
            ten2any(any2ten(a, now), 8);
            printf("    -->十进制是:%d\n", any2ten(a, now));
            ten2any(any2ten(a, now), 16);
            break;
        case 8:
            getchar();
            gets_s(a);
            if (is_flase(a, now)) {
                printf("        输入错误!请重试!\n");
                goto lab;
            }
            ten2any(any2ten(a, now), 2);
            printf("    -->十进制是:%d\n", any2ten(a, now));
            ten2any(any2ten(a, now), 16);
            break;
        case 10:
            getchar();
            gets_s(a);
            if (is_flase(a, now)) {
                printf("        输入错误!请重试!\n");
                goto lab;
            }
            ten2any(any2ten(a, now), 2);
            ten2any(any2ten(a, now), 8);
            ten2any(any2ten(a, now), 16);
            break;
        case 16:
            getchar();
            gets_s(a);
            if (is_flase(a, now)) {
                printf("        输入错误!请重试!\n");
                goto lab;
            }
            ten2any(any2ten(a, now), 2);
            ten2any(any2ten(a, now), 8);
            printf("    -->十进制是:%d\n", any2ten(a, now));
            break;
        }
        lab:
        printf("    继续请按1,退出请按0:");
        scanf("%d", &k);
        printf("--------------------------------------------------\n");
        if (k == 0) {
            printf("--------------------------------------------------\n");
            break;
        }
    }
    return 0;
}

三.思维导图

在这里插入图片描述

四.问题解决过程

1.刚开始写了很多函数,都是分开的,后来我发现我写的太冗长了,好几个函数其实都是合并在一个的,于是我又重新写了ten2any()和any2ten()这两个函数,来解决这个代码过长的问题。
2.开始写十六进制的时候,确实是被ABCDEF卡了一下,后面想想,要将字符转换成数字,于是联想到了ASCII码,将字符强制转换类型一下,再经过加减就可以实现数字转字符和字符转数字,而且还有几次调用,那我就直接写成了两个函数。
3.最后看到还要报错的要求,想想也对,那我就直接按照字符转数字的思路,n进制下,字符转化为数字的值要是超过了n-1,就直接报错,但是报错是在主函数实现的。
4.还有关于界面和美观的问题,刚开始是想写一堆数字,让用户去选择具体是几进制转到几进制,后来写出来自己用了一下,都快吐了,所以我就直接否决掉了。然后我就想到了输入一个进制,不管有没有用,反正就把其他的都输出出来,给用户使用,比较方便,不用转好几次。然后我又觉得每次转一次就没了,又要重新开一遍程序,很烦,所以我就在最外面直接套了一个while循环,要不要退出让用户自己选择。关于界面乱的问题..就直接在开头结尾加了一个分割线..本来就加一个..后面觉得不够明显,又加了一层,不加的话界面就会很乱,用户哪次转哪个都会乱掉。

五.代码互评

#include <stdio.h>
#include <math.h>
#include <string.h>

void transform_2_8(int n);
int transform_2_10(int n);
void transform_2_16(int n);

void transform_8_2(int n);
int transform_8_10(int n);
void transform_8_16(int n);

void transform_10_2(int n);
void transform_10_8(int n);
void transform_10_16(int n);

void transform_16_2(char *s);
void transform_16_8(char *s);
int transform_16_10(char *s);

这位同学把以上代码分别写成以下头文件

#include "Header.h"
#include "tr2.c"
#include "tr8.c"
#include "tr10.c"
#include "tr16.c"

这样使得调用那些函数比较方便,但我觉得可以把那些函数再浓缩一下,所以也没有必要去写那么多行。

六.总结

1.函数是个好东西!
2.函数是真的棒!!
3.棒得不得了!!!
1.函数方便编程、方便调试、方便升级,而且当一个过程需要重复在你的程序时,这时候函数就可以发挥很大的作用。
2.当我们在写一个需要用户去跟程序交互的东西时,需要考虑到程序美观性,还有对用户来说的简单操作。
3.再吹一遍函数~
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!