进制转化
一、运行截图
二、函数介绍
#include<stdio.h> #include<math.h> int erzhuanshi(char m); int bazhuanshi(int m); void PrintN1( int m ); void PrintN2( int m); int iserjinzhi(int m); int isbajinzhi(int m);
int erzhuanshi(char m) { int s=0,i=0,a; while(n!=0) { a=m%10; s+=a*pow(2,i); m=m/10; i++; } return s; }
以上是二进制的数转为十进制的函数。
int bazhuanshi(int n) { int s=0,i=0,a; while(n!=0) { a=n%10; s+=a*pow(8,i); i++; n=n/10; } return s; }
以上是八进制的数转为十进制的函数。
void PrintN1( int m ) { int a[100],i=0,c,count=0,t; while(m!=0) { c=m%2; a[i]=c; m=m/2; i++; count++; } for(i=0;i<=count/2;i++) {t=a[i];a[i]=a[count-i-1];a[count-i-1]=t; } printf("经转化后的数字为:"); for(i=0;i<count;i++) printf("%d",a[i]); }
以上是十进制的数转为二进制的函数。
void PrintN2(int m) { int a[100],i=0,c,count=0,t; while(m!=0) { c=m%8; a[i]=c; m=m/8; i++; count++; } for(i=0;i<=count/2;i++) { t=a[i];a[i]=a[count-i-1];a[count-1-i]=t; } printf("转化后的数字为:"); for(i=0;i<count;i++) printf("%d",a[i]); }
以上是十进制的数转为八进制的函数。
int iserjinzhi(int m) { char a[100]; int i=0,k; while(a[i]=getchar()!='\n') i++; a[i]=0; for(k=0;k<i;k++) { if(a[k]>'1'||a[k]<'0') { return 0; break; } } return 1; }
以上是判断输入的数是不是二进制。
int isbajinzhi(int m) { char a[100]; int i=0,k; while(a[i]=getchar()!='\n') i++; a[i]=0; for(k=0;k<i;k++) { if(a[k]>'7'||a[k]<'0') { return 0; break; } } return 1; }
以上是判断输入的数是不是八进制。
三、main函数
{ int x,y; printf("输入二进制输入1\n输入八进制输入2\n输入十进制输入3\n"); scanf("%d",&x); printf("输入需要转化的数字:"); if(x==1) { scanf("%d",&y); if(iserjinzhi(y)) { y=erzhuanshi(y); printf("转为八进制为:"); PrintN2( y); printf("\n转为十进制为:%d",y); } else printf("INPUT ERROR"); } if(x==2) { scanf("%d",&y); if(isbajinzhi(y)) { y=bazhuanshi(y); printf("转为二进制为:"); PrintN1(y); printf("\n转为十进制为:%d",y); } else printf("INPUT ERROR"); } if(x==3) { scanf("%d",&y); printf("转为二进制为:"); PrintN1(y); printf("\n转为八进制为:"); PrintN2(y); } return 0; }
四、思维导图
五、遇到的问题
遇到很多问题,比如说用字符型来转化进制,尝试了许多次因为时间有点急,还是没能整出来,在之后有空的时间里再尝试尝试。还有些问题,比如转十六进制,和十六进制转其他进制,不知道要怎么让a表示10,很困惑,但是可以通过参考其他同学的函数来理解这个问题。
六、作业互评
int main() { int option1, option2; printf("输入的进制类型为:\n"); A: printf("[1]二进制 [2]八进制 [3]十进制 [4]十六进制\n"); scanf("%d", &option1); switch (option1) { case 1: printf("想要转换成?\n"); A1: printf("[1]八进制 [2]十进制 [3]十六进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A1; } printf("输入:"); tr2(option2); break; case 2: printf("想要转换成?\n"); A2: printf("[1]二进制 [2]十进制 [3]十六进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A2; } printf("输入:"); tr8(option2); break; case 3: printf("想要转换成?\n"); A3: printf("[1]二进制 [2]八进制 [3]十六进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A3; } printf("输入:"); tr10(option2); break; case 4: printf("想要转换成?\n"); A4: printf("[1]二进制 [2]八进制 [3]十进制\n"); scanf("%d", &option2); if (option2 != 1 && option2 != 2 && option2 != 3) { printf("输入错误!重新输入想转换成什么类型:\n"); goto A4; } printf("输入:"); tr16(option2); break; default: printf("输入错误!重新输入的进制类型为:\n"); goto A; } return 0; }
他这种写法如果输入错误可以重新输入,这样使用起来比较方便,也比较好用。用switch case语句可以使这个程序看起来明了易懂,而且比较简洁,比if else好。
而我直接没想出这些东西。
七、总结
(1)收获:我觉得收获了许多,在编写程序的过程中复习巩固了各个进制之间的转化知识,又强化了自己c语言的应用熟练度,很有用。而且在不断修改修改的过程中不断思考出很多思路,最后根据当前情况选择一条最好的思路,真的让人学到很多。
(2)函数我觉得是个很好用的东西,它可以简化主函数,而且有了它查错的时候更好找错,虽然有时候会增加运行时间,但是利大于弊。