CLAY85 2022-10-24 11:11 采纳率: 0%
浏览 72

来解解,来解解,来解解

C++
编写程序,使其能读入并计算一个只包含加减运算的表达式,每一个输入的数据都是浮点数,除第一个数以外,
其余每个数前面都有一个运算符,表达式以分号“;”结束。
例如:
23+43-233+234;

输入输出格式要求:
要求输出小数点后6位。
只输出运算结果,请不要输出其他字符,遇到异常情况(如结尾不是分号等),输出error
例如:
输入:23+43-233+234;回车
输出:67.000000
输入:23+43,回车
输出:error

  • 写回答

1条回答 默认 最新

  • xybf 2022-10-24 11:40
    关注

    img


    保留2位小数是因为 cout 的精度设置问题,需要更高精度可以选用 printf 或者用 cout << fixed << ... 之类的方式来提高输出精度

    #include <iostream>
    using namespace std;
    
    double pow(double x, int k)
    /* 快速幂,返回 x 的 k 次方 */
    {
        double ret = 1;
        while(k)
        {
            if(k & 1)
                ret = ret * x;
            x = x * x, k >>= 1;
        }
        return ret;
    }
    
    string str;
    int main()
    {
        cin >> str;
        if(str[str.length() - 1] != ';')
        {
            cout << "error";
            return 0;
        }
        double x = 0, ans = 0; /* x 为当前数字, ans 为当前位前所有运算的结果 */
        bool dot = false, fh = true; /* dot 代表是否已经出现了'.', fh 代表当前项的系数 ( true 为 +, false 为 - ) */
        int afd = 0; /* afd 代表当前是小数点后几位 */
        for(auto& c : str) 
        {
            if(c == '+' or c == '-')
            {
                ans += x * (fh ? 1 : -1);
                afd = dot = (x = 0);
                fh = c == '+' ? true : false;
            }
            else if(c == '.')
            {
                dot = true, afd = 1;
            }
            else if('0' <= c and c <= '9')
            {
                if(dot)
                    x = x + (c - '0') * pow(0.1, afd++);
                else 
                    x = x * 10 + c - '0';
            }
            else if(c != ';')
            {
                cout << "error";
                return 0;
            }
        }
        /* 将最后一项累加进结果 */
        ans += x * (fh ? 1 : -1);
        
        afd = dot = (x = 0);
        
        cout << ans;
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 10月24日