一、博客内容
1.运行截图
正常运行的截图(其他情况与此类似,就不一一贴出了):
存在输入错误时的截图(其他格式不规范或者输入正常的情况与此类似,也不一一贴出了):
2.额外扩展的功能
十六进制与其他三种进制的互相转换:
当你要输入一个二进制或者其他进制的数时,你输入的却不是该进制的数,会得到一个错误提示并让你重新输入,运行情况如上面第二张图;
当你要选择需要转换的数字是几进制时,如1.二进制 2.八进制 3.十进制 4.十六进制,若输入除了1~4以外的数字就会有一个错误提示并让你重新选择,运行结果如上面第二张图;
当你要选择想把数字转换成几进制时,如二进制转其他进制 1.八进制 2.十进制 3.十六进制,若输入除了1~3以外的数字就会有一个错误提示并让你重新选择,效果如上面第二张图;
3.介绍函数
所有函数的声明:
二进制转其他进制的函数:
void erjinzhi(void);
void erjinzhi(void){ char number[128]; int t2,i,j,length,sum=0; input: printf("请输入想要转换的数:\n"); scanf("%s",number); length=strlen(number); for(i=length-1;i>=0;i--){ if(number[i]!='0' && number[i]!='1'){ printf("您输入的数并不是二进制数,请重新输入\n"); goto input; } } printf("您想转换成几进制的数?\n"); choice : printf("1.八进制 2.十进制 3.十六进制\n"); scanf("%d",&t2); for(i=length-1,j=0,sum=0;i>=0;i--,j++){ sum += (number[i]-'0') * pow(2,j); } if(t2==1){ printf("%o",sum); }else if(t2==2){ printf("%d",sum); }else if(t2==3){ printf("%x",sum); }else{ printf("输入错误,请重新选择想要转换的进制\n"); goto choice; } }
八进制转其他进制的函数:
void bajinzhi(void);
void bajinzhi(void){ char number[128]; int t2,i,j,length,sum; input: printf("请输入想要转换的数:\n"); scanf("%s",number); length=strlen(number); for(i=length-1;i>=0;i--){ if(number[i]<'0' || number[i]>'7'){ printf("您输入的数并不是八进制数,请重新输入\n"); goto input; } } printf("您想转换成几进制的数?\n"); choice: printf("1.二进制 2.十进制 3.十六进制\n"); scanf("%d",&t2); for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ sum += (number[i]-'0') * pow(8,j); } if(t2==1){ int n[100]; i=0; while(sum>0){ n[i]=sum%2; sum/=2; i++; } for(j=i-1;j>=0;j--){ printf("%d",n[j]); } }else if(t2==2){ printf("%d",sum); }else if(t2==3){ printf("%x",sum); }else{ printf("输入错误,请重新选择想要转换的进制\n"); goto choice; } }
十进制转其他进制的函数:
void shijinzhi(void);
void shijinzhi(void){ char number[128]; int t2,i,j,length,sum; input: printf("请输入想要转换的数:\n"); scanf("%s",number); length=strlen(number); for(i=length-1;i>=0;i--){ if(number[i]<'0' || number[i]>'9'){ printf("您输入的数并不是十进制数,请重新输入\n"); goto input; } } printf("您想转换成几进制的数?\n"); choice: printf("1.二进制 2.八进制 3.十六进制\n"); scanf("%d",&t2); for(i=0,sum=0;i<length;i++){ sum= sum*10+(number[i]-'0'); } if(t2==1){ int n[100]; i=0; while(sum>0){ n[i]=sum%2; sum/=2; i++; } for(j=i-1;j>=0;j--){ printf("%d",n[j]); } }else if(t2==2){ printf("%o",sum); }else if(t2==3){ printf("%x",sum); }else{ printf("输入错误,请重新选择想要转换的进制\n"); goto choice; } }
十六进制转其他进制的函数:
void shiliujinzhi(void);
void shiliujinzhi(void){ char number[128]; int t2,i,j,length,sum; input: printf("请输入想要转换的数:\n"); scanf("%s",number); length=strlen(number); for(i=length-1;i>=0;i--){ if(number[i]<'0' || (number[i]>'9' && number[i]<'A') || (number[i]>'F' && number[i]<'a')|| (number[i]>'f')){ printf("您输入的数并不是十六进制数,请重新输入\n"); goto input; } } printf("您想转换成几进制的数?\n"); choice: printf("1.二进制 2.八进制 3.十进制\n"); scanf("%d",&t2); for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ if(number[i]>='0' && number[i]<='9'){ number[i] = number[i]-'0'; }else if(number[i]>='A' && number[i]<='F'){ number[i] = number[i]-'A'+10; }else if(number[i]>='a' && number[i]<='f'){ number[i] = number[i]-'a'+10; } sum += (number[i]) * pow(16,j); } if(t2==1){ int n[100]; i=0; while(sum>0){ n[i]=sum%2; sum/=2; i++; } for(j=i-1;j>=0;j--){ printf("%d",n[j]); } }else if(t2==2){ printf("%o",sum); }else if(t2==3){ printf("%d",sum); }else{ printf("输入错误,请重新选择想要转换的进制\n"); goto choice; } }
4.main函数
#include<stdio.h> #include<string.h> #include<math.h> void erjinzhi(void); void bajinzhi(void); void shijinzhi(void); void shiliujinzhi(void); int main(){ int t1;//t1,t2是用来判断用户想要是输入和输出的是几进制的数,length是输入的字符串的长度; printf("请问您输入的是几进制的数?\n"); select: printf("1.二进制 2.八进制 3.十进制 4.十六进制\n"); scanf("%d",&t1); if(t1==1){ erjinzhi(); }else if(t1==2){ bajinzhi(); }else if(t1==3){ shijinzhi(); }else if(t1==4){ shiliujinzhi(); }else{ printf("输入错误,请重新选择进制\n"); goto select; } return 0; }
5.用思维导图来表示程序中函数的关系
6.在完成本次作业过程中遇到的问题,如何解决的:
(1)关于如何读入数值,一开始想的是直接用scanf("%d",&number);读进来,但是写到十六进制的时候发现不行了,就都改成用scanf("%s",number)读入字符串。
(2)如何计算字符串的长度,本来想用循环计数,读到'\0'就结束,后来知道了还有strlen这个计算字符串长度,就又简化了代码。
(3)怎么把字符串传递到函数中?百度之后知道是 void erjinzhi(char*number) 这样写的,但是由于goto只能在同一个函数内用,所以还是改成在每个进制转换的函数里自己读入字符串。
(4)关于错误提示,写完错误提示之后应该让用户再输入一次,本来想用循环,但是想了想还是用goto比较方便。goto虽然会使程序的可读性和复杂性变得更差,但是现在看来还是蛮好用的。
二、代码互评
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); } }