2013-09-24 54 views
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 

回答

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

謝謝錯誤消失買mu平均爲0 – user2759592

+0

你在循環中有'temp [1]'但它沒有在任何地方定義..應該是'x [1]'? – tihom

+0

我做到了,但仍然說0 – user2759592

2

avg不是頂層局部變量。因此,您無法從頂層訪問它。 avg僅限於塊的範圍。您可以在下面做: -

avg = 0 

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

puts avg 
+0

這重新計算循環內沒有實際用途的'avg',作爲一種未使用的「運行平均值」。對於OP,它只需要*計算何時完成。 –

+0

@NeilSlater你是對的!我只是試圖顯示刪除錯誤,他可以做什麼.. –

+1

同意它絕對修復錯誤。 –

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 

或移動循環的平均變化外(執行一次動作,你的循環退出後)

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/

+0

進行了更改,但表示我的平均值爲0 – user2759592

+0

不確定變量'temp'的定義位置,但請參閱此示例: 'contents =(1..90).to_a; sum = 0;' 'contents.each {| x | sum + = x}#> 4095'這表明總和現在是== 4095 'avg = sum/contents.length#> 45'因此我們的平均值爲45. – Momer

+0

但是我的程序的整個目標是不要手動添加所有的溫度。我有數百個數據點 – user2759592

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 

Whic ħ輸出:

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 

要「splain它:

  • $.是當前行號。每次通過循環時,它會將最後一次讀取的行號重新分配到lines,以便我們知道要分配多少個行號。
  • foreach逐行讀取,因此不需要分割文件。這也解釋了爲什麼我使用$.來跟蹤元素的數量。這也意味着這可以讀取一個包含數百萬或數十億個值的文件,而不會出現問題,其中read就會癱瘓。