2015-09-06 67 views
0

我正在嘗試執行一個程序,要求用戶每次輸入一個三位數字,將它們存儲在數組中,然後打印出數字和總數的列表。總計在Ruby數組

請解釋。

這是我到目前爲止有:

numbers = Array.new 
numbers = [] 
puts "Enter first number: " 
first = gets.to_i 
puts "Enter second number: " 
second = gets.to_i 
puts "Enter third number: " 
third = gets.to_i 
def sum(numbers) 
    return 0 if numbers.length < 1 
    result = 0 
    numbers.each { |num| result += num } 
    result 
end 
+2

也許你需要將它們添加到陣列以及? –

+0

你爲什麼要做兩個'數字'數組,它們是相同的? – ifma

+1

我是新的紅寶石,所以我不知道我在做什麼 – Samba

回答

2

你也可以使用Array的reduce方法。

http://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-reduce

#!/usr/bin/ruby 
numbers = Array.new 
# numbers = [] #this is same as above 
puts "Enter first number: " 
first = gets.to_i 
numbers<<first 
puts "Enter second number: " 
second = gets.to_i 
numbers<<second 
puts "Enter third number: " 
third = gets.to_i 
numbers<<third 
puts numbers.reduce {|sum, n| sum + n } #here 
+4

沒有必要定義臨時變量'first','second'和'third';只需要寫三次'numbers << gets.to_i'。另外,你可以計算總和爲'numbers.reduce(:+)'。 –

+0

@CarySwoveland你甚至可以使用'3.times.map {gets.to_i} .reduce(:+)'作爲'times'返回'Enumerator'(如果沒有給出的塊)。 – Hauleth

+0

@Hauleth,差不多。見魔杖的答案。 –

0

您還沒有推你的任何投入的數組,你可以使用推送功能或< <將元素添加到您的陣列

#!/usr/bin/ruby 
numbers = Array.new 
numbers = [] 
puts "Enter first number: " 
first = gets.to_i 
numbers<<first 
puts "Enter second number: " 
second = gets.to_i 
numbers<<second 
puts "Enter third number: " 
third = gets.to_i 
numbers<<first 
def sum(someArray) 
    return 0 if someArray.length < 1 
    result = 0 
    someArray.each { |num| result += num } 
    result 
end 

希望幫助

+0

謝謝,但它仍然沒有顯示總數 – Samba

0

這裏有兩個問題:

  1. 您還沒有推你讀的數字爲
  2. 您正確定義的sum功能的陣列,但不調用它的任何地方


#!/usr/bin/ruby 
numbers = Array.new # note the second, redundant, initialization on numbers was removed 
puts "Enter first number: " 
(numbers ||= []) << gets.to_i # Pushing read value into the array (issue 1) 
puts "Enter second number: " 
(numbers ||= []) << gets.to_i # Here too 
puts "Enter third number: " 
(numbers ||= []) << gets.to_i # And here too 
def sum(numbers) 
    return 0 if numbers.length < 1 
    result = 0 
    numbers.each { |num| result += num } 
    result 
end 

puts sum(numbers) # Calling sum (issue 2) 
+0

現在很清楚:) 謝謝 – Samba

+1

考慮到你已經初始化'數字'爲一個空數組,爲什麼'(數字|| = [ ])<< gets.to_i'而不是簡單的'numbers << gets.to_i'?此外,通常使用'Hash#reduce'來計算簡單的總和。 –

+0

我也不需要'|| ='。 – Borsunho

2

這裏是這樣做的另一種方式:

sum = 3.times.collect{ |i| puts "Enter number #{i + 1}:"; gets.chomp.to_i }.inject(:+) 
puts sum 

也可以這樣寫如下:

read_num = lambda{|i| puts "Enter number #{i}"; gets.chomp.to_i} 
sum = 3.times.map(&read_num).reduce(:+) 
puts sum 
+0

..或'%w |第一第二第三| .collect {| w |放入「輸入#{w}數字」; ...'。我建議你重新格式化,以避免水平滾動的需要。 –

+0

@CarySwoveland - 是的一種可能性 - 認爲做'N次'的靈活性可能是個好主意。 –