2016-05-16 85 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第二整數。

當我輸入3 + 5時,輸出是35而不是8。其他操作(-,*/)返回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"

正確的方法是寫

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。 換句話說,我將如何得到100 5 + 95返回,而不是14。 – Orie

+1

正如基斯說,正則表達式返回。 '_,arg1,op,arg2 = *「5 + 95」.match(/(\ d +)\ s *([ - + * \ /])\ s *(\ d +)/)'會提取兩個整數參數(作爲字符串,你仍然需要'to_i')和它們之間的操作符。 – Amadan

2

除了需要在另一個答案指出to_iuser_calc[n]是獲得第n個字符。這不會處理字符< 0或> 9.相反,您可以使用正則表達式來提取術語(順便提一下,這應該是更好的名稱,例如x,operator,y)。

你可以去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,但它是更重要驗證操作員以確保它是您可以處理的之一。