首页 > 解决方案 > 计算多个算术表达式

问题描述

编写一个更好的计算器版本,calc2.cpp,它可以计算多个算术表达式。让我们使用必须在输入中每个表达式的末尾使用的分号符号。

假设输入文件 formulas.txt 如下所示:

15;

10 + 3 + 0 + 25 ;

5 + 6 - 7 - 8 + 9 + 10 - 11;

当我们使用该输入运行程序时,输出应该评估所有表达式并将它们各自打印在自己的行上:

$ ./calc2 < 公式.txt

15

38

4

我坚持为字符“;”设置一个循环 可以对每一行进行重做计算。请帮忙,谢谢!

#include<iostream>
#include<string>
using namespace std;

int main() {

    char opr;         
    int  value;
    int sum=0;
    cin >> sum;  


    while (cin >> opr >> value)
    {
        switch (opr)
        {
            case '+': ++
                sum += value;
                break;
            case '-':
                sum -= value;
                break;
        }
    }

    cout<<sum<<endl;
    return 0;
}

标签: c++

解决方案


如果文件包含非法运算符字符以捕获简单的拼写错误,您可以添加一个额外的 case 来switch处理 the';'和一个额外的case。default

while (cin >> opr >> value)
{
    switch (opr)
    {
        case '+': 
            sum += value;
            break;
        case '-':
            sum -= value;
            break;
        case ';':
            cout<<sum<<endl;
            sum = value; // set first value of next equation as sum to set up for next 
            break;
        default:
            cerr << "Invalid operation! Exiting program!";
            return -1;
    }
}

但要小心!文件中的最后一个条目会告诉你!给定

15;

10 + 3 ;

作为输入观察会发生什么

cin >> sum;  

读到 15。

while (cin >> opr >> value)

读;opr和第二个等式中的 10到value

switch (opr)

运行

case ';'

打印出来sum,设置sum为 10 并循环回

while (cin >> opr >> value)

将 + 读入opr,将 3 读入value

case '+'

运行并设置sum为 10 + 3 并循环回

while (cin >> opr >> value)

上面写着;intoopr然后失败,因为没有value可读取的。这将退出而不打印任何内容。

黑客修复是

while (cin >> opr >> value)
{
    switch (opr)
    {
        case '+': 
            sum += value;
            break;
        case '-':
            sum -= value;
            break;
        case ';':
            cout<<sum<<endl;
            sum = value; // set first value of next equation as sum to set up for next 
            break;
        default:
            cerr << "Invalid input! Exiting program!";
            return -1;
    }
}
cout<<sum<<endl;

打印出循环退出后剩余的总和。如果这是一门入门课程,您可以在这里停下来。

但...

您可以从类似的输入中获得相同的效果

15;

10 + 3 个芝士汉堡

或者

15;

10 + 3

以及类似的行为

15;

10 + 3 + 弗诺德 + 25 ;

5 + 6 - 7 - 8 + 9 + 10 - 11;

这显然是错误的。在现实的编程世界中,您必须处理违反协议的情况。世界上到处都是无法完全保护自己免受不良输入影响的程序,现在它们的主机正在处理垃圾邮件或更糟的情况。教师可能会扣留一些分数来奖励覆盖所有基础的学生。


推荐阅读