2017-01-04 65 views
0

我计算3个数字的平均值,用户将在Ruby中输入。我每次运行应用程序,用户将在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 
+1

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

回答

0

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

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

4

试试这个:

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}" 

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

+1

无论如何,当你计划调用to_i时,实际上不需要调用chomp。从文档:返回解释str中的前导字符作为整数基数(2到36之间)的结果。超过有效数字末尾的无关字符将被忽略。如果在str开头没有一个有效的数字,则返回0._只要删除'chomp',它没有什么区别。 – spickermann

+0

@spickermann,你是完全正确的。我更新了我的答案以反映您的意见。谢谢! –

+0

谢谢你解释它Alex,我还有一个问题。我仍然是Ruby的初学者,所以我不太了解#{avg}的部分。这是在Ruby中计算平均值的唯一方法吗?对于初学者来说没有别的办法吗?我只是不想领先于自己。 –

0

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}" 
+0

#{avg}是什么意思?没有其他方法来计算平均值? –

+0

@JohnDoe''...#{avg} ...“是一个字符串插值和一个常见的Ruby成语。它与'“...”+ avg.to_s +“...”'基本相同。它具有的优点是它比使用'+'将字符串串起来更容易出错,因为它会自动调用'to_s',并且很多[devs](https://github.com/bbatsov/ruby-style-guide#字符串插值)认为它更容易阅读。 – spickermann