一.运行截图
二.所有函数
int twoToten(int a)//定义求二进制转十进制 { int c; int sum = 0; int i = 0;; while (a != 0) { c = a % 10; sum = sum + pow(2, i) * c;// a /= 10; i++; } return sum; }
这是一个二进制转换为十进制的函数,此函数用到了库pow,每一次循环时进行取余,然后在在除去个位,转换为十进制时从2的0次方开始相加,每一位数乘以它的对应次方直到i=0;
int eightTotwo(int a)//定义求八进制转二进制 { int c; int sum = 0; int i = 0; while (a != 0) { c = a % 10; sum = sum + pow(8, i) * c; a /= 10; i++; } return tenToeight(sum);//八进制转十进制在转二进制,引用十进制转二进制函数 }
这是求八进制转为二进制的函数。但直接从八进制转为二进制有点困难所以,我先用此函数求出十进制的的数,在调用int tenTotwo(int n)
就可以将八进制转为二进制了,
int tenTotwo(int a)//定义十进制转二进制 { int item, ret; int sum, count, result; sum = count = result = 0; while (a > 0) { item = a % 2; a = a / 2; sum = sum * 10 + item;//求二进制 count++;//计算位数 } do { ret = sum % 10; result = result * 10 + ret;//逆序输出 sum = sum / 10;; count--; } while (count != 0); return result; }
这是一个十进制求二进制函数,第一个while循环求二进制的正序,第二个循环将正序逆序输出,从而得到真正的二进制数;
三,main函数
int main() { int n, a; int w = 1;//进入循环的条件 printf("----------------------------------\n");//菜单 printf(" 进制转换器\n"); printf("注意:(1)本进制只支持二,八,十进制转换\n"); printf(" (2)本进制只支持正整数转换\n"); printf("----------------------------------\n"); printf("\n====请选择你的进制<===============\n"); printf(" 请选择相应的序号:\n"); printf("[2]二进制\n[8]八进制\n[10]十进制\n[0]退出 \n"); printf("==================================\n"); while(w) { printf("你的选择是:"); scanf("%d", &n);//输入序号 if (n == 2) { printf("你的二进制数:"); scanf("%d", &a); printf("十进制:%d\n", twoToten(a)); printf("八进制:%o\n", twoToten(a));//十进制转成八进制 } else if (n == 8) { printf("你的八进制数:"); scanf("%o", &a); printf("二进制:%d\n", eightTotwo(a)); printf("十进制:%d\n", a);//用"%d"输出十进制 } else if (n == 10) { printf("你的十进制数:"); scanf("%d", &a); printf("二进制:%d\n", tenToeight(a)); printf("八进制:%o\n", a);//直接用"%o"就可以让十进制转成八进制 } else if (n == 0) { printf("你已退出进制转换器..........."); break; } else { printf("亲,要输入正确的序号哦");//错误提示 } } return 0; }
四,思维导图
五,问题
1:在函数调用时,出现了一些问题,就是形参和实参应用有些模糊,形参和实参一定要跟主函数相关联,尽量要一样.这样才能保证不错,
2,再编译程序时一定要先分别写使用的函数,这样出错就可以很快改善,
3,一定要先弄清楚进制转换,在编写程序,这样才能高效率的写代码,不然会很累
4,一定要写程序注释,这样才会使程序更加清楚明了,
六,代码互评
这是王昕同学的代码
void eightturn(int choice) { int n, i = 0, item, x, flag, result = 0; do { flag = 0; printf("输入你要转换的数:\n"); scanf("%d", &n); item = n; while (item) {//判断输入进制 x = item % 10; if (x > 9) { printf("输入错误!!!请重新输入。\n"); flag = 1; break; } item /= 10; } } while (flag == 1); while (n != 0) {//转换成十进制 item = n % 10; result = result + item * mypow(8, i); i++; n /= 10; } printf("转换的数:\n"); if (choice == 4) turntwo(result);//输出二进制 else if (choice == 5) printf("%d\n", result); else printf("%x\n", result); printf("感谢你的使用!"); }
点评:王昕同学的代码写的非常好,他先判定输入是不是八进制数,这个我一直都没想到,他用到了递归的方法,这个一直是我的弱项
我要向王昕同学学习,多请教;
七,总结
1,大作业不像平常的pta作业,一定要用心的去做,要多花时间,不要等快到结束之后在做,这样是不好,不但会让你心疲力竭,也不好
2,一定一定要向别人请教,不要害羞,不然会浪费大量的时间
3,对于函数,一直是一个难点,我认为最难的点在与函数的调用问题,因为稍不小心就会弄错,特别是和数组一起使用的时候;调用函数要进行必要的注释
不要弄错,不然很难改,最后一定要会设置断点,这会省大量的时间,我的总结结束,,