热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:2~16进制间任意进制转换器

一.程序运行截图(仅列举部分)正数:

一.程序运行截图(仅列举部分)

正数:

(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){
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){
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]!=;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(
"
");
}
if(m==2){
if(SUM<=127&&SUM>=-127)
{
printf(
"b1
");
lan
=8-len;
for(i=0;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(
"
");
}
if(SUM==128){
printf(
"10000000
");
}
if(SUM<-128||SUM>128){
lan
=16-len;
for(i=0;i3;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(
"
");
}
}
}
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(
"
");
}
if(m==2){
if(SUM<=127&&SUM>=-127){
lan
=7-len;
printf(
"1");
for(i=0;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(
"
");
}
if(SUM==-128){
printf(
"10000000
");
}
if(SUM<-128||SUM>128){
lan
=15-len;
printf(
"1");
for(i=0;i3;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进制转化为十进制,在把十进制按需求转化为m进制。

全局变量:b[ ](由字符型数组x[]转化而来的字符串数组,用于简化n进制转化为十进制的计算)

     fu (用于判断输入数的正负,来决定change_函数的执行分支)

     m (存放使用者想要转化的进制)

     其余见radix函数。

四.main函数展示

int main()
{
printf(
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>卍进制转换器卍<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
");
printf(
"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
");
printf(
" PS:只能进行二~十六进制间任意转换哦!
");
printf(
" 再PS:输出的二进制的首位是符号位哦!(+-128除外)
");
printf(
"***********************************************************************************************************************
");
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.<
");
for (i = 0; i <1000; i++)
{
scanf(
"%c", &x[i]);
if (x[i] ==
)
{
wrong
++;
break;
}
count
++;
}
if(count!=0)break;
if (wrOng== 3)
printf(
"快点输入啦!
");
if (wrOng== 4)
printf(
">.<再不输入我就退出了╯^╰
");
if (wrOng== 5){
printf(
"
");
return 0;}
}
while (count == 0);
if(x[0]==-){
for(i=1;i)
x[i-1]=x[i];
count
--;
fu
=1;
}
for(i=0;i){
if(x[i]>=A&&x[i]<=F){
x[i]
=x[i]+32;
}
}
for(i=0;i){
if(luangqibazao(x,count)){
printf(
"你这输的啥啊,重输一遍吧
");
goto L;
}
for(i=0;i)
b[i]=x[i];
b[i]
=;
}
wrong
= 0;
printf(
"那你这个数是啥进制的呢?
");
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(
"标题啊标题,你不看标题就开始输入了吗?(?`^′?)?
");
wrong
++;
flag
=1;
}
while(radix(n,x,count))
{
if(wrOng==2||flag==0)printf("你这进制写错了吧?再检查看看呗!
");
if(wrOng==3)printf("还是不对啊
");
if(wrOng==4)printf("唉又错了!你走点心啊!
");
if(wrOng==5)printf("你是认真的吗?
");
if(wrong>5)printf("。。。。。。。。。。。。。。
");
printf(
"重新输入一遍吧!>.0
");
if(scanf("%d", &n)!=-1){
getchar();
goto H;
}
H:wrong
++;
};
wrong
=0;
printf(
"你想把它变成什么进制呢?
");
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("你要的进制我转换不了啦!
");
if(wrOng==1)printf("真的转换不了啦!
");
if(wrOng==2)printf("哎呀我说不行就不行啦!!!
");
if(wrOng==3)printf("╭(╯^╰)╮你怎么就不信呢....
");
if(wrong>3)printf("...............
");
printf(
"重新输入一遍吧!>.0
");
m
=0;
if(scanf("%d", &m)!=-1){
getchar();
goto M;
}
M:wrong
++;
};
printf(
"当当当!转换成功ω/:");
change_(n,b,m,count,fu);
if(joy==0)
printf(
"哼哼哼≧ω≦,没想到我这么快吧?
");
if(joy==1)
printf(
"啊哈哈哈哈哈哈>0<这也太简单了吧!
");
if(joy==2)
printf(
"这么简单的题目,真无趣( > c <)
");
if(joy==3)
printf(
"嘿嘿嘿,怎么样,快夸夸我吧?>.<
");
}

 

 

五.思维导图

技术图片

 

 

 六.遇到的问题

1.问题:在if函数括号内使用&&,发现程序运行始终不进入该if函数。

解决方案:上网仔细查询了&&、||、!、|、&等符号用法,发现是错将||用成了&&,更改后问题解决。

2.问题:在void函数内部定义了一个较大数组,编译无错误也无警告,其他地方也正常,但该函数就是没有输出。

解决方案:百度后了解到,函数则定义大数组易导致栈溢出,将该数组定义到主函数后,问题解决。

3.制作的判断是否输入错误的程序在第一次输入错误后,第二次必定正确。

解决方案:仔细检查后发现是一个重要标识数据未清零,设置清零程序后问题解决。

4.问题:输入一个%d的数后,后面的scanf("%c",&a)自动跳过,以百分号d输出a得到10。

解决方案:百度后得知是因为前一个输入完成的回车键
被下一个scanf读取,在前一个后加 ch=getchar();后问题解决。

七.代码互评(郭其松)

 

if (judge2,810(a, n))
{
printf(
"该数字的二进制数为:");
chageeverything(changeten(a, n),
2);
printf(
"
");
printf(
"该数字的十进制数为:%d
", changeten(a, n));
printf(
"该数字的十六进制数为:");
chageeverything(changeten(a, n),
16);
break;
}

 

这个程序我一眼望过去以为是递归,不过仔细一看发现他是把一个函数作为另一个函数的参数,这种方法我还是第一次接触。

显然这样写可以在一定程度上使主程序变得简洁明了,而且,整体来说,他主程序的排版和我的相比看起来要更舒服一些,没有凌乱的感觉。这值得我学习。

if (judge2,810(a, n))
{
printf(
"该数字的八进制数为:");
chageeverything(changeten(a, n),
8);
printf(
"
");
printf(
"该数字的十进制数为:%d
", changeten(a, n));
printf(
"该数字的十六进制数为:");
chageeverything(changeten(a, n),
16);
break;
}
else
{
printf(
"您输入的数不符合要求哦,请重新输入
感谢您的使用
");
break;
}
}

不过在输入错误后,他的程序似乎并不能返回让用户重新输入,这点我应该做得要更好一些

八.总结

(1)收获

增强了通过百度解决问题的能力

对数组、字符串、字符有了更深刻的了解。

对C语言中的逻辑字符有了更深刻的认识。

 

(2)对函数的认识

 

 

 

 

 函数是工具。

在C语言编程中恰当的使用函数,可以让你在编程时思路更清晰,使你的程序排版更整洁,更容易让人读懂。

熟练的、正确的使用这个工具,能让你的编程之路更加轻松。

 

 

 

 

 

 

 

 

 

 

 

 

技术图片

 


推荐阅读
author-avatar
拥有一YY_373
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有