进制转化器!
一.程序的运行截图
二进制转八进制,判断输入的二进制是否正确
八进制转二进制
八进制转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.可以通过设置断点来找程序出错的地方。
对函数的理解
函数可以让你的程序变得十分简洁,不会混乱,合理的运用函数,让你的代码更容易理解,同时也更容易对程序进行修改。