博客园作业2
一、运行截图
1、二进制数转八进制数和十进制数。
2、八进制数转二进制数和十进制数。
3、十进制数转二进制数和八进制数。
4、若输入的进制数不是规则中的三种进制,则显示错误。
5、若输入的待转换数的进制不是上一步输入的进制,则显示错误。
二、函数介绍
1、二进制转为八进制和十进制
void two_to_eight_and_ten(int x) { int i = 0,s10=0,s8=0,y; //二进制转十进制 while (x != 0) { //if语句用来判断输入的是否为二进制数 if (x % 10 > 1) { printf("ERROR !"); return; } s10 = s10 + x % 10 * pow(2, i); i++; x = x / 10; } //十进制转八进制 y = s10; i = 0; while (y != 0) { s8 = s8 + y % 8 * pow(10, i); y = y / 8; i++; } printf("二进制数转为\n八进制数:%d\n十进制数:%d", s8, s10); }
思路:先判断待转换数是否合法,再把二进制先转为十进制,再转为八进制。
2、八进制转为二进制和十进制
void eight_to_two_and_ten(int x) { int i = 0, s10 = 0, s2 = 0,y; //八进制转二进制和十进制 while (x != 0) { //if语句用来判断输入的是否为八进制数 if (x % 10 > 7) { printf("ERROR !"); return; } s10 = s10 + x % 10 * pow(8, i); i++; x = x / 10; } //十进制转二进制 y = s10; i = 0; while (y!=0){ s2 = s2 + y % 2 * pow(10, i); y = y/ 2; i++; } printf("八进制数转为\n二进制数:%d\n十进制数:%d", s2, s10); }
思路:先判断待转换数是否合法,再把八进制先转为十进制,再转为二进制。
3、十进制转为二进制和八进制
void ten_to_two_and_eight(int x) { int i = 0, s2 = 0, s8 = 0,y; y = x; //十进制转二进制 while (x != 0) { s2 = s2 + x % 2 * pow(10, i); x = x / 2; i++; } //十进制转八进制 i = 0; while (y!=0){ s8 = s8 + y % 8 * pow(10, i); i++; y = y / 8; } printf("十进制数转为\n二进制数:%d\n八进制数:%d", s2, s8); }
思路:令y=x,再分别求出其二进制和八进制。
三、main函数
#include <stdio.h> #include <math.h> void two_to_eight_and_ten(int x);//二进制转八进制和十进制 void eight_to_two_and_ten(int x);//八进制转二进制和十进制 void ten_to_two_and_eight(int x);//十进制转二进制和八进制 int main() { int jzs,dzh; printf("输入'2'为二进制,输入‘8’为八进制,输入‘10’为十进制\n"); printf("输入进制数:"); scanf_s("%d", &jzs); printf("输入一个待转换数:"); scanf_s("%d", &dzh); if (jzs == 2) two_to_eight_and_ten(dzh); else if (jzs == 8) eight_to_two_and_ten(dzh); else if(jzs==10) ten_to_two_and_eight(dzh); else printf("ERROR !"); return 0; }
四、思维导图
五、错误分析
源代码
void two_to_eight_and_ten(int x) { int i = 0,s10=0,s8=0; //二进制转十进制 while (x != 0) { //if语句用来判断输入的是否为二进制数 if (x % 10 > 1) { printf("ERROR !"); return; } s10 = s10 + x % 10 * pow(2, i); i++; x = x / 10; } //十进制转八进制 i = 0; while (s10 != 0) { s8 = s8 + s10 % 8 * pow(10, i); s10 = s10 / 8; i++; }
//问题出在这,这时s10已为0,因此刚开始时要定义一个y,令y=s10,再用y去计算。 printf("二进制数转为\n八进制数:%d\n十进制数:%d", s8, s10); }
错误原因:没有定义一个y,令y=s10;导致最后s10的值为0;
六、代码互评
//张旭
int mypow(int m, int n) { int sum = 1; for (int i = 0; i < n; i++) { sum *= m; } return sum; }
评价:头文件中的pow函数运行起来比较慢,这位同学自己写了个pow函数,提高了代码的运行速度,我自己写的时候并没有想到这点,这值得我学习、借鉴。
七、总结反思
1、学会自己写一些数学函数,可以提高代码的运行速度,而不是只会用头文件里的。
2、写代码的时候,尤其是语句衔接的地方,要注意变量是否需要初始化,否则容易出错。
3、学会熟练使用函数,函数可以增强代码的可读性,同时也能锻炼我们的思维能力。