0

申し訳ありませんが、この質問にすべてのコードを入力したことに気付きました。私のコードはすべて、他の学生にとってのこの特定の問題に対する答えのほとんどと同じであり、それはばかげていました。

これが私が置いた問題の基本的な要点です:

通常の数式(5 + 6など)と2桁(56 + 78など)で1桁の数字を認識する必要がありました。数式は、56 + 78(スペースなし)または56+78などとして表示することもできます。

実際の問題は、入力が何であれ、式を5 6 +78として読み取っていたことです。

この質問をほとんど削除してしまったことを感謝し、申し訳ありませんが、私の目標は宿題の問題に対する答えを出すことではありません。

ジェシー・スモザーモン

4

2 に答える 2

2

問題は、実際には2つの部分で構成されています。入力の字句解析(文字のシーケンスを「トークン」のシーケンスに変換する)と式の評価です。これらの2つのタスクを別々に実行すると、はるかに簡単になります。

まず、入力を読み込んで、トークンのシーケンスに変換します。各トークンは、演算子(+-など)またはオペランド(42など)です。

次に、この一連のトークンに対して中置から後置への変換を実行します。「トークン」タイプは、特別なものである必要はありません。次のように単純にすることができます。

struct Token {
    enum Type { Operand, Operator };
    enum OperatorType { Plus, Minus };

    Type type_;
    OperatorType operatorType_; // only valid if type_ == Operator
    int operand_;               // only valid if type_ == Operand
};
于 2011-03-27T02:32:49.903 に答える
1

ifまず、このようなものを動かすのに役立ちます

userInput[i] != '+' || userInput[i] != '-' || userInput[i] != '*' || userInput[i] != '/' || userInput[i] != '^' || userInput[i] != ' ' && i < userInput.length() 

明確にするために、独自の機能に。

bool isOperator(char c){
  return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}

また、演算子がないことを確認する必要はありません。入力が数値であることを確認するだけです。

bool isNum(char c){
  return '0' <= c && c <= '9';
}

もう1つ、上記の長いチェーンでは、入力文字が。以外の文字である場合、ブロックにも入るという問題が発生ましtempNumber += ...た。上記の関数で確認する必要があります。'+'&&

if (isNum(userInput[iterator])){
    tempNumber += userInput[iterator];
}

bこれにより、などの無効な入力も除外されますX


次に、2桁の数字
の問題については、次のようになります。問題は、を挿入した後は常にtempNumberスペースを入力することです。数字のシーケンスが終了した場合にのみ、それを行う必要があります。これを修正するには、長いif-else ifチェーンの終わりを変更するだけです。

// ... operator stuff
} else {
  postfixExpression << tempNumber;
  // peek if the next character is also a digit, if not insert a space
  // also, if the current character is the last in the sequence, there can be no next digit
  if (iterator == userInput.lenght()-1 || !isNum(userInput[iterator+1])){
      postfixExpression << ' ';
  }
}

これは、から正しい表現を与える仕事をするはずです56 + 78 --> 56 78 +。何か問題があれば教えてください。:)

于 2011-03-27T03:05:59.357 に答える