一、进制转换器
1、
3、函数介绍:
a.主函数:
int main() { int c,k; int sign=0; printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n"); scanf("%d%d",&M,&N); /*判断输入的进制是否能进行转换*/ do{ c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8); if(c!=1){ printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n"); scanf("%d%d",&M,&N); } }while(c!=1); printf("请输入你要转换的值:\n"); scanf("%d",&X); if(M==2){ if(N==8){ printf("转换值为0%d",change2to8(X)); /*输出八进制格式*/ }else if(N==10){ printf("转换值为%d",change2to10(X)); /*输出十进制格式*/ } }else if(M==8){ intermediate=change8to10(X); if(N==10){ printf("转换值为%d",intermediate); /*输出十进制格式*/ }else printf("转换值为%d",change10to2(intermediate)); /*输出二进制格式*/ }else if(M==10){ intermediate=change10to2(X); if(N==8){ printf("转换值为0%d",change2to8(intermediate)); /*输出八进制格式*/ }else printf("转换值为%d",intermediate); /*输出二进制格式*/ } }
函数功能:将输入的十进制、二进制或八进制转换为确定的任意其他两种进制格式。
b.二进制转八进制函数:
int change2to8(int a) { int i=0,sum=0; int b[3]; /*定义一个数组存放转换为一位八进制的二进制的三位数*/ int n=0; /*定义n用于循环,i用于统计位数,sum用于算总和*/ int d; /*以下do-while循环运用去掉位数的方法进行循环*/ do{ for(n=0;n<3;n++){ b[n]=a%10; a=a/10; } d=b[0]*1+b[1]*2+b[2]*4; /*用三位二进制数转换为一位八进制*/ sum=sum+d*pow(10,i); /*因为该算法是从右往左算,所以若要正确输出,则需加大循环后面的数的位数*/ i++; }while(a!=0); return sum; }
函数功能:将输入值转换为八进制格式。
c.二进制转十进制函数:
int change2to10(int a) { int b; int i=0,sum=0; do{ b=a%10; sum=sum+b*pow(2,i);/*按二进制定义来转换为十进制*/ i++; a=a/10; }while(a!=0); return sum; }
函数功能:将输入值转换为十进制格式。
d.八进制转十进制函数:
int change8to10(int a) { int b; int i=0,sum=0; do{ b=a%10; sum=sum+b*pow(8,i);/*根据定义进行转换*/ i++; a=a/10; }while(a!=0); return sum; }
函数功能:将输入值转换为十进制格式。
e.十进制转换为二进制函数:
int change10to2(int a) { int b; int i=0,sum=0; do{ b=a%2;/*根据除二相余法来转换*/ sum=sum+b*pow(10,i); i++; a=a/2; }while(a!=0); return sum; }
h.全局变量:
int M,N,X,intermediate; /*定义M,N来确定要转换的两种进制,定义X来存放输入值,定义intermediate来存放中间值*/ char s[1000]; /*定义字符数组来存放每位数*/
4、该进制转换器的main函数:
int main() { int c,k; int sign=0; printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n"); scanf("%d%d",&M,&N); do{ c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8); if(c!=1){ printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n"); scanf("%d%d",&M,&N); } }while(c!=1); printf("请输入数值:\n"); scanf("%d",&X); if(M==2){ if(N==8){ printf("转换值为0%d",change2to8(X)); }else printf("转换值为%d",change2to10(X)); }else if(M==8){ intermediate=change8to10(X); if(N==10){ printf("转换值为%d",intermediate); }else printf("转换值为%d",change10to2(intermediate)); }else if(M==10){ intermediate=change10to2(X); if(N==8){ printf("转换值为0%d",change2to8(intermediate)); }else printf("转换值为%d",intermediate); } }
5、
6、遇到的问题:
a.不知如何将三位二进制转换为一位八进制并输出:
解决方法:利用数组存放数据进行三位三位循环存为一位数;
联想输出逆序数的方法利用循环与数学函数与乘10的方法依次扩大已求数的位数。
b.不知如何从八进制转换为二进制:
原先代码:
int change8to2(int a) { int b[3]; int c; int n=2,sum=0,d=0,i=0; do{ c=a%10; for(n=2;n>=0;n--){ b[n]=c/pow(2,n); c=c-pow(2,n); d=d+b[n]*pow(10,n); } a=a/10; sum=sum+d*pow(10,3i); i++; }while(a!=0); return sum; }
若按照此代码,若c为2或1等小的数,则输出的为负数,而若用递增数列,又不知道该如何扩大位数。
解决方法:将该函数功能改为由八进制转换为十进制,再根据其他函数进行转换。
c.输入输出符号转换:
原本函数:
#include<stdio.h> #include<math.h> int change2to8(int a); int change2to10(int a); int change8to2(int a); int change10to2(int a); int judge8(char a); int judge10(char a); int M,N,X,intermediate; char s[1000]; int i=0,k; int main() { printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n"); scanf("%d%d",&M,&N); while(M!=2||M!=8||M!=16||M!=10||N!=2||N!=8||N!=16||N!=10){ printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n"); scanf("%d%d",&M,&N); } printf("请输入你要转换的值:"); while((s[i]=getchar())!='\n'){ i++; } s[i]='\0'; k=i; if(M==2){ for(i=0;i<k;i++){ while(s[i]<0||s[i]>1){ printf("输入的数值进制错误,请重新输入:\n"); while((s[i]=getchar())!='\n'){ i++; } s[i]='\0'; } } printf("请再输入一遍数值:\n"); scanf("%d",&X); if(N==8){ printf("0%o",change2to8(X)); /*输出八进制格式*/ }else if(N==10){ printf("%d",change2to10(X)); /*输出十进制格式*/ } }else if(M==8){ for(i=0;i<k;i++){ while(judge8(s[0])==0||s[i]<0||s[i]>7){ printf("输入的数值进制错误,请重新输入:\n"); while((s[i]=getchar())!='\n'){ i++; } s[i]='\0'; } } printf("请再输入一遍数值:\n"); scanf("%o",&X); intermediate=change8to2(X); if(N==10){ printf("%d",change2to10(intermediate)); }else printf("%d",intermediate); }else if(M==10){ for(i=0;i<k;i++){ while(judge10(s[0])==0||s[i]<0||s[i]>9){ printf("输入的数值进制错误,请重新输入:\n"); while((s[i]=getchar())!='\n'){ i++; } s[i]='\0'; } } printf("请再输入一遍数值:\n"); scanf("%d",&X); intermediate=change10to2(X); if(N==8){ printf("0%o",change2to8(intermediate)); }else printf("%d",intermediate); } }
因为若用符号,则编译器会自动准换为该对应进制,与所编程序输出不同。
解决方法:均用%d输入输出。
二、代码互评
int char_to_num(char a) { if (a >= '0' && a <= '9') return a - '0'; else return a - 'A' + 10; }//该函数用于将字符转换成相应的数字 char num_to_char(int num) { if (num >= 0 && num <= 9) return (char)('0' + num - 0); else return (char)('A' + num - 10); }//该函数用于将数字转成相应的字符 int decimal(char n[], int before) { int Decimal = 0; int length; int i; for (i = 0; n[i] != '\0'; i++); length = i; for (i = 0; i <= length - 1; i++) Decimal = (Decimal * before) + char_to_num(n[i]); return Decimal; }//该函数用于将其他进制数统一转换成十进制数 int Toafter(char n[], int Decimal, int after) { int i = 0; while (Decimal) { n[i] = num_to_char(Decimal % after); Decimal /= after; i++; } n[i] = '\0'; return i; }//该函数用于将转化后的十进制数转化换成所需要的进制数
代码来源:李欣欣
评论:
这位同学写的自定义函数,可直接一次性实现任意进制转换,更适用于任意所有进制的进制转换。
三、总结
1.收获:
a.关于写代码:
体验到了直接设计一个程序的困难,直观体会到了未来可能所从事工作的一些点内容,直观感受到了自己的不足,例如考虑问题不全面,在写程序前不思考,不仔细看清楚要求等问题。
b.关于代码:
·有时循环条件可以一起用,可以减炼代码。
·需要判断的条件的输出值与代入下方程序的值需要分辨清楚。
2.函数:
实现某个设定功能的工具,只要有设定,可以在程序任何可执行地方使用。