函数深化理解与进制转换
一。程序运运行截图
二。函数介绍
1.main
-
输入该数字的原进制 ,使用局部变量primitivesystem2. 输入该数字,使用局部变量number 3. 输入想获得的进制,使用局部变量system 4.进制转换 ,调用函数binaryconversion和change,5. 获得目的数
-
#include "stdio.h" int decimalconversion(int number,int primitivesystem,int system);//转十进制函数 int binaryconversion(int number);//转二进制函数 void change(int number,int primitivesystem,int system);//进制相互转换函数 int judge(int number,int primitivesystem);//除十六进制外,判断非法函数 void input(int number,int primitivesystem);//输入函数 int main(void) { printf("请输入将输入数为什么进制数\n"); int primitivesystem; scanf("%d",&primitivesystem); int number=0; int flag=1; printf("请输入该数字\n"); char hexad[100]; if(primitivesystem!=16){ scanf("%d",&number); } else{ scanf("%s",&hexad); for(int i=0;hexad[i]!='\0';i++){ if(hexad[i]>='0'&&hexad[i]<='9'){ number=number*16+hexad[i]-'0'; } else if(hexad[i]>='A'&&hexad[i]<='F'){ number=number*16+hexad[i]-'A'+10; } else if(hexad[i]>='a'&&hexad[i]<='f'){ number=number*16+hexad[i]-'a'+10; }// 将十六进制字符串转为十进制 else{ printf("该数字非法,请重新输入"); flag=0; break; }//判断十六进制输入是否非法 } if(flag==1){ primitivesystem=10; input(number,primitivesystem); } } int remainder=0,copy=number; if(primitivesystem==2){ judge(copy,primitivesystem);//调用判断非法函数 if(judge(copy,primitivesystem)){ input(number,primitivesystem);//调用输入函数 } } else if(primitivesystem==8){ judge(copy,primitivesystem);//调用判断非法函数 if(judge(copy,primitivesystem)){ input(number,primitivesystem);//调用输入函数 } } return 0; }
2.binaryconversion(转为二进制)
-
使用递归将传入的number转为二进制数,分为两种情况,通过number/2==0的返回值,可以运用递归求出结果
-
int binaryconversion(int number){ if(number/2==0){ return number%2; } else{ return number%2+binaryconversion(number/2)*10; } }
3.change(各进制转换)
-
进行进制转换,主要通过将十进制转换为别的进制,及别的进制转换为十进制的思想,传入number,primitivesystem,system的值
-
void change(int number,int primitivesystem,int system)//进制相互转换函数{ int sum=0; int product=1; if(primitivesystem==10)//数原进制为十进制{ if(system==2){ binaryconversion(number); printf("%d\n",binaryconversion(number)); } else if(system==8){ printf("%o\n",number); } else if(system==16){ printf("%x\n",number); } else{ printf("%d\n",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换 } } else if(primitivesystem==8)//数原进制为八进制{ if(system==2){ sum=decimalconversion(number,primitivesystem,system); binaryconversion(sum); printf("%d\n",binaryconversion(sum)); } else if(system==10){ sum=decimalconversion(number,primitivesystem,system); printf("%d\n",sum); } else if(system==16){ sum=decimalconversion(number,primitivesystem,system); printf("%x\n",sum); } } else if(primitivesystem==2)//数原进制为二进制{ if(system==8){ sum=decimalconversion(number,primitivesystem,system); printf("%o\n",sum); } else if(system==10){ sum=decimalconversion(number,primitivesystem,system); printf("%d\n",sum); } else if(system==16){ sum=decimalconversion(number,primitivesystem,system); printf("%x\n",sum); } } }
4. judge(判断输入非法)
-
判断除十六进制外的输入非法,传入number与primitivesystem的值
-
int judge(int copy,int primitivesystem)//判断非法函数{ int remainder=0; int flag=1; do{ remainder=copy%10; copy=copy/10; if(remainder>primitivesystem-1){ printf("该数字非法,请重新输入\n"); flag=0; break; } }while(copy); return flag; }
5.input(输入函数)
-
进行system的输入及目的数的输出
-
void input(int number,int primitivesystem)//输入函数{ printf("请输入你想得到该数的什么进制数\n"); int system; scanf("%d",&system); printf("你将得到你想要的结果\n"); change(number,primitivesystem,system); printf("感谢使用\n"); }
6.decimalconversion(转为十进制数)
-
对非十六进制数转为十进制数,传入number,primitivesystem,system的值
-
int decimalconversion(int number,int primitivesystem,int system)//转为十进制{ int sum=0; int product=1; do{ sum=sum+(number%10)*product; number=number/10; product=product*primitivesystem; }while(number); return sum; }
三。函数关系思维导图
-
完整代码
-
#include "stdio.h" int decimalconversion(int number,int primitivesystem,int system);//转十进制函数 int binaryconversion(int number);//转二进制函数 void change(int number,int primitivesystem,int system);//进制相互转换函数 int judge(int number,int primitivesystem);//除十六进制外,判断非法函数 void input(int number,int primitivesystem);//输入函数 int main(void) { printf("请输入将输入数为什么进制数\n"); int primitivesystem; scanf("%d",&primitivesystem); int number=0; int flag=1; printf("请输入该数字\n"); char hexad[100]; if(primitivesystem!=16){ scanf("%d",&number); } else{ scanf("%s",&hexad); for(int i=0;hexad[i]!='\0';i++){ if(hexad[i]>='0'&&hexad[i]<='9'){ number=number*16+hexad[i]-'0'; } else if(hexad[i]>='A'&&hexad[i]<='F'){ number=number*16+hexad[i]-'A'+10; } else if(hexad[i]>='a'&&hexad[i]<='f'){ number=number*16+hexad[i]-'a'+10; }// 将十六进制字符串转为十进制 else{ printf("该数字非法,请重新输入"); flag=0; break; }//判断十六进制输入是否非法 } if(flag==1){ primitivesystem=10; input(number,primitivesystem); } } int remainder=0,copy=number; if(primitivesystem==2){ judge(copy,primitivesystem);//调用判断非法函数 if(judge(copy,primitivesystem)){ input(number,primitivesystem);//调用输入函数 } } else if(primitivesystem==8){ judge(copy,primitivesystem);//调用判断非法函数 if(judge(copy,primitivesystem)){ input(number,primitivesystem);//调用输入函数 } } return 0; } void change(int number,int primitivesystem,int system)//进制相互转换函数{ int sum=0; int product=1; if(primitivesystem==10)//数原进制为十进制{ if(system==2){ binaryconversion(number); printf("%d\n",binaryconversion(number)); } else if(system==8){ printf("%o\n",number); } else if(system==16){ printf("%x\n",number); } else{ printf("%d\n",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换 } } else if(primitivesystem==8)//数原进制为八进制{ if(system==2){ sum=decimalconversion(number,primitivesystem,system); binaryconversion(sum); printf("%d\n",binaryconversion(sum)); } else if(system==10){ sum=decimalconversion(number,primitivesystem,system); printf("%d\n",sum); } else if(system==16){ sum=decimalconversion(number,primitivesystem,system); printf("%x\n",sum); } } else if(primitivesystem==2)//数原进制为二进制{ if(system==8){ sum=decimalconversion(number,primitivesystem,system); printf("%o\n",sum); } else if(system==10){ sum=decimalconversion(number,primitivesystem,system); printf("%d\n",sum); } else if(system==16){ sum=decimalconversion(number,primitivesystem,system); printf("%x\n",sum); } } } int binaryconversion(int number)//二进制转换函数{ if(number/2==0){ return number%2; } else{ return number%2+binaryconversion(number/2)*10; } } int decimalconversion(int number,int primitivesystem,int system)//十进制转换函数{ int sum=0; int product=1; do{ sum=sum+(number%10)*product; number=number/10; product=product*primitivesystem; }while(number); return sum; } void input(int number,int primitivesystem)//输入函数{ printf("请输入你想得到该数的什么进制数\n"); int system; scanf("%d",&system); printf("你将得到你想要的结果\n"); change(number,primitivesystem,system); printf("感谢使用\n"); } int judge(int copy,int primitivesystem)//判断非法函数{ int remainder=0; int flag=1; do{ remainder=copy%10; copy=copy/10; if(remainder>primitivesystem-1){ printf("该数字非法,请重新输入\n"); flag=0; break; } }while(copy); return flag; }
四。遇到的问题
-
十六进制的输入:不能跟别的进制输入一样,通过对字符串的了解,使用%s输入
-
对于数字非法的判断中,出现该部分代码影响别的代码运行的情况,不断地调试及设置断点
-
忘记初始化number的值,导致十六进制数的进制转换混乱
五。代码互评(网络3班杨涛)
-
输入方面,他直接字符数串输入,避免了我的分情况输入
-
int Tennum(char a[],int b) { 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; }
-
他的 Numchange函数,利用pow来进行十进制转各进制,我的decimalconversion函数通过循环,实现各进制转十进制,再实现十进制转各进制
-
void Numchange(int m, int b) { 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); } }
六。总结
- 我对于进制转换有了更深刻的了解,各进制转为十进制都有普遍规律,而十进制转为其他进制相对容易
- 函数通过实参对形参的传递,可以使代码更加简洁,使内容更具可读性,同时函数能够相互调用,可以通过一个个函数的使用,最终实现比较复杂的运用。