2016-07-19 13 views
0

私はコマンドライン計算機を作ろうとしていますが、どこから始めたらいいかわかりません。ここでRubyコマンドライン計算機

は、私がこれまで持っているものです。

puts "Calculator " 
    puts "please write what youd like to calculate . i.e '4 + 3 * 4'" 

    cal = gets.chomp.split(" ") 

    cal.map!.with_index do |num, i| 
     if i.even? 
     num.to_i 
     else 
     num.to_sym 
     end 
    end 
    cal.inspect 
    # i.e [3, :+, 4] 

は、私は、アレイ内で何を取得し、その結果を返すことができるようにしたいです。このように:3 + 4 = 7

答えて

1

単純な電卓の場合は、シンボルの位置をBODMASの順に確認することをお勧めします。

簡略化して、それをDMAS - 除算、乗算、加算、減算に変更します。

"4 + 3 - 5/2 * 5"としましょう。ユーザが各シンボルや数字をスペースで区切っていると考えることを前提にして、この文字列をスペースで分割することができます。

さらに、ユーザーが正しい(誤っていない)計算を入力したと仮定して、操作する最初の演算子のインデックスを探す必要があります。 DMASのおかげで、私たちはまず部門を行うべきです。

/のインデックスを見つけてから、それ以前のインデックスの値をインデックスの値で除算します(5/2)。

アレイでは、使用した値と演算子を、計算した値で置き換えます。したがって、["4", "+", "3", "-", "5", "/", "2", "*", "5"][4, "+", 3, "-", 2.5, "*", 5]になります。

次に、このプロセスを繰り返して、演算子の種類に応じて値を変更します。

2

ユーザーからの入力文字列にevalを使用すると、それを処理する必要があります。 I. e .:

eval('4 + 3 * 4') 
#⇒ 16 

異なる文字列を処理するevalのさまざまな簡単な例を表示するには、irbでこれを実行できます。

ここではevalの使用についての投稿です。

https://rubymonk.com/learning/books/5-metaprogramming-ruby-ascent/chapters/24-eval/lessons/63-eval

+0

ありがとうございます。だからこれは基本的にすべてのive書かれた笑 –

+1

私はこれに対してお勧めしますmosltyを置き換えます。'eval'はあなたが使い慣れて欲しいものではありません。ルビーはあなたが入力するコードを実行するので危険です。あなただけが使用するアプリケーションの場合はおそらく問題ありませんが、一般的に無害の電卓アプリを書くことができ、ユーザーは例えば '\' cd〜; rm -r \ ''、あなたのアプリは先に進み、ホームディレクトリを削除します。 – lwassink

+0

@ユーザが電卓を実行でき、電卓を実行しているプロセスがcommand_を実行できたという事実から、このユーザはコマンドを自分で実行することができました。一方、誰かが電卓をプログラミングしているときには、勉強のプロセスである可能性が高いので、多くのケースでかなりうまく動作し、90%で危険であると不公平なevalを使用することはお勧めしません症例のEvalは予防策付きで使用する必要があります。はい、良いプログラマーの手には完璧なツールです。 – mudasobwa

3

あなたはほとんどそこにいます!

あなたはおそらく認識しているとして、+などの事業者がRubyでメソッドのためだけ糖衣構文なので、この配列:受信機(3)、メソッド:

cal = [3, :+, 4] 

...あなたが必要なすべてを持っていますその受信機(:+)を呼び出すと、引数(4)する:上記

recv, meth, arg = cal 
recv.public_send(meth, arg) 
# => 7 

はもちろん3 + 4と同じである、3.+(4)を呼び出すことと等価です。

+0

優先順位付けのカッコが必要な場合は、どのような提案をしますか? 3 * 5 + 2!= 3 *(5 + 2) – pjs

+0

カッコ内の式を最初に解いて、結果で置き換えます。単一の結果が得られるまで再帰的に行います。 –

+0

'[3、:+、4]'は[AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree)と呼ばれ、ASTを使用する言語(LISPなど)があります言語の構文自体として。残念ながら、ルビーで完全なASTを構築することは痛みを伴うプロセスです。なぜなら、ルビーはASTに対して透過的になるように設計されていないからです(例えば、Elixirとは異なります)。 – mudasobwa