c++实现一个小型算术表达式

/*************
输入表达式:
	反复
		读取一个操作数存到操作数数组中
		读取一个运算符存到运算符数组中
		如果运算符是=就跳出反复
计算:
	在运算符数组中找优先级最低的运算符
		从右向左找有没有+-
		如果没有再从右向左找有没有*/
	如果没有运算符,操作数数组第一个元素就是结果,计算完毕
	以它为界把运算符数组分成两半
		地址相减确定元素个数
	同时把操作数数组也相应分成两半
	计算左右两半的结果
	再按这个运算符进行运算得到最后结果,计算完毕
输出:
*************/
#include <iostream>
using namespace std;

bool cal(double d[], char op[], int n, double* pVal);
bool cal(double* pVal);
bool cal(double lv, double rv, char op, double* pVal);

int main()
{
	double val;
//输入并计算
	bool ok=cal(&val);
//输出:
	if(ok)
		 cout << val << endl;
	else
		cout << "无法计算" << endl;
}
bool cal(double* pVal)
{
//输入表达式:
	double d[100];
	char op[100];
	int n=0;
	//反复
	for(;;){
		//读取一个操作数存到操作数数组中
		cin >> d[n];
		if(!cin){
			cin.clear();
			char c;
			cin >> c;
			if(c!='(')
				return false;
			if(!cal(&d[n]))
				return false;
		}
		//读取一个运算符存到运算符数组中
		cin >> op[n];
		//如果运算符是=就跳出反复
		if(op[n]=='='||op[n]==')')
			break;
		n++;
	}
//计算:
	return cal(d,op,n+1,pVal);
}
//计算
bool cal(double d[], char op[], int n, double* pVal)
{
	//如果没有运算符,操作数数组第一个元素就是结果,计算完毕
	if(n==1) {
		*pVal = d[0];
		return true;
	}
	//在运算符数组中找优先级最低的运算符
	int i;
		//从右向左找有没有+-
	for(i=n-2; i>=0&&op[i]!='+'&&op[i]!='-'; i--){}
		//如果没有再从右向左找有没有*/
	if(i<0) i=n-2;
	//以它为界把运算符数组分成两半,同时把操作数数组也相应分成两半,计算左右两半的结果
	double lv, rv;
	if(!cal(d,op,i+1,&lv)||!cal(d+i+1,op+i+1,n-(i+1),&rv))
		return false;	
	//再按这个运算符进行运算得到最后结果,计算完毕
	return cal(lv,rv,op[i], pVal);
}
bool cal(double lv, double rv, char op, double* pVal)
{
	switch(op){
		case '+': 
			*pVal=lv+rv; 
			return true;
		case '-': 
			*pVal=lv-rv; 
			return true;
		case '*':
			*pVal=lv*rv;
			return true;
		case '/':
			if(rv==0)
				return false;
			*pVal=lv/rv;
			return true;
	}
	return false;
}
 
计算结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值