计算多个算术表达式

时间:2019-02-15 02:18:30

标签: c++

  

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

     

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

     

15;

     

10 + 3 + 0 + 25;

     

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

     

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

     

$ ./calc2      

15

     

38

     

4

我一直坚持为char“;”建立循环可以对每一行进行重做计算。请帮忙,谢谢!

#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;
}

3 个答案:

答案 0 :(得分:1)

您可以在switch上添加一个额外的大小写来处理';',如果文件包含非法的运算符来捕获简单的错字,则可以添加一个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)

其内容为;放入opr,然后失败,因为没有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 + fnord + 25;

     

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

这显然是错误的。在编程的现实世界中,您必须处理违反协议的情况。世界上到处都是程序,它们无法完全抵御不良输入,现在他们的主机正在发送垃圾邮件,甚至更糟。讲师可能会扣一些分数,以奖励涵盖所有基础的学生。

答案 1 :(得分:0)

我认为您无法像您所说的那样做……因为您必须指定输入的结尾。否则,编译器将无法确定输入,并且它将无限期读取。因此,您必须以某种方式指定输入的结束位置。

答案 2 :(得分:0)

解决问题的建议:

#include <iostream>
#include <fstream>

using namespace std;
int main()
{
  int val;

  while (cin >> val)
  {
    string op;

    while (cin >> op)
    {
      if (op == ";")
      {
        cout << val << endl;
        break;
      }

      int num;

      if (! (cin >> num)) {
        cout << "a number is expected after '" << op << '\'' << endl;
        return -1;
      }

      if (op == "+")
      {
        val += num;
      }
      else if (op == "-")
      {
        val -= num; 
      }
      else {
        cout <<"invalid operator '" << op << '\'' << endl;
        return -1;
      }
    }
  }

  return 0;
}

编译与执行

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra s.cc
pi@raspberrypi:/tmp $ cat formulas.txt 
15;
10 + 3 + 0 + 25;
5 + 6 - 7 - 8 + 9 + 10 - 11; 
pi@raspberrypi:/tmp $ ./a.out < formulas.txt 
15
38
4
pi@raspberrypi:/tmp $