问题:
表达式求值是程序设计语言编译中的一个最基本问题。对算术表达式求值,首先要了解四则运算规律(数据和结果全部为整数)
(1)先乘除,后加减
(2)从左到右
(3)先括号内,后括号外
分析:
表达式可拆解,由运算等级由低到高进行从外向内的剥皮
1.表达式:表达式由项组成,项之间可能有“+”或“-”号;
2.项:项由因子组成,因子之间可能有“*”或“/”号;
3.因子:因子由数值组成,或者由表达式组成(递归),表达式两侧有括号。
4.递归结束条件是遇到数值。
思路:
1.将式子分为三类:表达式(进行对项的加减运算)、项(进行对因子的乘除运算)、因子(进行对括号内式子的运算->表达式问题、数字);
a.表达式:
(1)找项
(2)找符号
b.项
(1)找因子
(2)找符号
c.因子
(1)括号
(2)数字
2.找项利用函数的互相调用,找符号利用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(); //看一个字符,不取走;cin.peek()只看不取,用于判断
if(op=='+'||op=='-')
{
cin.get(); //取一个字符: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(); //看一个字符,不取走;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 result=0;
char op=cin.peek(); //看一个字符,不取走;cin.peek()只看不取,用于判断
if(op=='(') //若为括号
{
cin.get(); //取一个字符:cin.get()取字符,用于操作
result=express_value();
cin.get(); //括号有左有右,将右括号取走
}
else{
while(isdigit(op)) //若为数字
{
result=10*result+op-'0';
cin.get(); //取一个字符
op=cin.peek();
}
}
return result;
}