您的位置:首页 > 编程语言 > C语言/C++

C语言写的一个简单的计算器

2016-01-07 15:02 555 查看
大学的第一学期就这样结束了。前阵子临近放假,不知道该干嘛,就分别用java和C语言写了两个东西。java写了个文件查找的程序。C语言写了个简易的计算器。至于为什么写计算器~因为刚学C语言的时候,还没摸过VC,还没碰过编译器就看了几个简单的加减乘除的计算代码。然后就自己想了下,写了段自己认为正确。却不知道错误百出的代码,还发到了论坛。问别人对不对。可是却给论坛的那些"大神"们喷的体无完肤那叫一个惨啊。我记得他们说:"你void main()你就return 0........;"后面还有很多。反正把我这个新手说的差点放弃了。还好我心理够强大!然后前前阵子也是闲着无聊自己想了个计算器的伪算法。一直在那放着没有去尝试。于是就是前阵子试了下。发现还是可以的。但是不支持括号运算。(尝试了好久没有实现。。毕竟算法都只是自己想出来的简单suanf...)



/*********************************************************************

源代码区域

********************************************************************/

#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("此时的符号为。。。");这是编写过程中为了找到错误而写的。没有去删除。觉得这样调试挺不错的。

这个计算器非常简易,只能计算整数。不支持括号运算。 计算也不是百分百正确。因为有些计算会出现小数结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 计算器 编程