我正在编写一个程序,它接受一组数据然后对其进行平均。该数据集是拉瓜迪亚机场每个月的平均温度,与温度相对应。
以下是一个数据点示例:
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
答案 0 :(得分: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
答案 1 :(得分:2)
您的avg
不是顶级本地变量。因此,您无法从顶层访问它。 avg
仅限于块。你可以在下面做: -
avg = 0
data.each do |x|
sum = sum + temp[1].to_f
avg = sum / contents.length
end
puts avg
答案 2 :(得分: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/
的更多信息答案 3 :(得分: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
会跪在地上。