C语言实现进制计算器,生成exe文件可方便使用(大三寒假)

进制计算器,有的网页有这种功能,但是,有时候网页打不开,或者本地网络太差。这个付一个网页在线进制转换
所以不如自己编一个进制转化的工具,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<stdio.h>
#include <string.h>
#include <math.h>
#include <windows.h>


char number[50],two[50],eight[50],ten[50],sixteen[50];
int type;
long int use_use;

介绍完了,这个在提供一下工程文件下载的地址(里面有exe文件)点击下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值