2016-03-28 3 views
2

Я флиртовал с обучением веб-разработчиков в прошлом, и у меня не было времени, поскольку я полный рабочий день Business Student.Моя программа не сохраняет/отображает все счета, которые я добавил

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

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

# This program allows you to assign monthly payments 
# to their respective bills and will automatically 
# calculate how much disposable income you have 
# after your bills are paid 

# Prompts user to see if they have any bills to enter 
puts "Do you have any bills you would like to enter, Yes or No?" 
new_bill = gets.chomp.downcase 
until new_bill == 'no' 

# Creates a hash to store a key/value pair 
# of the bill name and the respection payment amount 

    bills = {} 
    puts "Enter the bill name: " 
    bill_name = gets.chomp 
    puts "How much is this bill?" 
    pay_amt = gets.chomp 

    bills[bill_name] = pay_amt 

    puts "Would you like to add another bill, Yes or No?" 
    new_bill = gets.chomp.downcase 
end 

bills.each do |bill_name, pay_amt| 
    puts "Your #{bill_name} bill is $#{pay_amt}." 
end 

Мои вопросы: Настроен ли мой хэш правильно хранить пары ключ/значение от входа пользователей? Если нет, как я могу его исправить?

Я получаю только последний счет, введенный пользователем. Я пробовал несколько счетов за раз, но получаю только последнюю запись.

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

Любая помощь приветствуется! Кроме того, если у вас есть какие-либо рекомендации относительно способов повышения эффективности моего кода, не могли бы вы указать мне в том направлении, где я могу получить соответствующую информацию?

спасибо.

Редактировать:

Главный вопрос был дан ответ. Это прослеживание вопрос к той же программе - я получаю сообщение об ошибке budget_calculator.rb: 35: в -': Hash can't be coerced into Float (TypeError) from budget_calculator.rb:35:in '

Из следующего кода (имейте в виду, программы выше) -

# Displays the users bills 
bills_hash.each {|key,value| puts "Your #{key} bill is $#{value}."} 

# Get users net income 
puts "What is your net income?" 
net_income = gets.chomp.to_f 

#Calculates the disposable income of the user 
disposable_income = net_income - bills_hash.each {|value| value} 

puts disposable_income 

Я понимаю, что ошибка появляется из этой строки кода: disposable_income = net_income - bills_hash.each {| value | значение}

Я просто не понимаю, почему это неприемлемо. Я пытаюсь вычесть все значения хэша (pay_amt) из чистого дохода для получения располагаемого дохода.

+0

Если кто-то имеет представление об ошибке, эта часть еще не ответила. –

+0

Я нашел ответ на вторую часть вопроса, используя Enumerable # inject для суммирования значений pay_amt в хэше, а затем вычитал общее из чистого дохода. Ниже приведено следующее решение: tot_bills = bills_hash.values.inject {| a, b | a + b} –

+0

Добро пожаловать в переполнение стека. Не ожидайте ответа на несколько вопросов на одной странице, если они не очень близки; Множество вопросов трудно ответить четко, и им трудно выполнять другие при поиске похожих решений. Помните, что SO - справочная книга или кулинарная книга программирования для решения конкретных проблем. Также, пожалуйста, будьте очень кратки, когда спрашиваете; Программирование является кратким, и нам нравится краткость. «Спасибо» и «Редактировать» тоже нежелательны; Мы предполагаем, что вы благодарны, а «Изменить» или «Обновить» только отвлекает. Поместите текст там, где он должен был быть изначально. –

ответ

4

Это та часть, которая получает вас:

bills = {} 

Вы сброса Хэш каждый раз, когда петли программы. Попробуйте объявить bills в верхней части программы.


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

Возвращаемое значение #each - это оригинальный хеш, который вы перебираете. Вы можете увидеть это, если вы откроете IRB и тип

[1,2,3].each {|n| puts n} 

Блок вычисляется для каждого элемента списка, но окончательное возвращаемое значение является первоначальный список:

irb(main):007:0> [1,2,3].each {|n| puts n} 
1 
2 
3 
=> [1, 2, 3] # FINAL RETURN VALUE 

Итак, в соответствии с порядком операций, ваш #each блок итерация, а затем возвращая первоначальную bills_hash хэш, а затем пытается вычесть этот хэш из net_income, который выглядит следующим образом (при условии, что я net_income 1000):

1000 - {rent: 200, video_games: 800} 

отсюда ошибка.

Есть несколько способов, которыми вы могли бы исправить это. Можно было бы суммировать все значения в bills_hash в своей собственной переменной, а затем вычесть, что из net_income:

total_expenditures = bills_hash.values.inject(&:+) # sum the values 
disposable_income = net_income - total_expenditures 

Используя тот же #inject метод, это также может быть сделано при вызове одной функции:

disposable_income = bills_hash.values.inject(net_income, :-) 
# starting with net_income, subtract each value in turn 

См. Документацию для Enumerable#inject.

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

+0

Спасибо за ответ. Это был именно мой пример; noob ошибка. –

+0

Добро пожаловать! Не могли бы вы отметить это как правильный ответ? – sixty4bit

+1

Я пробовал, но у меня нет значка 15-го уровня, поэтому я не могу его пометить. Как только я смогу, я вернусь и отметю его. –

Смежные вопросы