2016-05-16 10 views
1

ユーザー入力を受け取る電卓を作成しようとしています。この入力には数値だけでなく、演算子も含めてください(+-*/)。私は与えられたパラメータで動作するメソッドを作成しました。ここに私のコードは:演算子をユーザー入力として受け取る電卓

def calculator(x, y, z) 
    if y == '+' 
     ans = x + z 
    elsif y == '-' 
     ans = x - z 
    elsif y == '*' 
     ans = x * z 
    elsif y == '/' 
     ans = x/z 
    end 
    p ans 
end 

calculator(3, '+', 5) 
calculator(4, '-', 2) 
calculator(3, '*', 10) 
calculator(21, '/', 7) 

puts "Please enter your calculation" 
user_calc = gets.chomp 

user_calc.chars 
user_calc[0].to_i 
user_calc[4].to_i 
calculator(user_calc[0], user_calc[2], user_calc[4]) 

プログラムは、インデックス0は最初の整数インデックス2オペレータ、及び指標4第2の整数であることを前提としています。

3 + 5を入力すると、出力は8の代わりに35になります。それ以外の操作(-,*,/)はnilを返します。ユーザー入力を使用しようとすると、エラーが発生します。私は、配列内のすべてを文字列として扱うと思います。指定されたパラメータは意図したとおりに動作します。しかし、私はユーザーの入力を徹底的に把握することはできません。

私はこれを修正する方法について考えています。

答えて

3

user_calc[0].to_iは、結果として数字のを返します。 user_calc[0]になりません。だから、

calculator(user_calc[0], user_calc[2], user_calc[4]) 

calculator("3", "+", "5") 

"3" + "5""35"ですがやっています。

正しい方法は、別の答えに記載されたto_iの必要性に加えて

calculator(user_calc[0].to_i, user_calc[2], user_calc[4].to_i) 

または

arg1 = user_calc[0].to_i 
arg2 = user_calc[4].to_i 
calculator(arg1, user_calc[2], arg2) 
+0

ありがとう、アマダン。なぜ今私は正しい返品を得ていないのか分かります。 私はもう少し考えてきましたが、私は解決しようとしているもう一つの質問がありました。各入力(x、y、z)を独自のインデックスとして扱う方法はありますか? 現時点では、 user_calc.split( '') の各文字は、それ自身のインデックスとして扱われます。たとえば、5 + 95は代わりに5 + 9を返します。私はuser_calcをどうやって別々に分けることができるのだろうと思っています。 言い換えれば、14の代わりに5 + 95に対して100の戻り値を得るにはどうすればよいでしょうか。 – Orie

+1

キースが言ったように、正規表現。 \ s *(\ d +)/) 'は、2つの整数引数を抽出します。 (文字列として、それらの間に 'to_i ')とそれらの間の演算子が必要です。 – Amadan

2

を書くことになり、user_calc[n]は、n番目の文字を取得しています。これは、文字< 0または> 9を処理しません。代わりに、正規表現を使用して用語を抽出することができます(名前の都合上、たとえばxoperatoryなど)。

http://rubular.com/に行くと、偉大な正規表現テスターです。

さらに、calculatorメソッドを簡略化する方法もあります。たとえば、caseを使用することができます。

def calculator(x, y, z) 
    case y 
    when '+' 
     ans = x + z 
    when '-' 
     ans = x - z 
    when '*' 
     ans = x * z 
    when '/' 
     ans = x/z 
    end 
    p ans 
end 

...そしてさらに、case文の外に割り当てを移動することにより:

def calculator(x, y, z) 
    x = x.to_i; z = z.to_i 
    ans = case y 
    when '+' 
     x + z 
    when '-' 
     x - z 
    when '*' 
     x * z 
    when '/' 
     x/z 
    end 
    p ans 
end 

ありsendでもあるが、それでそれがさらに重要ですオペレーターがあなたが処理できるものの1つであることを確認するためにオペレーターを検証します。

関連する問題