使用数字和字符操作符创建表达式
creating an expression using numbers and charater operator
我试图从两个或多个数字和字符操作符创建和表达。确切的情况是,我有两个数字。
float a = 10.1, b = 10.2;
和字符操作符
char ch = '+';
现在我必须创建一个表达式,看起来像
float c = 10.1 '+' 10.2;
。我想在两个浮点数之间应用字符变量"ch"中提到的运算符。所以在这种情况下,字符是'+',所以我想创建一个表达式,其中两个浮点值将被添加,如果'-'然后减法等。所有的值实际上都是由用户提供的,所以我们想要创建一个表达式,然后执行操作。
现在我想到的一个解决方案是对不同的运算符进行切换,这样就可以了。另一个在下面:
float a = 10.1, b = 20.3;
char ch = '+';
string result = "";
ostringstream os;
os << a;
result += os.str();
os.str("");
os << b;
result += ch + os.str();
现在我编写了上面的代码片段,这样我就可以根据用户输入创建表达式,然后返回该表达式,以便在另一个过程中对其求值。
我不确定这是否可能。我的意思是,切换情况的解决方案似乎很好,我在这里计算表达式本身并返回输出值,但只是想知道是否有一种方法可以将表达式返回到另一个函数,然后在那里计算它?在tcl脚本语言中,我们有一个命令"expr",它做同样的工作,所以我想知道我们是否有任何这样的能力在c++中做同样的事情。任何帮助都会很感激。
我认为你的问题的关键是考虑到expression
作为一个对象。您使用的是c++,有些人认为它是面向对象的编程语言,对吗?考虑编写一个遵循复合模式的class Expression
。Expression
可能只是一个简单的值:
Expression(10.1)
也可以表示两个从属Expression
s的相加:
Expression(Expression(10.1) + Expression(20.3))
或者给你一个进一步的提示:
Expression('+', Expression(10.1), Expression(20.3))
使Expression
保存表达式的操作符和操作数,而不实际求值。然后你可以自由地在程序的一个地方构造它,然后将它传递到另一个地方来实际求值。
c++有丰富的表达式解析库。虽然我自己没有使用过它们,但我听说过muParser的优点。
假设这是另一个作业/家庭作业,并且您不追求功能齐全的表达式解析器,下面是尽可能简单的解决方案:
#include <iostream>
#include <sstream>
using std::stringstream;
using std::cout;
using std::endl;
float compute(float a, float b, char op) {
switch(op) {
case '+':
return a + b;
case '-':
return a - b;
// You may add more operations in the similar way.
default:
cout << "Operation is not supported." << endl;
}
return 0;
}
int main() {
// These guys are here to simulate user input.
float input_a = 10.1;
float input_b = 20.3;
char input_op = '+';
stringstream ss;
ss << input_a << input_op << input_b;
// If you really make it interactive, then the program actually starts here.
float a;
float b;
char op;
// You simply read operands and operator from some input stream,
// which in case of interactive program could be `std::cin`.
ss >> a;
ss >> op;
ss >> b;
// Print the result of computation.
cout << compute(a, b, op) << endl;
}
如果你想处理更复杂的情况,比如嵌套表达式的求值,可能包括括号功能,那么我建议你阅读经典的龙书的前4章。我真的花了大约1-2周的时间才能够为ANSI C编写lr解析器,这比你的问题要复杂得多。
你的任务是非常简单的,可以用一个玩具上下文无关的语法来描述,甚至不需要LL-parser来处理。无论如何,为了理解,为什么和如何,我鼓励你读这本书。
- 试图创建对象列表,操作符=给了我麻烦
- 我可以在c++中创建一个新的操作符吗?
- 如果new操作符重载且构造函数为私有,则无法通过new创建对象
- 如何使用new操作符创建对象并使用for循环
- 如何创建一个std::map的常数值,它仍然可以被[]操作符访问
- 输出一个pair列表(由重载操作符创建)
- 我正在努力完成我的作业.在Distance类中创建一个重载*操作符
- 使用数字和字符操作符创建表达式
- 使用jsoncpp库使用/操作符创建JSON字符串时出错
- 为具有引用成员变量的类创建赋值操作符
- 创建了自己的字符串类——重载赋值操作符和析构函数的错误
- 在c++中创建自己的操作符
- (C/ c++)如何创建一个接受自增操作符的宏
- 如何在c++中创建一个操作符,将一个数组复制到另一个数组
- 如何为形式a[x][y]创建重载操作符
- 给定了一个变量,编译器是否总能安全地创建赋值操作符?
- 模板化操作符创建一个错误,指出操作符是二义性的
- 操作符重载——创建一个新的string类
- 如何使用new操作符创建multimap的新实例
- c++:如果类禁用赋值操作符,是否有可能创建一系列类对象(使用vector?)