一.截图部分
二.代码部分:
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"
这样使得调用那些函数比较方便,但我觉得可以把那些函数再浓缩一下,所以也没有必要去写那么多行。