一、运行截图。
1.
2.
3.
4.
5.
6.
7.
二、函数功能介绍。
/*将输入的所有进制数都转换成十进制数*/ int ten(char a[],int b) { int len=strlen(a); int i,num,t=1,number=0; int sum=0; if(b!=16){ for(i=len-1;i>=number;i--){ sum=sum*b+a[i]-'0'; } } else if(b==16){ for(i=number;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; }
/*将转换的十进制数转换为所需进制数并输出*/ void shuchu(int n,int c) { if(c!=16){ if(n>c-1){ shuchu(n/c,c); } printf("%d",n%c); } else if(c==16){ int a[100]; int i=0; int yushu; char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; while(n>0) { yushu=n%16; a[i++]=yushu; n=n/16; } printf("转化为十六进制的数为:0x"); for(i=i-1;i>=0;i--) { n=a[i]; printf("%c",hex[n]); } printf(" "); } }
/*判断输入进制数是否正确*/ int panduan(char a[],int d) { int flag1; int i,len,number=0; len=strlen(a); int x=d-1+48; if(d!=16){ for(i=number;i<len;i++){ if(a[i]<48||a[i]>x){ flag1=0;break; } else{ flag1=1; } } } else if(d==16){ for(i=number;i<len;i++) { if(a[i]<'0'||a[i]>'9'&&a[i]<'A'||a[i]>'F'){ flag1=0; break; } else { flag1=1; } } } return flag1; }
代码功能在代码上方以给出,十六进制与其他进制转换都不相同,故用if-else if来分别编写。将所有数转换为十进制是一个中介。
三、main函数
int main(){ int xing,a=0,chu; int flag=1; char ru[100]; printf("输入数的进制类型: "); scanf("%d",&xing); printf("输入的数: "); getchar(); scanf("%s",&ru); printf("转换进制类型:"); scanf("%d",&chu); printf("Anser:"); int m,n; flag=panduan(ru,xing); if(flag==1){ m=ten(ru,xing); shuchu(m,chu); } else{ printf("输入的数错误"); } }
用字符来表达数,其中用getchar的形式来输入。用flag来判断输入数的正误。
四、思维导图。
五、问题分析。
1.判断函数,刚开时调试时,例如输入一个二进制数,若输入221,则答案输出:输入错误。但输入121的时候,并没有显示输入错误,后来检查发现判断的循环语句中没有break,所以前面的数错误时flag1=0,但最后的数是正确的则flag1=0。才导致例子中的问题。
2.用十六进制数输出时,因为没有定义大于9之后的数用字母表示,则输出数不存在1FA类型的数,后来询问同学和百度搜索。得出,要定义函数,然后将数用数组定义来输出,简洁又明了。
六、代码互评。
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); } }
以上是杨涛同学的函数代码。其中该功能的代码要比我的简洁的多。我的代码输出十六进制数时,又要重新定义和编写,然后用if-else if放入函数中。他的代码只需说明当number大于10时用字母的形式输出,其中代码量简洁,也减少了运行时间。
七、总结。
1.增强了自身对函数的理解,函数里可以套用函数,省去编写很多重复代码。
2.增强了对字符和字符串的运用。
3.调试时要实行多样化,输入多种不同的数据进行调试,才能发现隐藏的问题。
4.面对问题时,要勤于动脑,代码每个人有每个人的特点,每个人的想法都略有不同。我们在编写代码时,要以简洁和运行时间最短为目标。