Openjudge-4132-四则运算表达式求值

这一题我们可以通过递归求解,首先我们可以把一个表达式分为三部分,分别是:

(1)表达式 :项、加减

(2)项:因子、乘除

(3)因子:数、()表达式

这三项构成了递归的关系,我们可以看到,要求一个表达式的值,我们首先要求一个项的值,要求一个项的值,我们首先要求一个因子的值,要求一个因子的值,我们首先要看它是由什么组成的。

它既可以是由表达式加上括号组成的,也可以是由数组成,当发现它是数时,我们就计算这个数的大小。

浮点数的计算我们分为两部分,首先先算出整数部分的大小,不断地取一位然后看看是否结束,不结束就再取一位,将之前的乘十然后加上这一位,然后我们通过cin.peek()函数可以看到这一位是什么,如果这一位是  .   我们就开始小数部分的计算,和之前的类似,每次减小十倍而已。

如果是表达式的话,我们继续之前的那个过程,表达式 -> 项 -> 因子 ,不断地递归求解。

对于表达式的求值,我们首先求出第一项的值,看看是否有后一项,有的话我们就进行计算,没有就结束。因为当进行之后的递归的时候,我们是要吃掉后面的字符的,我们使用过之后就把它丢掉。

使用完+ - * / ( ) 之后我们要把它吃掉,求项的时候我们也是相同的流程,先求一项,判断是否还有,然后进行下一步的操作,大致就是这样了。

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<iomanip>
using namespace std;
double factor();
double term();
double exp();
 
double exp()   //求表达式的值
{
    double res=term();
    while(true)
    {
        char op = cin.peek(); //看输入流中的下一个字符,不取走
        if(op=='+' || op=='-')
        {
            cin.get();  //从输入流中取走一个字符
            double val = term();
            if(op=='+') res+=val;
            else res-=val;
        }else break;
    }
    return res;
}
 
double term()
{
    double res=factor();
    while(true)
    {
        char op = cin.peek();
        if(op=='*' || op=='/')
        {
            cin.get();
            double val = factor();
            if(op=='*') res *= val;
            else res /=val;
        }else break;
    }
    return res;
}
 
double factor()
{
    char c = cin.peek();
    double res=0;
    if(c=='(')
    {
        cin.get();
        res = exp();
        cin.get();
    }else{
        while(isdigit(c))
        {
            cin.get();
            res = res*10+c-'0';
            c=cin.peek();
        }
        if(c=='.')  //有小数部分
        {
            double val=0;
            double base = 0.1;
            cin.get();
            c=cin.peek();
            while(isdigit(c))
            {
                cin.get();
                val += (c-'0')*base;
                c=cin.peek();
                base = base * 0.1;
            }
            res += val;
        }
    }
    return res;
}
 
 
int main()
{
    double ans = exp();
    cout<<fixed<<setprecision(2)<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41090676/article/details/84841439