C语言写的一个简单的计算器
2016-01-07 15:02
555 查看
大学的第一学期就这样结束了。前阵子临近放假,不知道该干嘛,就分别用java和C语言写了两个东西。java写了个文件查找的程序。C语言写了个简易的计算器。至于为什么写计算器~因为刚学C语言的时候,还没摸过VC,还没碰过编译器就看了几个简单的加减乘除的计算代码。然后就自己想了下,写了段自己认为正确。却不知道错误百出的代码,还发到了论坛。问别人对不对。可是却给论坛的那些"大神"们喷的体无完肤那叫一个惨啊。我记得他们说:"你void main()你就return 0........;"后面还有很多。反正把我这个新手说的差点放弃了。还好我心理够强大!然后前前阵子也是闲着无聊自己想了个计算器的伪算法。一直在那放着没有去尝试。于是就是前阵子试了下。发现还是可以的。但是不支持括号运算。(尝试了好久没有实现。。毕竟算法都只是自己想出来的简单suanf...)
/*********************************************************************
源代码区域
********************************************************************/
代码中的这些注释代码如://printf("此时的符号为。。。");这是编写过程中为了找到错误而写的。没有去删除。觉得这样调试挺不错的。
这个计算器非常简易,只能计算整数。不支持括号运算。 计算也不是百分百正确。因为有些计算会出现小数结果。
/*********************************************************************
源代码区域
********************************************************************/
#include #include #include char ch={0};//单个字符 int numarr[30];//存放最终计算的数字的数组(Number array) int num_i=0;//(Number index) int fn=0;//存放最终的结果(finish number) char tnsarr[30];//存放数字字符的临时字符串数组(Temporary Number String Array) int tnsa_i=0;//上面数组的下标(Temporary number string array index) char jsarr[30];//存放+-字符的临时字符串数组(jia/jian string array) int jsa_i=0;//上面数组的下标(jia/jian string array index) int tcnarr[30];//存放乘除数字的临时整型数组(Temporary cheng/chu number array) int tcna_i=0;//上面数组的下标(Temporary cheng/chu number array index) char csarr[30];//存放*/字符的临时字符串数组(cheng/chu string array) int csa_i=0;//上面数组的下标(cheng/chu string array index) int isj=0;//是否执行过乘除操作的标志。如果是则值为1,否则为0 int tfn=0;//所有乘除的积或商 /*函数声明*/ void Count(void);//主要函数,用于获取用户输入和判断用户输入以调用其他函数执行操作 void setJstr(void);//处理用户输入的'+'和'-' void setCstr(void);//处理用户输入的'*'和'/' void setKstr(void);//处理用户输入的'('和')' void setNumberstr(char ch);//处理数字 void iniTsarr(void);//初始化临时数字字符串数组 void countC();//计算所有乘除的和 void inic();//初始化乘除操作 void finish(void);//最后调用该函数,将计算结果赋给fn变量 void iniAll(void);//初始化所有变量。让程序可以重复运行 int main(void) { /*C语言简易计算器 * 2015年12月30日20:52:41 * */ system("cls"); printf("********************C语言简易计算器********************\n| 时间:2015年12月30日20:52:41 |\n| e 结束运行 |\n| 操作符: |\n| +(加) |\n| -(减) |\n| *(乘) |\n| /(除) |\n*******************************************************\n"); while(1) { printf(" "); Count(); if('\0'!=tnsarr[0]||'\0'!=jsarr[0])//如果发现这两个字符数组有一个为空,则认为用户什么都没有输入 { printf("= %d\n",fn); } //初始化所有变量 iniAll(); } return 0; } void Count() { /*计算*/ while(1)//如果用户输入回车则停止获取 { ch=getch(); if('*'==ch||'/'==ch){ //处理*/ setCstr(); } if('+'==ch||'-'==ch) //处理+- setJstr(); if(ch>=48&&ch<=57) //处理数字 setNumberstr(ch); if('e'==ch)//退出程序 exit(0); //计算机结果(跳出循环获取键盘) if('='==ch||'\r'==ch) { numarr[num_i]=atoi(tnsarr);//将临时字符串中的数字转换成整型数字赋给主数组 ++num_i; //iniTsarr(); // printf("this3"); break; } } finish();//最终计算 // printf("this4"); return ; } //处理加减 void setJstr(){ /*处理+-,将+-存入字符数组*/ printf("%c",ch); //printf("\n执行setJstr\n"); if(0==isj)//isj只能生效一次。一次过后又回到0的状态。因为下面的代码 { numarr[num_i]=atoi(tnsarr);//将临时字符串中的数字转换成整型数字赋给主数组 ++num_i; } isj=0; iniTsarr();//清空临时数组 jsarr[jsa_i]=ch; ++jsa_i; return; } //处理乘除 void setCstr() { printf("%c",ch); tcnarr[tcna_i]=atoi(tnsarr);//将*号前的数字赋给临时整型数组 ++tcna_i; iniTsarr();//初始化tnsarr数组 csarr[csa_i]=ch;//将*或/符号赋给临时字符数组 ++csa_i; /*********************************/ //printf("\n(%d)\n",tcnarr[tcna_i-1]); // printf("\n(%c)\n ",csarr[csa_i-1]); /*********************************/ countC(); //printf("\n跳出刚刚的函数\n"); return; } void countC(){ //printf("\n执行countC\n"); while(1) { ch=getch(); if(ch>=48&&ch<=57) setNumberstr(ch); if('*'==ch||'/'==ch) { setCstr(); return; } if('='==ch||'\r'==ch||'+'==ch||'-'==ch) { /***********************************************************/ tcnarr[tcna_i]=atoi(tnsarr);//将*号前的数字赋给临时整型数组 ++tcna_i; /***********************************************************/ int i; tfn=tcnarr[0]; //printf("\n此时的tcna_i=%d\n",tcna_i); for(i=0;i<tcna_i;++i) { // printf("\n此时的符号=%c\n",csarr[i]); if('*'==csarr[i]) { // printf("\n此时的tfn=%d\n",tfn); // printf("\n此时的tcnarr[i]=%d\n",tcnarr[i]); // printf("\n此时的tcnarr[i+1]=%d\n",tcnarr[i+1]); tfn*=tcnarr[i+1]; } if('/'==csarr[i]) tfn/=tcnarr[i+1]; } isj=1; break; } } // printf("tfn=%d",tfn); numarr[num_i]=tfn; ++num_i; inic();//初始化乘除操作 //printf("\n执行zuihou\n"); return; } /*处理数字*/ void setNumberstr(char c){ printf("%c",ch); tnsarr[tnsa_i]=c; ++tnsa_i; return; } //初始化临时数字字符串数组 void iniTsarr() { tnsa_i=0; memset(tnsarr,'\0',30*sizeof(char)); return; } //计算结果 void finish() { int i=0; fn=numarr[0]; // printf("\n执行finish\n"); for(i=0;i<num_i;++i) { if('+'==jsarr[i]) { // printf("加\n"); //printf("此时的number%d\n",numarr); // printf("此时的numarr[i]%d\n",numarr[i]); // printf("此时的numarr[i+1]%d\n",numarr[i+1]); fn+=numarr[i+1]; } if('-'==jsarr[i]) { // printf("减\n"); //printf("此时的number%d\n",number); // printf("此时的numarr[i]%d\n",numarr[i]); // printf("此时的numarr[i+1]%d\n",numarr[i+1]); fn-=numarr[i+1]; } } return; } void iniAll(void) { memset(numarr,0,sizeof(int)*30);//存放最终计算的数字的数组(Number array) num_i=0;//(Number index) fn=0;//存放最终的结果(finish number) memset(tnsarr,'\0',sizeof(char)*30);//存放数字字符的临时字符串数组(Temporary Number String Array) tnsa_i=0;//上面数组的下标(Temporary number string array index) memset(jsarr,'\0',sizeof(char)*30);//存放+-字符的临时字符串数组(jia/jian string array) jsa_i=0;//上面数组的下标(jia/jian string array index) //int t_num_array[30];//存放数字字符的临时字符串数组 //int t_num_index=0;//上面数组的下标 memset(csarr,'\0',sizeof(char)*30);//存放*/字符的临时字符串数组(cheng/chu string array) csa_i=0;//上面数组的下标(cheng/chu string array index) isj=0; return; } //初始化乘除操作 void inic() { memset(tcnarr,0,sizeof(int)*30);//存放乘除数字的临时整型数组(Temporary cheng/chu number array) tcna_i=0;//上面数组的下标(Temporary cheng/chu number array index) memset(csarr,0,sizeof(char)*30);//存放*/字符的临时字符串数组(cheng/chu string array) csa_i=0;//上面数组的下标(cheng/chu string array index) tfn=0; return; }
代码中的这些注释代码如://printf("此时的符号为。。。");这是编写过程中为了找到错误而写的。没有去删除。觉得这样调试挺不错的。
这个计算器非常简易,只能计算整数。不支持括号运算。 计算也不是百分百正确。因为有些计算会出现小数结果。