进制计算器,有的网页有这种功能,但是,有时候网页打不开,或者本地网络太差。这个付一个网页在线进制转换
所以不如自己编一个进制转化的工具,C语言本来不属于可视化编程,但是它产生的exe文件就足以满足这个要求了。
先看一下效果图:
整体看起来还可以,做了一个小细节,就是二进制显示的时候,每四个之间有一个空格,方便查看,就和显示金额一样。
下面解释一下源代码,并在最后附上工程文件下载地址(我使用的是vc6.0)
下面提供我的一种思路(比较这种东西思路有很多很多,我的虽然不不简洁,但可以完美运行。)
首先我们比较熟悉的是十进制转化为其他进制的方法(不了解百度)所以首先我们写一个十进制转化为任意进制的子函数
void ten_use_what(int what,long int use)//what是为转化为多少进制;use是十进制数。
{
char sbuff[50],i=0,n=0,p=0;
while(use)
{
sbuff[i]=use%what+'0';
if(use%what>9)
{
sbuff[i]=use%what+55;
}
use=use/what;
i++;
if(what==2)
{
if(!((i-p)%4))
{p++;
sbuff[i]=' ';
i++;
}
}
}
i--;
switch (what)//判断需要转化的进制最后分别存放在这个数组里面。
{
case 2:{while(i!=(-1)){two[n]=sbuff[i];sbuff[i]='\0';n++;i--;}}break;
case 8:{while(i!=(-1)){eight[n]=sbuff[i];sbuff[i]='\0';n++;i--;}}break;
case 10:{while(i!=(-1)){ten[n]=sbuff[i];sbuff[i]='\0';n++;i--;}}break;
case 16:{while(i!=(-1)){sixteen[n]=sbuff[i];sbuff[i]='\0';n++;i--;}}break;
}
use_use=0;
}
上面这个函数是基础,有了这个函数之后,我们就可以把任意进制先转化为十进制,然后调用十进制转化函数,就可以实现任意进制转任意进制的方法了。
下面是任意进制转任意进制的函数。
void what_to_what(int what1,int what)//what1是输入数,what是需要转化的进制
{
int i=0,n=0;
i=strlen(number)-1;
while(i!=(-1))
{
if(number[i]<='9')
use_use=use_use+(number[i]-48)*pow(what1,n);
else if(number[i]<=70)
use_use=use_use+(number[i]-55)*pow(what1,n);
else
use_use=use_use+(number[i]-87)*pow(what1,n);
n++;
i--;
}
ten_use_what(what,use_use);
}
这里有必要说明一下十六进制,因为十六进制使用到了字母,而字母的ASCII码和数字又不相邻,所以需要做一下判断。在本设计里面,你输入的十六进制可以是大写字母,也可以是小写字母。
在接下面就是判断一下输入的数据是否符合要求
int panduan()
{
if(((number[0]=='c')||(number[0]=='C'))&&((number[1]=='l')||(number[1]=='L'))&&((number[2]=='c')||(number[2]=='C')))
return 3;
switch (type)
{
case 0:return 4;
case 2:{for(int i=0;number[i];i++){if(number[i]>'1'||number[i]<'0'){return 0;}}return 1;}
case 8:{for(int i=0;number[i];i++){if(number[i]>'7'||number[i]<'0'){return 0;}}return 1;}
case 10:{for(int i=0;number[i];i++){if(number[i]>'9'||number[i]<'0'){return 0;}}return 1;}
case 16:{for(int i=0;number[i];i++){if(!((number[i]<='9' && number[i]>='0')||(number[i]<='z' && number[i]>='a')||(number[i]<='Z' && number[i]>='A'))){return 0;}}return 1;}
default:return 2;
}
}
然后是键盘输入的函数,我们是需要处理一下的。
char number[50],two[50],eight[50],ten[50],sixteen[50];
int type;
long int use_use;
void scanf_key()
{
int i;
char q[5];
scanf("%s",&number);
for(i=0;number[i];i++)
{
if(number[i]==','||number[i]=='.')
{
q[0]=number[i+1];
q[1]=number[i+2];
number[i]='\0';
number[i+1]='\0';
number[i+2]='\0';
}
}
sscanf(q,"%d",&type);
}
还有一个清除所有变量的函数,就是为了下一次调用时候不收上一次的干扰
void clc()
{
memset(number,'\0',sizeof(number));
memset(two,'\0',sizeof(two));
memset(eight,'\0',sizeof(eight));
memset(ten,'\0',sizeof(ten));
memset(sixteen,'\0',sizeof(sixteen));
type=0;
use_use=0;
}
最后是主函数,我还加了一个清屏的功能,只要输入了clc就可以清屏
void main()
{
printf("\n请输入:“一个数,该数进制”并回车\n(注意:中间为英文逗号(或用.隔开),不要有多余空格)\n(如:101010,二进制数,则输入:“101010,2回车”)\n目前支持2进制、8进制、10进制、16进制数之间的转换\n\n");
while(1)
{
printf("**********进制转化工具**********Thank you for using**********Belong to fan**********\n\n");
scanf_key();
switch(panduan())
{
case 1:
{
what_to_what(type,2);
what_to_what(type,8);
what_to_what(type,10);
what_to_what(type,16);
printf("\n输入的数为:%s, %d进制\n",number,type);
printf("\n2进制为:%s\n",two);
printf("\n8进制为:%s\n",eight);
printf("\n10进制为:%s\n",ten);
printf("\n16进制为:%s\n\n",sixteen);
printf("输入“clc回车”可清屏\n\n");
}
break;
case 0:
printf("\n输入有误:%s 不是一个%d进制数。请重新输入。\n\n",number,type);printf("输入“clc回车”可清屏\n\n");break;
case 2:
printf("\n输入有误:目前仅支持2进制、8进制、10进制、16进制数之间的转换。请重新输入。\n\n",number,type);printf("输入“clc回车”可清屏\n\n");break;
case 3:
system("cls");printf("\n请输入:“一个数,该数进制”并回车\n(注意:中间的逗号为英文逗号,不要有多余空格)\n(如:101010,二进制数,则输入:“101010,2回车”)\n\n");break;
case 4:
printf("\n输入格式有误,请按规范输入\n\n");break;
}
clc();
}
}
还有我的全局变量和头文件
#include
#include
#include
#include
char number[50],two[50],eight[50],ten[50],sixteen[50];
int type;
long int use_use;
介绍完了,这个在提供一下工程文件下载的地址(里面有exe文件)点击下载