计算多个算术表达式

evaluate multiple arithmetic expressions

本文关键字:表达式 计算      更新时间:2023-10-16

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

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

15 ;

10 + 3 + 0 + 25 ;

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

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

$ ./calc2<公式.txt>

15

38

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

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

您可以在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 ;

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

解决问题的建议:

#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 $ 

我认为没有办法按照你说的去做......因为您必须指定输入的结束。否则,编译器将无法确定输入,它将无限期读取。因此,您必须以某种方式指定输入的结束位置。