我正在尝试创建一个用户输入的计算器。我希望此输入不仅包括数字,还包括运算符(+
,-
,*
,/
)。我创建了一个适用于给定参数的方法。这是我的代码:
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
。当我尝试使用用户输入时,我遇到了错误。我认为它将数组中的所有内容视为字符串。给定的参数按预期工作。但我无法确定用户输入。
我想知道如何解决这个问题。
答案 0 :(得分:3)
.learn-more
返回一个数字作为结果;它不会将 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)
答案 1 :(得分:2)
除了在另一个答案中陈述的to_i
的需要之外,user_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
...而且,通过在案例陈述之外移动作业:
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
,但更重要的是验证操作员以确保它是您可以处理的操作员之一。