一.程序运行截图(仅列举部分)
正数:
(1)10->8
(连续五次不输入程序会自动结束哦)
(2)10->2
(3)16->10
(4)8->16
负数:
(1)10->2
(2)10->2
(3)8->16
二.扩展功能
1.可以识别正负数并输出,当输出为二进制时会自动将其补为有符号位的八位或十六位。
2.能在2至16所有进制间任意转换;
3输入错误时会报错并让你重新输入;
4.加了一个没卵用的随机数来使最后一句话随机输出。
三.介绍函数及其使用的全局变量对应的功能和作用
(1)radix函数
int radix(int n,char x[],int count) { int i; for(i=0;i<count;i++){ if(n!=2&&n!=3&&n!=4&&n!=5&&n!=6&&n!=7&&n!=8&&n!=9&&n!=10&&n!=11&&n!=12&&n!=13&&n!=14&&n!=15&&n!=16) return 1; if(x[i]>='a'&&x[i]<='f') x[i]-=87; if(x[i]>='0'&&x[i]<='9') x[i]-=48; if(x[i]>=n)return 1; } return 0; }
函数功能:判断使用者输入的数和其输入的该数的进制是否匹配。
全局变量:n(存放使用者输入的进制)
x[](逐个字符逐个字符存放使用者输入的数)
count(统计使用者输入数的位数)
(2)luanqibazao函数
int luangqibazao(char x[],int count) { int i,flag; flag=count; for(i=0;i<count;i++){ if(x[i]>='a'&&x[i]<='f') flag--; if(x[i]>='0'&&x[i]<='9') flag--; } if(flag==0) return 0; return 1; }
函数功能:判断使用者输入的数是不是一些乱七八糟的东西(如asd、123g、???>之类的)
全局变量:见radix函数中全局变量的介绍。
(3)change_函数
void change_(int n,char b[],int m,int count,int fu) { int i,j,k=0,num,sum=0,d,SUM,lan,len; char c[1001]; for(i=0;b[i]!='\0';i++) { if(b[i]>='0'&&b[i]<='9') num=b[i]-'0'; else num=b[i]-'a'+10; sum=sum*n+num; } SUM=sum; while(sum) { d=sum%m; c[k++]="0123456789abcdef"[d]; sum/=m; } len=strlen(c); if(fu==0){ if(m!=2){ for(i=k-1;i>=0;i--) { if(c[i]>='0'&&c[i]<='9') printf("%d",c[i]-'0'); else printf("%c",c[i]); } printf("\n"); } if(m==2){ if(SUM<=127&&SUM>=-127) { printf("b1\n"); lan=8-len; for(i=0;i<lan;i++) printf("0"); for(i=k-1;i>=0;i--) { if(c[i]>='0'&&c[i]<='9') printf("%d",c[i]-'0'); else printf("%c",c[i]); } printf("\n"); } if(SUM==128){ printf("10000000\n"); } if(SUM<-128||SUM>128){ lan=16-len; for(i=0;i<lan+3;i++) printf("0"); for(i=k-1;i>=0;i--) { if(c[i]>='0'&&c[i]<='9') printf("%d",c[i]-'0'); else printf("%c",c[i]); } printf("\n"); } } }else{ if(m!=2){ printf("-"); for(i=k-1;i>=0;i--) { if(c[i]>='0'&&c[i]<='9') printf("%d",c[i]-'0'); else printf("%c",c[i]); } printf("\n"); } if(m==2){ if(SUM<=127&&SUM>=-127){ lan=7-len; printf("1"); for(i=0;i<lan;i++) printf("0"); for(i=k-1;i>=0;i--) { if(c[i]>='0'&&c[i]<='9') printf("%d",c[i]-'0'); else printf("%c",c[i]); } printf("\n"); } if(SUM==-128){ printf("10000000\n"); } if(SUM<-128||SUM>128){ lan=15-len; printf("1"); for(i=0;i<lan+3;i++) printf("0"); for(i=k-1;i>=0;i--) { if(c[i]>='0'&&c[i]<='9') printf("%d",c[i]-'0'); else printf("%c",c[i]); } printf("\n"); } } } }
函数功能:将输入的数由n进制转化为十进制,在把十进制按需求转化为m进制。
全局变量:b[ ](由字符型数组x[]转化而来的字符串数组,用于简化n进制转化为十进制的计算)
fu (用于判断输入数的正负,来决定change_函数的执行分支)
m (存放使用者想要转化的进制)
其余见radix函数。
四.main函数展示
int main() { printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>卍进制转换器卍<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n"); printf(" PS:只能进行二~十六进制间任意转换哦!\n"); printf(" 再PS:输出的二进制的首位是符号位哦!(+-128除外)\n"); printf("***********************************************************************************************************************\n"); int m, i, count =0,n,flag=0,joy,fu=0,len; srand((unsigned) (time(NULL))); joy=rand()%4; int wrong = 0; static char x[1000],ch,b[1001]; L:count=0; do { printf("输入你要转换的数吧!0.<\n"); for (i = 0; i < 1000; i++) { scanf("%c", &x[i]); if (x[i] == '\n') { wrong++; break; } count++; } if(count!=0)break; if (wrong == 3) printf("快点输入啦!\n"); if (wrong == 4) printf(">.<再不输入我就退出了╯^╰\n"); if (wrong == 5){ printf("\n"); return 0;} } while (count == 0); if(x[0]=='-'){ for(i=1;i<count;i++) x[i-1]=x[i]; count--; fu=1; } for(i=0;i<count;i++){ if(x[i]>='A'&&x[i]<='F'){ x[i]=x[i]+32; } } for(i=0;i<count;i++){ if(luangqibazao(x,count)){ printf("你这输的啥啊,重输一遍吧\n"); goto L; } for(i=0;i<count;i++) b[i]=x[i]; b[i]='\0'; } wrong = 0; printf("那你这个数是啥进制的呢?\n"); scanf("%d", &n); ch=getchar(); if(n!=2&&n!=3&&n!=4&&n!=5&&n!=6&&n!=7&&n!=8&&n!=9&&n!=10&&n!=11&&n!=12&&n!=13&&n!=14&&n!=15&&n!=16){ printf("标题啊标题,你不看标题就开始输入了吗?(?`^′?)?\n"); wrong++; flag=1; } while(radix(n,x,count)) { if(wrong==2||flag==0)printf("你这进制写错了吧?再检查看看呗!\n"); if(wrong==3)printf("还是不对啊\n"); if(wrong==4)printf("唉又错了!你走点心啊!\n"); if(wrong==5)printf("你是认真的吗?\n"); if(wrong>5)printf("。。。。。。。。。。。。。。\n"); printf("重新输入一遍吧!>.0\n"); if(scanf("%d", &n)!=-1){ getchar(); goto H; } H:wrong++; }; wrong=0; printf("你想把它变成什么进制呢?\n"); scanf("%d",&m); while(m!=2&&m!=3&&m!=4&&m!=5&&m!=6&&m!=7&&m!=8&&m!=9&&m!=10&&m!=11&&m!=12&&m!=13&&m!=14&&m!=15&&m!=16){ if(wrong==0)printf("你要的进制我转换不了啦!\n"); if(wrong==1)printf("真的转换不了啦!\n"); if(wrong==2)printf("哎呀我说不行就不行啦!!!\n"); if(wrong==3)printf("╭(╯^╰)╮你怎么就不信呢....\n"); if(wrong>3)printf("...............\n"); printf("重新输入一遍吧!>.0\n"); m=0; if(scanf("%d", &m)!=-1){ getchar(); goto M; } M:wrong++; }; printf("当当当!转换成功\ω/:"); change_(n,b,m,count,fu); if(joy==0) printf("哼哼哼≧ω≦,没想到我这么快吧?\n"); if(joy==1) printf("啊哈哈哈哈哈哈>0<这也太简单了吧!\n"); if(joy==2) printf("这么简单的题目,真无趣( > c < )\n"); if(joy==3) printf("嘿嘿嘿,怎么样,快夸夸我吧?>.<\n"); }
五.思维导图
六.遇到的问题
1.问题:在if函数括号内使用&&,发现程序运行始终不进入该if函数。
解决方案:上网仔细查询了&&、||、!、|、&等符号用法,发现是错将||用成了&&,更改后问题解决。
2.问题:在void函数内部定义了一个较大数组,编译无错误也无警告,其他地方也正常,但该函数就是没有输出。
解决方案:百度后了解到,函数则定义大数组易导致栈溢出,将该数组定义到主函数后,问题解决。
3.制作的判断是否输入错误的程序在第一次输入错误后,第二次必定正确。
解决方案:仔细检查后发现是一个重要标识数据未清零,设置清零程序后问题解决。
4.问题:输入一个%d的数后,后面的scanf("%c",&a)自动跳过,以百分号d输出a得到10。
解决方案:百度后得知是因为前一个输入完成的回车键\n被下一个scanf读取,在前一个后加 ch=getchar();后问题解决。
七.代码互评(郭其松)
if (judge2,8,10(a, n)) { printf("该数字的二进制数为:"); chageeverything(changeten(a, n), 2); printf("\n"); printf("该数字的十进制数为:%d\n", changeten(a, n)); printf("该数字的十六进制数为:"); chageeverything(changeten(a, n), 16); break; }
这个程序我一眼望过去以为是递归,不过仔细一看发现他是把一个函数作为另一个函数的参数,这种方法我还是第一次接触。
显然这样写可以在一定程度上使主程序变得简洁明了,而且,整体来说,他主程序的排版和我的相比看起来要更舒服一些,没有凌乱的感觉。这值得我学习。
if (judge2,8,10(a, n)) { printf("该数字的八进制数为:"); chageeverything(changeten(a, n), 8); printf("\n"); printf("该数字的十进制数为:%d\n", changeten(a, n)); printf("该数字的十六进制数为:"); chageeverything(changeten(a, n), 16); break; } else { printf("您输入的数不符合要求哦,请重新输入\n感谢您的使用"); break; } }
不过在输入错误后,他的程序似乎并不能返回让用户重新输入,这点我应该做得要更好一些。
八.总结
(1)收获
增强了通过百度解决问题的能力。
对数组、字符串、字符有了更深刻的了解。
对C语言中的逻辑字符有了更深刻的认识。
(2)对函数的认识
函数是工具。
在C语言编程中恰当的使用函数,可以让你在编程时思路更清晰,使你的程序排版更整洁,更容易让人读懂。
熟练的、正确的使用这个工具,能让你的编程之路更加轻松。