表达式求值是程序设计语言编译中的一个最基本问题。对算术表达式求值,首先要了解四则运算规律(数据和结果全部为整数)
(1)先乘除,后加减
(2)从左到右
(3)先括号内,后括号外
分析:表达式可拆解,由运算等级由低到高进行从外向内的剥皮
1.表达式:表达式由项组成,项之间可能有“+”或“-”号;
2.项:项由因子组成,因子之间可能有“*”或“/”号;
3.因子:因子由数值组成,或者由表达式组成(递归),表达式两侧有括号。
4.递归结束条件是遇到数值。
思路:
分别写出三个函数表示取表达式、项和因子,判断是否有符号,如果有符号则再次调用。
小技巧:
cin.peek()只看不取,用于判断;cin.get()取字符,用于操作。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
//表达式=项+-项 项=因子*/因子 因子=数或括号内的表达式
int express_value();//表达式
int term_value();//项
int factor_value();//因子
int main()
{
cout<<express_value()<<endl;
return 0;
}
int express_value()
{
int result=term_value();
bool more=true;
while(more){
char op=cin.peek();
if(op=='+'||op=='-'){
cin.get();
int value=term_value();
if(op=='+')result+=value;
else result-=value;
}
else more=false;
}
return result;
}
int term_value()
{
int result=factor_value();
bool more=true;
while(more){
char op=cin.peek();
if(op=='*'||op=='/'){
cin.get();
int value=factor_value();
if(op=='*')result*=value;
else result/=value;
}
else more=false;
}
return result;
}
int factor_value()
{
int value=0;
char op=cin.peek();
if(op=='('){
cin.get();
value=express_value();
cin.get();
}
else{
while(isdigit(op)){
value=10*value+op-'0';
cin.get();
op=cin.peek();
}
}
return value;
}