0

複数の数値と文字演算子から式を作成しようとしています。正確なシナリオは、たとえば 2 つの番号があることです。

    float a = 10.1, b = 10.2;

および文字演算子

    char ch = '+';

次に、次のような式を作成する必要があります

    float c = 10.1 '+' 10.2;

つまり、私が持っている2つの浮動小数点数の間に、char変数「ch」に記載されている演算子を適用したいと考えています。したがって、この場合、文字は「+」であるため、「-」の場合は減算など、両方の浮動小数点値が加算される式を作成したいと考えています。すべての値は実際にはユーザーによって提供されるため、式を作成したいそして、操作を実行します。

今私が考えた解決策の 1 つは、さまざまな演算子の大文字と小文字を切り替えることであり、それでうまくいきます。もう一つは以下です:

    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++ で同じことをする能力があるかどうか疑問に思っていました。どんな助けでも大歓迎です。

4

3 に答える 3

0

C++ には、豊富な式解析ライブラリがあります。私はそれらを自分で使用したことはありませんが、muParserについて良いことを聞いたことがあります。

于 2013-04-30T18:11:31.680 に答える
0

あなたの質問の鍵はexpression、オブジェクトとして考えることにあると思います。オブジェクト指向プログラミング言語と見なされている C++ を使用していますね。:) Composite Patternclass Expressionに従うa を書くことを検討してください。Anは単純な値の場合があります。Expression

Expression(10.1)

また、2 つの従属Expressionの追加を表すこともできます。

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

または、さらにヒントを与えるには:

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

Expression実際に評価せずに、式の演算子とオペランドを保持します。次に、プログラム内のある場所で自由に構築し、それを別の場所に渡して実際に評価します。

于 2013-04-30T18:11:41.833 に答える
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 つの章を読むことをお勧めします。ANSI C 用の LR パーサーを作成できるようになるまでに、実際に 1 ~ 2 週間かかりました。これは、問題よりもやや複雑です。

あなたのタスクは非常に単純で、LL パーサーを処理する必要さえないおもちゃの文脈自由文法で記述できます。とにかく、その理由と方法を理解するには、この本を読むことをお勧めします。

于 2013-04-30T18:20:20.013 に答える