一、程序运行截图
1、
2、
3、
4、
5、
二、函数介绍
1、main:在此函数中,选择输入的进制数并输入该数,若输入的进制数不是二进制、八进制、十进制中的一个,直接输出error,若是,先判断该数是否合法,不合法,直接输出error,合法则选择要转化的进制数,调用相应函数
2、two(int x):将十进制转化为二进制
int two(int x) { int i,count; for(i=0;x!=0;i++){ a[i]=x%2; x=x/2; count=i; } for(i=count;i>=0;i--) printf("%d",a[i]); }
3、eight(int x):将十进制转化为八进制
int eight(int x) { int i,count,digit; for(i=0;x!=0;i++){ a[i]=x%8; x=x/8; count=i; } for(i=count;i>=0;i--) printf("%d",a[i]); }
4、to_ten(int x):将二进制或八进制转为十进制
int to_ten(int x) { int i,z,sum; sum=0; if(choice==2){ for(i=0;x!=0;i++){ z=x%2; sum=sum+z*pow(2,i); x=x/10; } return sum; }//二进制转十进制 if(choice==8){ for(i=0;x!=0;i++){ z=x%8; sum=sum+z*pow(8,i); x=x/8; } return sum; }//八进制转十进制 }
5、pow函数:在转十进制中发挥作用,与for循环配合,将每位的数字转为十进制的表达形式,逐步相加,得到它的十进制数;将数字字符型转化为整型
三、全局变量
1、int choice:使输入的进制在所有函数中都起作用,在调用to_ten(int x)函数转十进制时可直接判断执行哪个操作
2、int a[1000]:使数组在two(int x)函数和eight(int x)函数中都可以用,无需定义两次,让代码更简洁,且利于逆序输出
四、main函数
int main() { int j,x,y,t,flag; flag=1; printf("输入的进制数:"); scanf("%d",&choice); switch(choice){ case 2:{ scanf("%d",&x); y=x; do{ j=y%10; if(j==0||j==1) y=y/10; else { flag=0; break; } }while(y!=0);//判断输入是否合法 if(flag==0){ printf("ERROR\n"); break; }else{ printf("要转化成的进制数:"); scanf("%d",&t); x=to_ten(x); if(t==10) printf("%d",x); if(t==8) eight(x); break; } } case 8:{ scanf("%d",&x); y=x; do{ j=y%10; if(j>=0&&j<=7) y=y/10; else { flag=0; break; } }while(y!=0); if(flag==0){ printf("ERROR\n"); break; }else{ printf("要转化成的进制数:"); scanf("%d",&t); x=to_ten(x); if(t==10) printf("%d",x); if(t==2) two(x); break; } } case 10:{ int i,c,sum,a[1000]; c=sum=0; i=0; char s[1000]; scanf("%s",s); for(i=0;s[i]!='\0';i++){ if(s[i]>='0'&&s[i]<='9'){ c++; } else { flag=0; break; } }//判断输入是否合法 if(flag==0){ printf("ERROR\n"); break; }else{ for(i=0;i<c;i++){ a[i]=s[i]-'0'; sum=sum+a[i]*pow(10,c-1-i); }//将数字字符型转化为整型 printf("要转化成的进制数:"); scanf("%d",&t); if(t==8) eight(sum); if(t==2) two(sum); break; } } default:printf("ERROR");break;//输入的进制数不属于二进制、八进制、十进制中的任意一个 } return 0; }
五、思维导图
六、问题和解决方法
1、输入八进制时用了%o,使判断输入的八进制是否合法时出错
解决方法:将%o改为%d
2、判断输入的十进制是否合法时出错,无法正确判断有字母出现的情况
解决方法:将数以字符串数组的形式输入,判断它们是否范围都在‘0’~‘9’之间,合法再将数字字符转为整型
七、代码互评(网络1913杨涛)
int Tennum(char a[],int b)//将输入的数字转换为10进制数 { int len, i, num; int sum = 0; len = strlen(a);//求字符长度 for (i = 0; i < len; i++) { if (a[i] >= '0' && a[i] <= '9') { num = a[i] - '0'; } else if (a[i] >= 'A' && a[i] <= 'F') { num = a[i] - 'A' + 10; } sum = sum * b + num; } return sum; }
1、杨同学直接调用库函数中的strlen求字符长度,代码更简洁;而我用for语句算出最后一个字符的下标
2、杨同学用字符串输入,用了一个函数就可以完成任意进制转为十进制;而我在这里没用字符串,而是对输入的数进行取余、相加、除法计算,且无法进行十六进制的转化
八、总结
1、收获:熟悉了进制的转化;在需要逆序输出数字时,选择数组会方便一些;了解了字符型和整型之间的转化
2、函数理解:函数可提高代码的可读性;可在一个函数中调用其他的函数;若是两个函数之间有共同的变量,可以将该变量定义为全局变量,更方便简洁