2016-05-16 88 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,但它是更重要验证操作员以确保它是您可以处理的之一。