【问题标题】:Cant figure out where I am making mistake无法弄清楚我在哪里犯错
【发布时间】:2019-09-10 13:08:26
【问题描述】:
def average_of_three(num1, num2, num3)​

  puts "Enter first number"
  num1= gets.to_i

  puts "Enter second number"
  num2 = gets.to_i

  puts "Enter third number"
  num3 = gets.to_i

  avg=0

  avg = (num1 +num2 + num3 )/3
  puts "your average is#{avg}"
end

【问题讨论】:

  • 有什么问题?

标签: ruby


【解决方案1】:

如果您调用该方法,此代码应该可以工作,但该方法不需要参数。无论如何,这些变量都是在本地声明的。

现在你会做:

average_of_three(0, 0, 0)

初始值无关紧要,因为无论如何您都会忽略它们。它们可能是 :zero"Who cares!" 一样。

虽然这不是非常 Ruby 代码。在编写 Ruby 时,首先要考虑数据结构。

例如获取三个值:

def get_n(n = 3)
  n.times.map do |i|
    print "Enter number #{i+1}: "
    gets.to_i
  end
end

这会提出一系列问题并将结果存储在一个数组中,这就是map 所做的。

现在你可以平均这些:

def average(values)
  return unless (values.any?)

  values.sum / values.length
end

这有一个保护子句,除非有至少一个值,否则它不会执行。然后它调用sum,这并不奇怪将所有值相加。除以长度就完成了。

所以你要把这一切联系在一起:

values = get_n

puts "Average is: #{average(values)}"

注意:在 Ruby 中,当你用一个整数除以一个整数时,你总是得到一个整数。这意味着值会四舍五入。如果您希望得到分数结果,您可以将输入转换器从.to_i 切换到.to_f。该更改将导致浮点数流经其余代码。

【讨论】:

  • 这些天来,我更喜欢使用 fdiv 而不是将 to_f 附加到所有内容上。
  • @SergioTulentsev 怎么样?
  • 我猜看起来更干净,更有意图。直接说“我想从中得到一个浮动”,而不是依赖于我们碰巧收到的任何类型的默认行为。
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多