2012-02-27 19 views
1

私はユーザーが入力した数式の値を計算するコードを作ろうとしました。つまり、ユーザーが「10 + 5」を入力した場合、プログラムは「The sum is 15」などを印刷します。最初は、これは簡単なことだと思っていましたが、scanf orsthを使用するだけでは、 。それから、配列とループを使ってループが遭遇したかどうかを確認し、 " - "または "+"の前に文字を保存した後、 " - "または "+"いずれかの作業。 これをどうやって行うかについて、正しい方向に私を導いてください。 ありがとうございます!入力の計算。

+1

式の評価が通常行われているものなど、あなたに理にかなっているに応じてそれらを変更中置表記法(例えばa + bの場合)を後置記表(例えばab +の場合)に変換し、それを評価することによって、それは初心者のために少し以上のことですが、あなたがそのアイデアを手に入れたら簡単です。 – vaisakh

答えて

2

これは非常に複雑になります。特に、演算子の優先順位を得て、たとえば2 + 5 * 6を正しく計算する必要がある場合は、2 + (5 * 6)として処理する必要があります。これに近づける正しい方法は、(コンパイラのように)式ツリーを構築することです。例えば

+ 
/\ 
2 * 
/\ 
    5 6 

これは、バイナリツリーを作成することで行います。各ノードは、操作と(2つまでの)サブノードを保持します。次に、式ツリーをトラバースして式を評価します。

+0

ありがとうございます。私はちょうど初心者のように、より多くの情報のためにそれをGoogleにしようとすると、これを行う必要がありますどのように正確に理解していない。 – geekkid

+0

@vaisakhは最初に、接尾辞、接頭辞と接尾辞の表記と、それぞれを別のものに変換する方法を述べました。接尾辞/接頭辞表記法で評価するのは実際には簡単です – scibuff

2

は、算術式を解析して評価します。これはインターネット上に大量のものがあるので、これはあなたの宿題なので、Googleにお任せします。これが簡単なあなたの最初の考えは、おそらくあまり素朴な考えではありませんが、あなたがあまりにも野心的に過度に野心的になっていなければ、それは難しい問題ではありません。

+0

ご返信ありがとうございます。私はそれをgoogledしたが、検索の10分後に何の答えも見つからなかった。私はプログラマーの終わりと技術的な言葉が本当に分からないので、私の検索は非常にシンプルであり、あまり具体的ではないからかもしれません。 btw、これは私の宿題ではありません。私はこのフォーラムに参加している人たちの前で、私はそのような質問に宿題としてタグを付けるべきだと私に言いました。 ありがとうございます。ネットを検索して算術式の解析を試み、見つけたものを見てみましょう。 – geekkid

+0

こちらをご覧くださいhttp://stackoverflow.com/questions/4589951/parsing-an-arithmetic-expression-and-building-a-tree-from-it-in-java – scibuff

1

これはあなたの頭を少し上回っているかもしれませんが、できることはcと字句解析ツール用の文法エンジンを使用することです。

私は学校で覚えているから

それは「BISON」と「yylexの」と呼ばれていると信じて、それは我々のPascalコンパイラを作った方法です。ツリーを作成した後

http://en.wikipedia.org/wiki/GNU_bison

。次に、サブツリーを分析して、ルートノードをサブツリーの合計にします。

0

これらは、使用

  • が始まり
  • から文字列を読み込む
  • 開始は2回のパスを行うのgetline()またはfgetsの()を使用して入力を取得検討する必要がありますいくつかのステップがありますオペレータ用のキューとオペランド用のもう1つのキュー
  • 最初のパスで*または/に到達し、次の番号を読み込み、次の番号と以前に読み込んだ番号に対して操作を実行し、待ち行列
  • また、最初のパスで+または - を読むと、オペレータとオペランドを静かにそれぞれのキューにプッシュします。
  • 2番目のフェーズで+と--...キューを使用すると、連続するマイナスを適切に処理するのに役立ちます。

これらの4-3-3は、手順を正確ではありませんが、それはに探して発見的価値がある - これらを介して動作しようと、