2011-04-26 79 views
1

我正在寫一個紅寶石腳本,將獲得數字和輸出的中位數。這是我的代碼幫助中位數在紅寶石

numbers = Array.new  
numbers = [gets]  
def median(numbers)  
    sorted = numbers.sort 
    mid = numbers.length/2 sorted[mid] 
    numbers.push mid  
end 
end 

當你運行它,它要求的數字,但不會給中位數...

回答

1

這是一個家庭作業?

首先確保您的輸入是您認爲他們是。我把你的代碼放在一個名爲median.rb的文件中,然後運行rdebug。注意數字陣列的內容[變得]後

$ rdebug median.rb 
median.rb:1 
numbers = Array.new 
(rdb:1) n 
median.rb:2 
numbers = [gets] 
(rdb:1) n 
1 2 3 4 5 6 7 
median.rb:5 
def median(numbers) 
(rdb:1) p numbers 
["1 2 3 4 5 6 7\n"] 
(rdb:1) p numbers[0] 
"1 2 3 4 5 6 7\n" 
(rdb:1) p numbers[0].class 
String 
(rdb:1) 
+0

是的,這是一個家庭作業。教科書是廢話,並沒有真正的幫助。 – Help 2011-04-26 02:54:22

2

你永遠不會調用值法,你只定義它。

1

這裏有一些monkeypatches我可枚舉上使用,其中包括一個位數:

module Enumerable 
    # Does not sort the values; do this yourself before calling if you like 
    def median(&blk) 
    values = blk ? map(&blk) : self 
    values[ values.length/2 ] 
    end 
    def sum(&blk) 
    values = blk ? map(&blk) : self 
    values.inject(0){ |sum,v| sum + v } 
    end 
    def average(&blk) 
    (length==0) ? 0 : (sum(&blk) * 1.0/length) 
    end 
    alias_method :avg, :average 
    def std_dev(&blk) 
    values = blk ? map(&blk) : self 
    mean = values.average 
    Math.sqrt(values.map{ |value| (value-mean)*(value-mean) }.average) 
    end 
    def dups_by 
    keyvals = Hash.new{|h,v|h[v]=[]} 
    each{ |v| keyvals[yield(v)] << v } 
    result = [] 
    keyvals.each{ |k,v| result << v if v.length > 1 } 
    result 
    end 
end 
1

這裏有幾個問題:

  1. 你有一個額外end關鍵字是:你已經什麼張貼在這裏是不需要的。
  2. gets返回一個字符串。例如,您可以收集分隔的數字空間並從中創建一個數組。
  3. 你不叫median,這就是爲什麼它不會給你中位數。

因此,像這樣將工作:

def median(numbers)  
    sorted = numbers.sort 
    numbers[numbers.length/2] 
end 

p median(gets.split(' ')) 
3
def median(array) 
    array.sort! 
    if array.length % 2 == 0 
    median_value = (array[array.length/2] + array[array.length/2 - 1])/2.0 
    else 
    median_value = array[array.length/2] 
    end 
end