2016-03-28 3 views
2

Ich habe mit dem Lernen von Web Dev in der Vergangenheit geflirtet und hatte nicht die Zeit, da ich ein Vollzeit-Business-Student bin.Mein Programm speichert/zeigt nicht alle Rechnungen, die ich hinzugefügt habe

Ich begann heute wieder zu graben und beschloss, eine Pause vom Lernen zu machen und zu üben, was ich heute gelernt habe, indem ich ein einfaches Programm schrieb, das dem Benutzer erlaubt, ihre Rechnungen einzugeben und schließlich berechnen wird, wie viel verfügbares Einkommen sie haben haben nach ihren Rechnungen jeden Monat bezahlt.

Mein Problem ist, dass das Programm perfekt läuft, die Schleife wird fortgesetzt/beendet, wenn es sollte, aber entweder speichert das Programm nicht die Benutzereingabe im Hash, wie ich es will oder es zeigt nicht alle an Rechnungen eingegeben, wie es sollte. Hier ist mein Programm:

# 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 

Meine Fragen sind: Ist mein Hash ordnungsgemäß eingerichtet, die Schlüssel/Wert-Paare aus dem Benutzer-Eingang zu speichern? Wenn nicht, wie kann ich das korrigieren?

Ich bekomme nur die letzte Rechnung, die vom Benutzer eingegeben wurde. Ich habe mehrere Rechnungen gleichzeitig ausprobiert, aber nur den letzten Eintrag bekommen.

Wie ich schon sagte, ich bin ein Noob, aber ich bin sehr ehrgeizig zu lernen. Ich habe auf die Ruby-Dokumentation zu Hashes verwiesen, um zu sehen, ob ein Fehler in meinem Code vorliegt, aber ich konnte eine Lösung finden (finde mich immer noch in der ruby-Dokumentation zurecht).

Jede Hilfe wird geschätzt! Wenn Sie darüber hinaus Empfehlungen dazu haben, wie ich meinen Code effizienter gestalten kann, könnten Sie mich dann in die Richtung weisen, in der ich die entsprechenden Informationen dazu erhalten kann?

Vielen Dank.

Bearbeiten:

Die Hauptfrage wurde beantwortet. Dies ist eine Follow-up-Frage auf das gleiche Programm - ich bin eine Fehlermeldung budget_calculator.rb bekommen: 35: in -': Hash can't be coerced into Float (TypeError) from budget_calculator.rb:35:in '

Aus dem folgenden Code (beachten das Programms oben) -

# 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 

Ich verstehe, dass der Fehler aus dieser Codezeile erscheint: disposable_income = net_income - bills_hash.each {| value | Wert}

Ich verstehe nur nicht, warum das nicht akzeptabel ist. Ich versuche, alle Werte im Hash (pay_amt) vom Nettoeinkommen zu subtrahieren, um das verfügbare Einkommen abzuleiten.

+0

Wenn jemand eine Idee über die Fehlermeldung hat, wurde dieser Teil immer noch nicht beantwortet. –

+0

Ich fand die Antwort auf den zweiten Teil der Frage, indem Sie Enumerable # inject verwenden, um die pay_amt-Werte im Hash zu addieren, und dann die Summe vom Nettoeinkommen subtrahieren. Hier ist die folgende Codelösung: tot_bills = bills_hash.values.inject {| a, b | a + b} –

+0

Willkommen bei Stack Overflow. Bitte erwarten Sie nicht, dass mehrere Fragen auf einer Seite beantwortet werden, es sei denn, sie sind sehr nahe beieinander. Mehrere Fragen sind schwer eindeutig zu beantworten, und anderen fällt es schwer, ähnliche Lösungen zu finden. Denken Sie daran, SO ist ein Nachschlagewerk oder Programmier-Kochbuch für Lösungen für spezifische Probleme. Bitte seien Sie auch sehr kurz, wenn Sie fragen; Programmierung ist kurz und wir mögen die Kürze. "Danke" und "Bearbeiten" sind auch nicht wünschenswert; Wir nehmen an, dass Sie dankbar sind, und "Bearbeiten" oder "Aktualisieren" lenkt nur ab. Setzen Sie den Text an die Stelle, an der er ursprünglich hätte sein sollen. –

Antwort

4

Dies ist der Teil, den Sie wird immer:

bills = {} 

Sie die Hash-Schleifen jedes Mal das Programm sind zurückgesetzt wird. Versuchen Sie, bills an der Spitze des Programms zu deklarieren.


Was Ihre zweite Frage zu bills_hash, es funktioniert nicht, weil das Programm einen Hash von einem Schwimmer zu subtrahieren versucht. Sie haben die richtige Idee, aber die Art und Weise, wie es eingerichtet ist, wird nicht einfach jeden Schlüssel von der net_income subtrahieren.

Der Rückgabewert von #each ist der ursprüngliche Hash, den Sie durchlaufen haben. Sie können dies sehen, wenn Sie offen IRB und Typ

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

Der Block für jedes Element der Liste ausgewertet, aber der endgültige Rückgabewert ist die ursprüngliche Liste:

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

So nach der Reihenfolge Operativ ist Iterieren Ihr #each Block, dann das ursprüngliche bills_hash Hash zurückkehrt, und dann diese Hash von net_income abzuziehen versuchen, die wie folgt aussieht (vorausgesetzt, meine net_income 1000):

1000 - {rent: 200, video_games: 800} 

daher der Fehler.

Es gibt ein paar Möglichkeiten, wie Sie das beheben können. Man würde alle Werte in bills_hash als seine eigenen Variable zu summieren, dann subtrahieren, die von den net_income:

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

die gleichen #inject Methode verwenden, dies auch in einem Funktionsaufruf getan werden könnte:

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

Siehe Dokumentation für Enumerable#inject.

Es ist eine sehr mächtige und nützliche Methode zu wissen. Aber stellen Sie sicher, dass Sie zurückgehen und verstehen, wie die Rückgabewerte funktionieren und warum das ursprüngliche Setup eine Ausnahme ausgelöst hat.

+0

Danke für die Antwort. Das war genau mein Problem; Noob Fehler. –

+0

Gern geschehen! Würde es Ihnen etwas ausmachen, dies als die richtige Antwort zu markieren? – sixty4bit

+1

Ich habe es versucht, aber ich habe noch kein Level 15 Abzeichen, also kann ich es nicht markieren. Sobald ich dazu in der Lage bin, werde ich zurückkommen und es markieren. –

Verwandte Themen