c语言制作简单的计算器

#include<stdio.h> 
#include<stdlib.h>
#include<memory.h>
char ch={0};//单个字符
int numarr[30];//存放最终计算的数字的数组
int num_i=0;
int fn=0;//存放最终的结果
char tnsarr[30];//存放数字字符的临时字符串数组
int tnsa_i=0;//上面数组的下标
char jsarr[30];//存放+-字符的临时字符串数组
int jsa_i=0;//上面数组的下标
int tcnarr[30];//存放乘除数字的临时整型数组
int tcna_i=0;//上面数组的下标
char csarr[30];//存放*/字符的临时字符串数组
int csa_i=0;//上面数组的下标
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)
{

    system("cls");
	printf("********************C语言简易计算器********************\n");
	printf("|                     e 结束运行                       |\n");
	printf("|                       +(加)                          |\n");
	printf("|                       -(减)                          |\n");
	printf("|                       *(乘)                          |\n");
	printf("|                       /(除)                          |\n");
	printf("*******************************************************\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;
     		break;

		} 
	}
	finish();//最终计算
	return ;

}
//处理加减
void setJstr()
{
	/*处理+-,将+-存入字符数组*/
	printf("%c",ch);
	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;
	countC();
	return;
}
void countC()
{
	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];
			for(i=0;i<tcna_i;++i)
			{
    			if('*'==csarr[i])
			    	{
					tfn*=tcnarr[i+1];
					}
				if('/'==csarr[i])
					tfn/=tcnarr[i+1];
			}
			isj=1;
			break;
		}
	}
    	numarr[num_i]=tfn;
		++num_i;
		inic();//初始化乘除操作
		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];
	for(i=0;i<num_i;++i)
	{
		if('+'==jsarr[i])
		{
			fn+=numarr[i+1];
		}
		if('-'==jsarr[i])
		{
			fn-=numarr[i+1];
		}
	}
	return;	
}
void iniAll(void)
{
	memset(numarr,0,sizeof(int)*30);//存放最终计算的数字的数组
	num_i=0;//(Number index)
	fn=0;//存放最终的结果
	memset(tnsarr,'\0',sizeof(char)*30);//存放数字字符的临时字符串数组
	tnsa_i=0;//上面数组的下标
	memset(jsarr,'\0',sizeof(char)*30);//存放+-字符的临时字符串数组
	jsa_i=0;//上面数组的下标
	memset(csarr,'\0',sizeof(char)*30);//存放*/字符的临时字符串数组
	csa_i=0;//上面数组的下标	
	isj=0;
	return;
}
//初始化乘除操作
void inic()
{
	memset(tcnarr,0,sizeof(int)*30);//存放乘除数字的临时整型数组
	tcna_i=0;//上面数组的下标
	memset(csarr,0,sizeof(char)*30);//存放*/字符的临时字符串数组
	csa_i=0;//上面数组的下标 
	tfn=0;
	return;
}
发布了12 篇原创文章 · 获赞 12 · 访问量 468

猜你喜欢

转载自blog.csdn.net/weixin_44417475/article/details/100052774