首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用数字和字符运算符创建表达式

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

Stack Overflow用户
提问于 2013-05-01 02:01:03
回答 3查看 54关注 0票数 0

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

代码语言:javascript
复制
    float a = 10.1, b = 10.2;

和字符运算符

代码语言:javascript
复制
    char ch = '+';

现在我必须创建一个表达式,如下所示

代码语言:javascript
复制
    float c = 10.1 '+' 10.2;

也就是说,我想在两个浮点数之间应用char变量"ch“中提到的运算符。所以在这种情况下,字符是'+‘,所以我想创建一个表达式,其中两个浮点值都将被添加,如果是'-’,那么减法等等。所有的值实际上都是由用户提供的,所以我想创建一个表达式,然后执行操作。

现在我想到的一个解决方案是为不同的运算符切换情况,这将会起到作用。另一条如下:

代码语言:javascript
复制
    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++中做同样的事情。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-01 02:11:42

我认为你问题的关键在于将expression作为一个对象来考虑。您正在使用C++,有些人认为它是一种面向对象的编程语言,对吧?:)考虑编写一个遵循Composite Patternclass ExpressionExpression可能只是一个简单的值:

代码语言:javascript
复制
Expression(10.1)

它还可以表示添加两个从属Expression

代码语言:javascript
复制
Expression(Expression(10.1) + Expression(20.3))

或者给你进一步的提示:

代码语言:javascript
复制
Expression('+', Expression(10.1), Expression(20.3))

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-01 02:11:32

C++有丰富的表达式解析库。虽然我自己还没有用过其中的任何一个,但我听说过muParser的一些好消息。

票数 0
EN

Stack Overflow用户

发布于 2013-05-01 02:20:20

假设这是另一项任务/家庭作业,并且您不追求功能齐全的表达式解析器,下面是尽可能简单的解决方案:

代码语言:javascript
复制
#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编写LR解析器,这比你的问题要复杂得多。

你的任务非常简单,可以用一个玩具上下文无关的语法来描述,它甚至不需要LL解析器来处理。无论如何,为了理解,为什么和如何,我迷住你读这本书。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16306179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档