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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Moing557/article/details/50476421

大学的第一学期就这样结束了。前阵子临近放假,不知道该干嘛,就分别用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("此时的符号为。。。");这是编写过程中为了找到错误而写的。没有去删除。觉得这样调试挺不错的。

这个计算器非常简易,只能计算整数。不支持括号运算。 计算也不是百分百正确。因为有些计算会出现小数结果。


猜你喜欢

转载自blog.csdn.net/Moing557/article/details/50476421