一.运行截图
(1)这是输入正确时的转换
(2)当输入的选项不在选项范围时会提示无效选项且不会退出,而是可以继续选择。
(3)当输入的数字不是所需进制数时会提示错误,并且可以重新输入正确的数字。
(由于其他操作均相同,就不一一列出所有进制转换及错误提示)
二.函数介绍
1.函数声明
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> void Er(); //将二进制数转换为其他三种进制数 void Ba(); //将八进制数转换为其他三种进制数 void Shi(); //将十进制数转换为其他三种进制数 void Shiliu();//将十六进制数转换为其他三种进制数
2.各个进制转换的函数
void Er(){//将二进制数转换为其他三种进制数 char str[128]; int b,i,j,length,sum=0; input: printf("请输入您需要转换的二进制数:\n"); scanf("%s",str); length=strlen(str); //length为字符长度 for(i=length-1;i>=0;i--){ if(str[i]!='0' && str[i]!='1'){ printf("Error\n"); printf("请输入正确的二进制数\n"); goto input; } } printf("请选择您要转换的进制\n"); choice : printf("1.八进制 2.十进制 3.十六进制\n"); scanf("%d",&b); for(i=length-1,j=0,sum=0;i>=0;i--,j++){ //将输入的数转换为十进制数 sum += (str[i]-'0') * pow(2,j); } if(b==1){ itoa(sum,str,8); //用到itoa将该数转换为八进制数 printf("转换结果为:%s\n",str); }else if(b==2){ itoa(sum,str,10); //用到itoa将该数转换为十进制数 printf("转换结果为:%s\n",str); }else if(b==3){ itoa(sum,str,16); //用到itoa将该数转换为十六进制数 printf("转换结果为:%s",str); }else { printf("无效选项\n"); goto choice; } }
void Ba(){//将八进制数转换为其他三种进制数 char str[128]; int b,i,j,length,sum; input: printf("请输入您需要转换的八进制数:\n"); scanf("%s",str); length=strlen(str); for(i=length-1;i>=0;i--){ if(str[i]<'0' || str[i]>'7'){ printf("请输入正确的八进制数\n"); goto input; } } printf("请选择您要转换的进制\n"); choice: printf("1.二进制 2.十进制 3.十六进制\n"); scanf("%d",&b); for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ //将输入的数转换为十进制数 sum += (str[i]-'0') * pow(8,j); } if(b==1){ itoa(sum,str,2); //用到itoa将该数转换为二进制数 printf("转换结果为:%s\n",str); }else if(b==2){ itoa(sum,str,10); //用到itoa将该数转换为十进制数 printf("转换结果为:%s\n",str); }else if(b==3){ itoa(sum,str,16); //用到itoa将该数转换为八进制数 printf("转换结果为:%s",str); }else { printf("无效选项\n"); goto choice; } }
void Shi(){//将十进制数转换为其他三种进制数 char str[100]; int b,i,length,sum; input: printf("请输入您需要转换的十进制数:\n"); scanf("%s",str); length=strlen(str); for(i=length-1;i>=0;i--){ if(str[i]<'0'||str[i]>'9'){ printf("请输入正确的十进制数\n"); goto input; } } printf("请选择您要转换的进制\n"); choice : printf("1.二进制 2.八进制 3.十六进制\n"); scanf("%d",&b); for(i=0,sum=0;i<length;i++){ //将输入的数转换为十进制数 sum= sum*10+(str[i]-'0'); } if(b==1){ itoa(sum,str,2); //用到itoa将该数转换为二进制数 printf("转换结果为:%s\n",str); }else if(b==2){ itoa(sum,str,8); //用到itoa将该数转换为八进制数 printf("转换结果为:%s\n",str); }else if(b==3){ itoa(sum,str,16); //用到itoa将该数转换为十六进制数 printf("转换结果为:%s",str); }else { printf("无效选项\n"); goto choice; } }
void Shiliu(){//将十六进制数转换为其他三种进制数 char str[128]; int b,i,j,length,sum; input: printf("请输入您要转换的十六进制的数:\n"); scanf("%s",str); length=strlen(str); for(i=length-1;i>=0;i--){ if(str[i]<'0' || (str[i]>'9' && str[i]<'A') || (str[i]>'F' && str[i]<'a')|| (str[i]>'f')){ printf("请输入正确的十六进制数\n"); goto input; } } printf("请选择您要转换的进制\n"); choice: printf("1.二进制 2.八进制 3.十进制\n"); scanf("%d",&b); for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ //将输入的数转换为十进制数 if(str[i]>='0' && str[i]<='9'){ str[i] = str[i]-'0'; }else if(str[i]>='A' && str[i]<='F'){ str[i] = str[i]-'A'+10; }else if(str[i]>='a' && str[i]<='f'){ str[i] = str[i]-'a'+10; } sum += (str[i]) * pow(16,j); } if(b==1){ itoa(sum,str,2); //用到itoa将该数转换为二进制数 printf("转换结果为:%s\n",str); }else if(b==2){ itoa(sum,str,8); //用到itoa将该数转换为八进制数 printf("转换结果为:%s",str); }else if(b==3){ itoa(sum,str,10); //用到itoa将该数转换为十进制数 printf("转换结果为:%s",str); }else { printf("无效选项\n"); goto choice; } }
都先将输入的数字转换为十进制,再利用itoa函数将其转换为所需进制。
3.main函数展示
int main(){ int a; printf(" 进制转化器\n"); printf(" 请选择您要输入的进制\n"); select: printf(" 1.二进制 2.八进制 3.十进制 4.十六进制\n"); scanf("%d",&a); if(a==1) { Er(); }else if(a==2){ Ba(); }else if(a==3){ Shi(); }else if(a==4){ Shiliu(); }else{ printf("无效选项\n"); goto select; } return 0; }
三.思维导图
四.问题及解决过程
1.刚开始准备把二进制转换为八进制,二进制转换为十进制,二进制转换为十六进制...一共十二个进制转换调用函数写出来,但尝试后发现操作繁琐且容易出错,于是就把所有输入的数都转换为十进制数,再进行后面的转换,这样一来不仅省事了很多而且代码清晰明了。
2.在将输入的数转换为十进制数时,由于智商有限,就百度了相关函数,了解了其定义及用法。
五.代码互评
1913杨涛的代码
void Numchange(int m, int b)//将10进制数转化为任意进制数 { int n = m; int count = 0; if (m == 0) printf("0"); while (n != 0) { n = n / b; count++; } int number; for (int i = count; i >= 1; i--) { number = m / (int)pow(b, i - 1); if (number < 10) { printf("%d", number); } else { printf("%c", number + 55); } m = m % (int)pow(b, i - 1); } }
看到他这个傲娇的将十进制数转换为任意进制数的代码,我惊了,代码简洁明了,功能强大。我也是将输入的数转换为十进制再进制下一步的转换,要逐一列出需要转换的代码,相对来说繁琐了很多,我应该像杨涛学习,灵活运用函数,提高效率。
六.总结
1.收获:通过上网查询学到了许多新函数的使用,对进制转换更加熟练了,修改了很多次后,我知道了代码精简的意义,扩宽了我的思维,让我体会到了代码的实用性。
2.我对于函数的理解:每个函数都是具有独立功能的模块。利用函数,可以方便实现程序的模块化,同时使整个程序的组织,编写,阅读,调试,修改更加方便,使程序更清晰。同时,同一个函数可以被一个或多个函数调用任意多次。就减少了同样代码的多次编写。