1

我正在编写一个程序,它需要一组数据然后对其进行平均。该数据集是拉瓜迪亚机场每个月的平均温度,与温度相对应。

这是一个数据点的示例:

    2009-07,23.6

这是年月,温度。

我有 163 个数据点。所有数据点都在一个 .txt 文件中,每个都在一个新行上。

我将数据制作成一个数组并将其拆分。出于某种原因,我的程序每次尝试运行它时都说我的平均值为 0

这是我的代码:

data = File.open("avg_temp.txt", "r+")

contents = data.read

contents = contents.split("\r\n")

contents.collect! do |x|
        x.split(',')
end


sum = 0

data.each do |x|

sum = sum  + x[1].to_f

end

avg = sum / contents.length

puts avg
4

4 回答 4

2

avg = sum/contents.length结束后在循环外分配。在循环中定义的变量的范围仅限于该循环。你也在循环data,应该是content

contents.each do |x|

    puts x[1] # to check if the right value is being evaluated
    sum = sum  + x[1].to_f     

end

avg = sum/contents.length
于 2013-09-24T20:49:57.537 回答
2

avg不是顶级局部变量。因此,您无法从顶层访问它。avg仅限于块。您可以执行以下操作:-

avg = 0

data.each do |x|
  sum = sum  + temp[1].to_f
  avg = sum / contents.length
end

puts avg
于 2013-09-24T20:51:11.060 回答
1
sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
    avg = sum / contents.length
end
puts avg

avg变量不再在范围内,因为它在每个块之外。要打印平均值,只需将其移动到块内,如下所示

sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
    avg = sum / contents.length
    puts avg
end

或者将 avg 变量移到循环之外(在循环退出后执行一次操作)

sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
end

avg = sum / contents.length
puts avg

更多信息请访问http://rubyflare.com/2009/09/30/variables-scope-and-iterators/

于 2013-09-24T20:54:02.150 回答
0

我会更简单地写这个:

lines = 0
sum = 0

File.foreach("avg_temp.txt") do |data|
  sum += data.split(',').last.to_f
  lines = $.
end

puts 'Average: %f over %d datapoints' % [sum / lines.to_i, lines]
# >> Average: 23.375000 over 4 datapoints

哪个输出:

Average: 23.375000 over 4 datapoints

从“avg_temp.txt”开始,看起来像:

2009-07,23.6
2009-08,23.7
2009-09,23.6
2009-10,22.6

解释一下:

  • $.是当前行号。每次通过循环时,它都会重新分配最后读取的行号,lines以便我们知道要除以多少。
  • foreach逐行读取,因此无需拆分文件。这也解释了为什么我用它$.来跟踪元素的数量。这也意味着这可以毫无问题地读取一个包含数百万或数十亿值的文件,而read这会导致它崩溃。
于 2013-09-24T22:48:52.713 回答