将操作员作为用户输入的计算器

时间:2016-05-16 23:39:15

标签: ruby

我正在尝试创建一个用户输入的计算器。我希望此输入不仅包括数字,还包括运算符(+-*/)。我创建了一个适用于给定参数的方法。这是我的代码:

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。当我尝试使用用户输入时,我遇到了错误。我认为它将数组中的所有内容视为字符串。给定的参数按预期工作。但我无法确定用户输入。

我想知道如何解决这个问题。

2 个答案:

答案 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.相反,您可以使用正则表达式来提取术语(顺便提一下应该更好地命名,例如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

...而且,通过在案例陈述之外移动作业:

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