计算多个算术表达式
evaluate multiple arithmetic expressions
>编写一个更好的计算器版本calc2.cpp,它可以计算多个算术表达式。让我们使用必须在输入中每个表达式末尾使用的分号符号。
假设输入文件公式.txt如下所示:
15 ;
10 + 3 + 0 + 25 ;
5 + 6 - 7 - 8 + 9 + 10 - 11 ;
当我们使用该输入运行程序时,输出应该计算所有表达式并将它们打印在自己的行上:
$ ./calc2<公式.txt>公式.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 $
我认为没有办法按照你说的去做......因为您必须指定输入的结束。否则,编译器将无法确定输入,它将无限期读取。因此,您必须以某种方式指定输入的结束位置。
- (C++)分析树以计算返回错误值的简单算术表达式
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 编译器是否强制根据模板参数计算表达式?
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 如何在常量计算表达式中获取编译时错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 计算表达式字符串由 std::map 中的键组成
- 复合赋值的左侧表达式是未初始化的值.计算出的值也将是垃圾
- 使用正则表达式C++计算数字中的十进制空格
- 是否可以定义以后可以计算的布尔表达式
- 如何使用 ASCII 转换使用字符堆栈计算后缀表达式
- std::d eclval 和未计算的表达式
- (类型)(数学表达式)是否计算此类型的表达式?
- 使用不同的表达式计算同一整数时的结果不一致
- 手动将二进制表达式计算为十六进制
- 使用链表在C++进行表达式计算
- 表示表达式计算c++(多态性设计)
- 此表达式计算什么
- 将空表达式计算为NOP