第二次博客作业: 函数+进制转换器v1.0beta
一:运行截图
二:介绍函数
1,
1 int panduan1(int n,char a[],int count,int sign)//判断用户是否输入了除数字和a-f范围外的字符 2 { 3 4 int i; 5 for(i=0;i<count;i++){ 6 if(n!=2&&n!=8&&n!=10&&n!=16)return 1; 7 if(a[i]>='a'&&a[i]<='f')a[i]-=87; 8 if(a[i]>='0'&&a[i]<='9')a[i]-=48; 9 if(a[i]>=n){ 10 if(sign!=0){ 11 return 0; 12 } 13 return 1; 14 } 15 } 16 return 0; 17 }
2,
1 int panduan2(char a[],int count,int sign)// 判断用户输入的待转化的数是否符合标准 2 { 3 int i,x; 4 x=count; 5 if(sign!=0)return 0; 6 for(i=0;i<count;i++){ 7 if(a[i]>='a'&&a[i]<='f')x--; 8 if(a[i]>='A'&&a[i]<='F')x--; 9 if(a[i]>='0'&&a[i]<='9')x--; 10 } 11 if(x==0)return 0; 12 return 1; 13 }
3,
1 void change(int n,char a[],int m,int count)//将用户输入的数先转化成十进制数,在转化成想要转化成的进制数 2 { 3 int i,j,k=0,num,sum=0,c; 4 char b[1001]; 5 for(i=0;a[i]!='\0';i++) 6 { 7 if(a[i]>='0'&&a[i]<='9')num=a[i]-'0'; 8 else 9 num=a[i]-'a'+10; 10 sum=sum*n+num; 11 } 12 while(sum) 13 { 14 c=sum%m; 15 b[k++]="0123456789abcdef"[c]; 16 sum=sum/m; 17 } 18 i=0; 19 for(i=k-1;i>=0;i--) 20 { 21 if(b[i]>='0'&&b[i]<='9')printf("%d",b[i]-'0'); 22 else 23 printf("%c",b[i]); 24 } 25 printf("\n"); 26 }
三:展示main函数
1 int main() 2 { 3 printf("二进制,八进制,十进制转化器。\n"); 4 int m, i, count =0, among,n,flag=0,x; 5 int sign=0; 6 static char a[1000],ch,b[1001]; 7 L:x=0; 8 do 9 { 10 printf("输入要转化的整数:\n"); 11 for (i = 0; i < 1000; i++) 12 { 13 scanf("%c", &a[i]); 14 if (a[i] == '\n') 15 { 16 break; 17 } 18 count++; 19 } 20 if(count!=0)break; 21 } 22 while (count == 0); 23 for(i=0;i<count;i++){ 24 if(a[i]>='A'&&a[i]<='F'){ 25 a[i]=a[i]+32; 26 } 27 } 28 for(i=0;i<count;i++){ 29 if(panduan2(a,count,sign)){ 30 sign++; 31 printf("出错了,重新输入一遍吧\n"); 32 goto L; 33 } 34 for(i=0;i<count;i++) 35 b[i]=a[i]; 36 b[i]='\0'; 37 } 38 printf("输入此整数的进制:\n"); 39 scanf("%d", &n); 40 ch=getchar(); 41 while(panduan1(n,a,count,sign)) 42 { 43 printf("出错了,重新输入一遍吧!\n"); 44 scanf("%d", &n); 45 } 46 sign=0; 47 printf("输入想要转化成的进制\n"); 48 scanf("%d",&m); 49 while(m!=2&&m!=8&&m!=10&&m!=16) 50 { 51 printf("出错了,重新输入一遍吧!\n"); 52 scanf("%d", &m); 53 } 54 printf("转换成功:"); 55 change(n,b,m,count); 56 }
四:思维导图
五:问题与解决
1,在编写程序之前,对二进制,八进制,十进制和十六进制间的互相转化计算并不非常明白,所以先要去查询课本和网上计算方法,先搞明白各个进制数之间是如何转化的,才可以开始编写程序,在网上了解到,先把想要转化的数转化成一个十进制数,因为十进制数进行进制转化时的计算较为简单,所以按这种思路去编写程序比较容易。
2,运用函数是并没有分清需要返回值和不需要返回值的用法,多次在int,double之间徘徊,后来通过询问同学了解到不需要返回值的函数应该使用void,还是因为pta题刷太少,遇到的都是需要返回值的题目,再加上自己为了做题而做题,没有深入的去了解,造成知识的空缺。
3,刚学习数组的应用,对数组的用法还不是非常了解和熟练,并不懂得可以输入字符串数组等等的操作,再通过查询网络资料和请教同学之后,才逐渐完善了对这方面知识的不足。
六:代码互评
网络1914宋思坡
1 if(c>=2) 2 l++; 3 y/=10; 4 s10=s10+c*pow(2,i); 5 i++; 6 } 7 y=s10; 8 i=0; 9 while(y!=0){ 10 c=y%8; 11 y/=8; 12 s8=s8+c*pow(10,i); 13 i++; 14 } 15 if(l==0){ 16 printf("二进制转为\n"); 17 printf("八进制:%d\n十进制:%d\n",s8,s10); 18 } 19 else 20 printf("这个输入是错的鸭"); 21 }
他的判断输入的数是否正确的代码比较简洁明了,不像我一样又写了两个函数,效率较高,而且他的判断放在main函数中,写起来也更加方便,快捷有效的编写程序是非常值得学习的。
七:总结
1,编写一个可以使用的程序真是难难难,需要多方面的知识做基础,如果在编写过程中遇到各种各样的问题,一定要先自己解决,不管是翻书还是查询网络资料,都要先自己尝试,不能问别人,实在是搞不懂,再去请教别人,这次作业也让我学会了遇事先靠自己,比如在进制之间的转化知识方面,我就理解的不够透彻,所以自己在网上查找资料,自己拿笔纸演算,一步步摸索出计算规律,才能完成此次作业。
2,对于函数,它的用法真是多种多样,只有你想不到,没有它用不到,函数里的嵌套递归等用法,功能非常强大,可以做到许多运算,灵活运用函数可以使你的程序发挥更大的能力。