如何从for循环中计算用户输入的数据

问题描述 投票:2回答:4
numbers = [1, 2, 3, 4, 5]

for num in numbers

  puts "insert q "
  qanswer1 = gets.chomp.to_i

  puts "insert 2nd q"
  qanswer2 = gets.chomp.to_i

end

此代码将重复问题5次。如何检索用户输入的数据?我正在尝试计算所有10个响应的总和以及每个对的总和最高的索引。

ruby
4个回答
0
投票

您需要在某些地方存储它们,否则,每个qanswer1和qanswer2的值都不会超出范围。

您可以使用数组并为每次迭代推送用户的输入:

numbers = [1, 2, 3, 4, 5]
acc = []

for num in numbers
  puts "insert q "
  acc << gets.chomp.to_i

  puts "insert 2nd q"
  acc << gets.chomp.to_i
end

另一方面。您可以得到相同的结果,而无需在范围外使用for循环和累加器。

result = 5.times.each_with_object([]) do |_, acc|
  puts "insert q "
  acc << gets.chomp.to_i

  puts "insert 2nd q"
  acc << gets.chomp.to_i
end

p result

请注意,因为您不仅仅使用变量numbers来控制迭代次数,还可以使用times方法。等于number中的元素数,您需要迭代5次。每个gets.chomp.to_i被压入累加器变量,然后将结果存储在变量中。


0
投票
nbr_pairs = 5

def ask(str)
  print "#{str}: "
  gets.to_i
end

arr = nbr_pairs.times.map { [ask("insert q"), ask("insert 2nd q")] }
  #=> [[7, 3], [8, 6], [2, 9], [4, 6], [8, 3]]

所有10个回复的总和

arr.flatten.sum
  #=> 56

最大对数的索引

nbr_pairs.times.max_by { |i| arr[i].sum }
  #=> 1 (8+6 = 14)

请参见Integer#timesArray#flattenEnumerable#max_byArray#sum


0
投票

我试图提供一种与您的解决方案尽可能接近的解决方案,同时仍然产生预期的结果:

numbers = [0,1,2,3,4]

pairs = Array.new(numbers.size, [])

numbers.each do |number|
  pairs[number] = []

  puts "q 1:"
  pairs[number] << gets.to_i

  puts "q 2:"
  pairs[number] << gets.to_i
end

要获得最大值的对:

max_value = pairs.max_by(&:sum)

获得所有对的总和:

sum_of_all_responses = pairs.flatten.sum

获得具有最高值的对的索引:

pairs.index(max_value)

0
投票

如果您不需要存储所有数据,则可以随时进行计算。

首先将输入请求移至一个将值对n返回数组的方法:

def ask
  puts "insert q "
  qanswer1 = gets.to_i
  puts "insert 2nd q"
  qanswer2 = gets.to_i
  [qanswer1, qanswer2]
end

然后设置变量

big_sum = 0
best_input = 0
best_input_q_number = nil

最后循环,就像做数学一样:

numbers = [1,2,3,4,5]

for n in numbers
# (1..5).each do |n| # this is more Ruby-ish
  p qanswers = ask # p for debug
  qanswers_sum = qanswers.sum
  big_sum += qanswers_sum
  if qanswers_sum > best_input
    best_input = qanswers_sum # or qanswers if you want to keep the pairs
    best_input_q_number = n
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.