使用数字和字符运算符创建表达式

时间:2013-04-30 18:01:03

标签: c++ type-conversion

我正在尝试从两个或多个数字和字符运算符创建和表达。确切的情况是我有两个数字,例如。

    float a = 10.1, b = 10.2;

和一个字符操作符

    char ch = '+';

现在我必须创建一个看起来像

的表达式
    float c = 10.1 '+' 10.2;

即。我想在我的两个浮点数之间应用char变量“ch”中提到的运算符。所以在这种情况下,charater是'+'所以我想创建表达式,其中将添加浮点值,如果' - '然后是减法等。所有值实际上将由用户提供,因此想要创建表达式而不是执行操作。

现在我想到的一个解决方案是为不同的运营商提供切换案例,这样就可以了。另一个在下面:

    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 ++中做同样的事情。任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:0)

C ++有很多表达式解析库。虽然我自己没有使用任何一个,但我听到了关于muParser的好消息。

答案 1 :(得分:0)

我认为您的问题的关键在于将expression视为对象。您正在使用C ++,有些人认为C ++是面向对象的编程语言,对吧? :)考虑在Composite Pattern之后写一个class ExpressionExpression可能只是一个简单的值:

Expression(10.1)

它还可以代表两个下属Expression的添加:

Expression(Expression(10.1) + Expression(20.3))

或者给你一个进一步的提示:

Expression('+', Expression(10.1), Expression(20.3))

使Expression保持表达式的运算符和操作数,而不实际评估它。然后你可以自由地在你的程序中的一个地方构建它,然后将它传递到另一个地方以实际评估它。

答案 2 :(得分:0)

假设这是另一个作业/家庭作业而你没有追求功能齐全的表达式解析器,这里的解决方案尽可能简单:

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

如果您想处理更复杂的情况,例如嵌套表达式的评估,可能包括括号功能,那么我建议您阅读经典 Dragon Book 的前4章。我花了大约1-2周才能为ANSI C编写LR解析器,这比你的问题复杂得多。

您的任务非常简单,可以用玩具无上下文语法来描述,甚至不需要LL解析器来处理。无论如何要理解,为什么以及如何,我恳求你阅读这本书。