zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Decimal、 Float、 Double 使用
    jdk1.7的collections.sort(List list)排序问题
    $watch、$digest、$apply
    BeanNameViewResolver
    This system is not registered with RHN
    JNI字段描述符-Java Native Interface Field Descriptors
    服务器端cs文件
    ASP.NET基础(一)
    Android开发日记(七)
    登陆 注册
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12328905.html
Copyright © 2011-2022 走看看