【问题标题】:Simple Ruby average program简单的 Ruby 平均程序
【发布时间】:2017-05-19 07:06:45
【问题描述】:

我正在计算用户将在 Ruby 中输入的 3 个数字的平均值。每次我运行应用程序时,用户都会输入 3 个数字,但我收到一条错误消息:

test.rb:7:in <main>': undefined method/' for "23\n23\n24\n":String (NoMethodError)

我的代码如下:

puts "Enter first"
num1 = gets
puts "Enter second"
num2 = gets
puts "Enter third"
num3 = gets
avg = (num1 + num2 + num3) / 3
puts "Average is  " + avg

【问题讨论】:

  • 您需要仔细检查错误信息。通常,就像这里一样,他们会查明问题所在。这个告诉你方法/ 没有为String 类的实例"23\n23\n24\n" 定义。这意味着(num1 + num2 + num3) 是一个字符串(不是整数)。因此,您需要将其更改为 (num1.to_i + num2.to_i + num3.to_i)

标签: ruby


【解决方案1】:

试试这个:

puts "Enter first"
num1 = gets.to_i
puts "Enter second"
num2 = gets.to_i
puts "Enter third"
num3 = gets.to_i
avg = (num1 + num2 + num3) / 3.0
puts "Average is #{avg}"

首先,您需要从gets 方法中去除换行符,并通过调用.to_i 将字符串转换为整数。然后,要正确输出平均值,只需使用字符串插值即可。

【讨论】:

  • 其实不用打电话chomp,反正你打算打电话给to_i。来自文档:返回将 str 中的前导字符解释为整数基基数(2 到 36 之间)的结果。超过有效数字末尾的无关字符将被忽略。如果 str 开头没有有效数字,则返回 0。 只需删除 chomp,它没有任何区别。
  • @spickermann,你是完全正确的。我更新了我的答案以反映您的意见。谢谢!
  • 感谢您的解释,Alex,我还有一个问题。我仍然是 Ruby 的初学者,所以我不太了解 #{avg} 部分。这是在 Ruby 中计算平均值的唯一方法吗?初学者就没有别的办法了吗?我只是不想超越自己。
  • @JohnDoe,当你有puts "Average is " + avg 时,它会抛出这个错误TypeError: no implicit conversion of Fixnum into String。这是因为您试图将字符串与数字连接起来。要获得所需的输出(“平均值为 n”),您需要使用字符串插值。
【解决方案2】:

gets 返回 String,而不是数字。因此,您需要先致电to_i

此外:要返回 Float,您的计算需要在 / 的左侧或右侧有一个浮点值,否则它会返回 Integer(可能会出现意外情况):

(1 + 1 + 2) / 3
#=> 1
(1 + 1 + 2) / 3.0
#=> 1.3333333333333333

将您的代码更改为:

puts "Enter first"
num1 = gets.to_i
puts "Enter second"
num2 = gets.to_i
puts "Enter third"
num3 = gets.to_i
avg = (num1 + num2 + num3) / 3.0
puts "Average is #{avg}"

【讨论】:

  • #{avg} 是什么意思?没有其他方法可以计算平均值吗?
  • @JohnDoe "... #{avg} ..." 是一个字符串插值和一个常见的 Ruby 习语。与"... " + avg.to_s + " ..."基本相同。它的优点是它比使用+ 连接字符串更不容易出错,因为它会自动调用to_s,并且许多devs 认为它更易于阅读。
【解决方案3】:

我对 Ruby 一无所知,但如果它与 Python 类似,则必须将输入的字符串从字符串转换为整数。现在你的程序只是连接你输入的字符串,并且因为你不能在字符串上使用/而感到困惑。

编辑:您必须在输入上使用.to_i 方法将其转换为整数。

【讨论】:

    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2017-05-03
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多