我的 Ruby 计算器程序就像我没有输入有效的运算符一样



我今天开始学习Ruby,到目前为止,我喜欢它易读的语法!然而,我已经制作了一个计算器应用程序来学习这种语言,并且正在努力让它发挥作用。以下是应用程序的代码。

def add(first_number, second_number)
first_number + second_number
end
def subtract(first_number, second_number)
first_number - second_number
end
def multiply(first_number, second_number)
first_number * second_number
end
def divide(first_number, second_number)
first_number / second_number
end
def mod(first_number, second_number)
first_number % second_number
end
def main()
puts "First number: "
first_number = gets
puts "Operator (+, -, *, /, %): "
operator = gets
puts "Second number: "
second_number = gets
if operator == "+"
result = add(first_number, second_number)
elsif operator == "-"
result = subtract(first_number, second_number)
elsif operator == "*"
result = multiply(first_number, second_number)
elsif operator == "/"
result = divide(first_number, second_number)
elsif operator == "%"
result = mod(first_number, second_number)
else
result = "Invalid operator. Please try again."
end
puts "Result: " + result
end
main()

它一直转到另一个并打印无效的运算符,我不确定为什么。我是犯了一个愚蠢的错误,还是我以错误的方式进行这个项目?提前谢谢你,很抱歉有这么一个简单的问题,我今天才开始学习Ruby:(

答案很简单:gets没有按照你的想法行事。它保留了后面的换行符。

irb(main):003:0> gets
hello
=> "hellon"

你需要去掉后面的换行符。

irb(main):004:0> gets.chomp
hello
=> "hello"

你可以看到这对比较的影响:

irb(main):013:0> gets.chomp == "hello"
hello
=> true
irb(main):014:0> gets == "hello"
hello
=> false

如果您想去掉所有前导或尾随的空白,您可能需要使用#strip

irb(main):015:0> gets.strip
+   
=> "+"

您还需要将操作数的输入转换为数字。

first_number = gets.to_f

当以这种方式转换时,不需要在后面的换行符中使用chomp,尽管您可以:gets.chomp.to_f

这个程序比它需要的要长得多,也更复杂。在Ruby中,运算符只是作为方法实现的,所以你可以使用Object#send来执行所有这些简单的数学运算:

# This is Ruby - not C/Java/Rust etc - there is no need for a "main" method.
puts "First number: "
first_number = gets.chomp.to_f
# Get the user input in a loop until the user provides a valid operator
operator = loop do
puts "Operator (+, -, *, /, %): "
operator = gets.chomp
if ["+", "-", "*", "/", "%"].include?(operator)
break operator 
else
puts "Invalid operator. Please try again."
end 
end 
puts "Second number: "
second_number = gets.chomp.to_f
puts "Result: " + first_number.send(operator, second_number)

如果您希望能够采用更高级的输入,并以这种方式将其映射到方法,那么使用Tadman建议的查找表(哈希(是一个好主意。

相关内容

最新更新