2015-09-06 65 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次'的灵活性可能是个好主意。 –