简单计算器 (实数计算 先乘除后加减)

模拟简单运算器的工作。实现加减乘除计算表达式输出正确结果(保留 2 位小数)。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:

1+2*10-10/2=

输出样例:

10

代码部分:先乘除后加减(实数计算,结果保留2位小数)

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*声明函数**定义全局变量*/ 
void shuru(char *pb);	//获取表达式 
void fenzu(double *pa,char *pb,char *pc);	 //拆分表达式
void youxian(double *pa,char *pb,int n);	 //处理优先级计算 
void zhcjs(double *pa,char *pb,char *pc,int n);	 //最终计算及输出
int count=0;		//定义全局变量 count 用来记录 计算次数 
menu_0()			//提示信息 
{
	printf("\n***********简单计算器***************\n\n");	
	printf("\t【】任意键开始计算\n\t【】退出 e \n\n");
	printf("********计算表达式以'='结束**********\n\n");
	
}
int main()
{ 
	if(count==0)  //提示信息只显示 1 次 
	menu_0(); 
	double a[100]={0},n;
	char b[100]={0},c[100]={0},y; 
	y=getchar();
	if(y=='e') exit(0);	//获取字符,'e' 则退出 
	fflush(stdin); //清除缓存,准备接收表达式 
	shuru(b);
	fenzu(a,b,c);
	n=strlen(c);
	youxian(a,c,n);
	zhcjs(a,b,c,n);
	
}
/*****************	获取表达式,存入b[] **********/
void shuru(char *pb)
{
	char y;
	printf("表达式:");  
	while((y=getchar())!='=')
	*pb++=y;
	printf("\n\n");
}
/*****************将数字和计算符号分开存储到 a[]数组 和 c[] 字符串 **********/
void fenzu(double *pa,char *pb,char *pc)
{
	double x,m=0;
	int j=0;
	while(*pb!='\0')
	{
		x=*pb-'0';		//将输入的字符逐一转换为 ascii码 与 '0'比较,  
		if(x>=0&&x<=9)  //连续的数字字符转化为 int 数据 
		{
			m=m*10+x;	//每获取一个 int数据 加到 m*10  
			pb++;		//指针移到下一个字符 
		}
		else//不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中 
		{
			*(pa+j)=m;		//得到的数字存储在 a[] 数组中
			*(pc+j)=*pb;	//得到的非数字字符存储在 c[] 字符串中
			m=0;		//回初始值,为下一个数据做准备
			j++;		//下标 +1
			pb++;		//指针移到下一个字符
			 
		}
	}
	*(pa+j)=m;	//得到的最后一个数字存储到 a[] 数组中
}
/*****************处理优先计算  '*'   '/'  *******************/	
//将乘除运算的结果存储到运算符号之后的数值所在空间,前面的数值清零 ,符号位赋值 '+、-'
void youxian(double *pa,char *pc,int n)
{ 
	int i;
	for(i=0;i<=n;i++)
	{
		if(*(pc+i)=='*') //乘法计算
		{ 
			*(pa+i+1)=*(pa+i) * *(pa+i+1);//所得数值给后面的单元,可以继续参与后续乘除计算
			*(pa+i)=0;
			if(*(pc+i-1)=='-')	
				*(pc+i)='-';
			else
				*(pc+i)='+';
		}				
		if(*(pc+i)=='/'&&*(pa+i+1)!=0) //除数不为 ‘0’ ,除法计算 
		{
			*(pa+i+1)=*(pa+i) / *(pa+i+1);//所得数值给后面的单元,可以继续参与后续乘除计算
			*(pa+i)=0;
			if(*(pc+i-1)=='-')	
				*(pc+i)='-';
			else
				*(pc+i)='+';
		}
	} 
}
void zhcjs(double *pa, char *pb, char *pc, int n)
{
/********************以下按顺序开始计算*******************************/	
	int i;
	double m;	
	m=*(pa+0); //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m 
	for(i=0;i<=n;i++)
	{
		if(*(pc+i)=='\0') //没有符号,输出计算结果 
		{	
			printf("计算结果: %.2lf\n\n",m); //精度保留 2 位小数,可修改
		}
		else if(*(pc+i)=='+') m+=*(pa+i+1);	//加法计算 
		else if(*(pc+i)=='-') m-=*(pa+i+1);	//没减法计算
		else if(*(pc+i)=='*') m*=*(pa+i+1);	//乘法计算
		else if(*(pc+i)=='/'&&*(pa+i+1)!=0) m/=*(pa+i+1);	//除数不为 ‘0’ ,除法计算 
		else //除数为 ‘0’ ,或者非法运算符 输出  "ERROR"
		{
			printf("\nERROR\n\n");break;
		}	
	} 
	count++; 
	fflush(stdin);
	main();	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值