Как можно сложить вычисленные значения из предыдущих итераций цикла? - PullRequest
0 голосов
/ 13 октября 2019

Мне было интересно, если бы можно было сохранить и суммировать предыдущие значения из предыдущей итерации цикла.

Итак, у меня есть этот код для циклического перебора массива продуктовых предметов, а затем для подведения итогов того, сколько из них покупается на особый предмет. Вот мой код.

groceries = %w[apples quinoa peppers milk butter]

item = 0

groceries.each do |_i|
  puts 'what groceries are you getting?'
  grocery_choice = gets.chomp

  apples = 2.30
  quinoa = 2.75
  milk = 1.80
  butter = 3.25
  peppers = 3.00

  puts "how many #{grocery_choice} are you getting?"
  number_of_particular_grocery = gets.to_i

  if grocery_choice == 'apples'
    item = apples
  elsif grocery_choice == 'quinoa'
    item = quinoa
  elsif grocery_choice == 'milk'
    item = milk
  elsif  grocery_choice == 'butter'
    item = butter
  elsif  grocery_choice == 'peppers'
    item = peppers
  elsif grocery_choice == 'none'
    break
  end

  total = item * number_of_particular_grocery
  puts "when you buy #{number_of_particular_grocery} #{grocery_choice} it costs #{total}"

  total += total
end

puts " your total grocery bill is #{total.sum { |total, _t| total }}"

Последняя строка разбита, но я пытаюсь сделать это, по сути,

total_cost = total_milk + total_butter + total_apples + total_peppers

, но без явной записи в программе. Есть ли способ сохранить total из предыдущей итерации цикла и добавить к следующей total из итерации цикла после нее?

Ответы [ 3 ]

1 голос
/ 13 октября 2019

Я бы перезапустил вашу проблему и рассмотрел бы что-то вроде следующего:

GROCERY = {
    apples: 2.30, 
    quinoa: 2.75,
    peppers: 3.00,
    milk: 1.80,
    butter: 3.25
}

def add_grocery_item(bag, item, qty)

    bag.push([item, qty, GROCERY[item]])

end

if __FILE__ == $0

    grocery_bag = []

    add_grocery_item(grocery_bag, :apples, 10)
    add_grocery_item(grocery_bag, :quinoa, 1)
    add_grocery_item(grocery_bag, :milk, 2)
    add_grocery_item(grocery_bag, :butter, 3)
    add_grocery_item(grocery_bag, :apples, 7)
    add_grocery_item(grocery_bag, :quinoa, 6)
    add_grocery_item(grocery_bag, :milk, 6)
    add_grocery_item(grocery_bag, :butter, 9)

    p grocery_bag.reduce(Hash.new(0)){|acc, e| acc[e[0]] += e[1] * e[2]; acc}
end

Это всего лишь отправная точка для рассмотрения.

0 голосов
/ 13 октября 2019

То, как вы пишете это, перебирая продукты, не требует ввода данных пользователем, чтобы выбрать продукт, вы можете просто спросить, сколько из каждого типа они получают, и соответственно добавить цену.

Как и другиеЯ предложил вам суммировать стоимость каждого бакалеи, как вы, а затем добавлять ее каждый раз, используя аккумулятор += к общему количеству, определенному вне цикла.

В качестве дополнительного касания вы можете округлить свои числа до2 десятичных знака с использованием .round(2).

Надеюсь, этот пример поможет.

groceries = %w[apples quinoa peppers milk butter]
total = 0

groceries.each do |grocery_type|
  puts "how many #{grocery_type} are you getting?"
  number_of_particular_grocery = gets.to_i

  if grocery_type == 'apples'
    item_price = 2.30
  elsif grocery_type == 'quinoa'
    item_price = 2.75
  elsif grocery_type == 'milk'
    item_price = 1.80
  elsif  grocery_type == 'butter'
    item_price = 3.25
  elsif  grocery_type == 'peppers'
    item_price = 3.00
  else
    break
  end
  current_grocery_cost = (item_price * number_of_particular_grocery)

  total += current_grocery_cost
  puts "when you buy #{number_of_particular_grocery} #{grocery_type} it costs #{current_grocery_cost}"
end

puts " your total grocery bill is #{total.round(2)}"
0 голосов
/ 13 октября 2019

Вот как я бы это сделал:

prices = {
  apples: 2.30,
  quinoai: 2.75,
  milk: 1.80,
  butter: 3.25,
  peppers: 3.00
}

shopping_list = Hash.new(0)

loop do
  puts 'what groceries are you getting?'
  grocery_choice = gets.chomp.to_sym
  break if grocery_choice.empty?

  unless prices.has_key?(grocery_choice)
    puts 'Nope, we do not have that'
    next
  end

  puts "how many #{grocery_choice} are you getting?"
  number_of_particular_grocery = gets.to_i

  shopping_list[grocery_choice] += number_of_particular_grocery
end

total = shopping_list.map { |grocery, quantity| prices[grocery] * quantity }.reduce(:+)
puts " your total grocery bill is #{total}"

Что я сделал:

  • Объединение вашего списка покупок и ценовых переменных в один хэш, чтобы информация находилась вПростое выполнение и обновление базы данных о продуктах
  • Новый список покупок Hash со значением по умолчанию 0 будет содержать заказанные продукты с их количеством
  • Бесконечный цикл, выход при нажатии Enter илипервый вопрос
  • Хэш цен позволяет обнаружить входные данные grocery_choice
  • В конце список покупок сначала сопоставляется с массивом, содержащим промежуточные итоги для каждой бакалеи. Затем массив промежуточных итогов сокращается с помощью оператора суммы, эффективно вычисляя сумму всех записей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...