admin管理员组

文章数量:1794759

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

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文件)点击下载

本文标签: 计算器寒假语言文件exe