def averager
puts "Put in three numbers. One per line"
num_1 = $stdin.gets.chomp.to_i
num_2 = $stdin.gets.chomp.to_i
num_3 = $stdin.gets.chomp.to_i
half_total = num_1 + num_2 + num_3
total = half_total / 3
end
好的,这是我正在努力的一点点平均水平。除了一件事,它工作正常。我希望用户决定他想输入多少个数字。这样我就不会仅限于三个数字来平均 。感谢
答案 0 :(得分:1)
这里用#
标记的注释中逐行说明def averager
puts "How many numbers?" #ask the user how many numbers
numbers = gets.chomp.to_i #get how many numbers
count = 1 #start the count variable for the while loop
half_total = 0 #half_total starts on zero
while(count <= numbers) do #while count is less than or equal to amount of numbers
puts "Enter #{count}° number" #puts "Enter 1°,2° or whatever number"
number = gets.chomp.to_i #get the actual number from the user
half_total = half_total + number #add it to your half total
count = count + 1 #add one to count so we go to the 2°,3° or wtv number
end #end the loop
total = half_total/numbers.to_f #divide half_total by the amount of numbers
#.to_f is used to force float division so decimals don't get cut
puts "The average is: #{total}" #prints the result
total #returns the result in case you don't want to print it
end #end of the function or method
这是通过一个简单的while循环来完成的,就像另一个答案所说的那样,如果你仍然对它们的工作方式感到困惑,请查看循环教程http://www.tutorialspoint.com/ruby/ruby_loops.htm
答案 1 :(得分:0)
def average(input_str)
arr = input_str.split
arr.inject { |sum, x| sum.to_i + x.to_i } / arr.size
end
puts "Please enter numbers you would like to average(separated by a space)"
input = gets.chomp
avg = average(input)
puts "The average is #{avg}"
用户会给我一串这样的数字:
Please enter numbers you would like to average(separated by a space)
1 2 3
我们调用一个带有字符串1 2 3
的函数,并将其放入一个包含拆分调用的数组中:
[1] pry(main)> input_str = "1 2 3"
=> "1 2 3"
[2] pry(main)> input_str.split
=> ["1", "2", "3"]
然后我们可以使用inject
方法总结该数组:
arr.inject { |sum, x| sum.to_i + x.to_i }
最后,我们将其除以总数组的大小。
答案 2 :(得分:0)
您可以尝试使用while
循环。 Here's a pretty good guide on Ruby中的循环。
然后在循环的每个阶段,向用户询问一个数字,或输入其他东西退出(例如,如果他们输入一个字符串则退出)。像这样:
puts "Enter a number: "
total = 0
count = 0
number = gets.chomp.to_i # you don't need $stdin here
while number != 0 # calling to_i on a String will return 0
total += number
count += 1
puts "Enter another number, or 'quit' to end: "
number = gets.chomp.to_i
end
average = total / count
这不是最优雅的方式,但可能更容易理解。
答案 3 :(得分:0)
获取未知数量参数的最简单方法是使用Kernel#loop。这将无休止地重复,直到您使用 break 关键字触发退出循环,或者引发StopIteration。
以下只需在数字 Array中收集任意数量的参数,直到您键入 q 或quit
后跟 RETURN 。然后根据数字中的项目数计算平均值,并将结果打印到标准输出。
def avg *args
args.flatten!
args.reduce(:+) / args.size
end
numbers = []
loop do
printf 'Enter number ("q" to quit): '
input = gets.downcase.chomp
case input
when ''
next
when /q(uit)?/
puts avg(numbers)
break
else
numbers << Float(input)
end
end
如果您需要完整的readline支持或关闭屏幕上的字符回声,您可以查看类似highline的宝石以获取其他功能。
Enter number ("q" to quit): 5
Enter number ("q" to quit): 10
Enter number ("q" to quit): 15
Enter number ("q" to quit): 20
Enter number ("q" to quit): q
12.5