Python - Programm das Münzen und Scheine zählt?
Hallo, ich versuche gerade ein Programm in Python zu schreiben in das man einen Betrag eingeben kann und vom Programm gesagt bekommt wie viele Euro Münzen/Scheine dafür mindestens nötig sind.
z.B. Man gibt 25€ ein und erhält als Antwort = 2 (ein 20€ Schein und ein 5€ Schein).
Die Eingabe und alles drumherum hab ich schon fertig und wenn man einen Euro Betrag eingibt wie 20€, 43€, 1700€ etc., funktioniert das Programm auch problemlos.
Nur bei manchen Cent Angaben fängt es an rumzuspinnen. So gibt das Programm bei 0.9 (also 90 Cent) ganz normale 3 Münzen/Scheine aus, aber bei anderen Cent Zahlen wie 0.3 (30 Cent) oder 0.7 (70 Cent) hängt es sich in einer endlos Schleife aus und gibt keine Antwort aus. dann hilft nur noch python neu zu starten.
Das ist Mein bisheriger Code (Nur für den Vorgang des Geldzählens):
while Betrag > 0:
if Betrag >= 500:
Betrag = Betrag - 500
counter = counter +1
elif Betrag >= 200:
Betrag = Betrag - 200
counter = counter +1
elif Betrag >= 100:
Betrag = Betrag - 100
counter = counter +1
elif Betrag >= 50:
Betrag = Betrag - 50
counter = counter +1
So geht mein Code weiter für bis hin zu 0.01, für ein Cent.
Ich weiß echt nicht warum dieser Fehler auftritt und brauche Hilfe.
3 Antworten
Dein Problem wird hier erklärt:
https://www.youtube.com/watch?v=PZRI1IfStY0
Führe mal in Python aus:
print(0.3-0.2)
Das Ergebnis wird dich vielleicht erstaunen.
...
print(round(0.3-0.2,2)) macht da eher das was du möchtest.
Außerdem würde ich statt exit() break benutzen, um einfach aus der while Schleife zu springen. Hoffe ich konnte helfen.
Unnötig das Programm zu crashen, wenn man doch einfach "breaken" kann und das Programm normal beendet wird. Vorgeschlagen habe ich es aber, weil break die Endlosschleifen behoben hat (weiß nicht genau wieso). Darüber hinaus ist es meines Wissens nach good practice sys.exit() zu verwenden statt exit(), wenn man das Programm eben doch direkt beenden möchte.
Aber trotz all dem, einfach nur exit() sollte in der Theorie eigentlich auch funktionieren.
Ok danke, jetzt versteh ich aufjedenfall wenigstens das Problem :D.
Jetzt muss ich nur leider irgendwie einen komplett neuen Lösungsansatz finden :C da ich mich mit greedy algorithmen bisher noch nie auseinander gesetzt habe.
Es gibt sicherlich elegantere Möglichkeiten...
Aber wenn du einfach nur einen quick fix für deinen Algorithmus willst, dann schreibe einfach immer:
Betrag = round( Betrag - 0.1 , 2 )
Damit bekommst du einen auf 2 Nachkommastellen gerundeten Wert.
Erstmal der Code is so naja xD
zweitens der Algorithmus den du nutzt nennt sich Greedy. (Größtes zuerst)
drittens. Wenn es im Cent Bereich Fehler gibt, wär vielleicht der Code für den Cent Bereich wichtig...
Erstmal Danke für die schnelle Antwort :D.
Ja ich weiß das der Code nicht so bombe ist :D, aber ich bin noch ein ziehmlicher Programmieranfänger und ich bin schon froh drüber wenn ich das Programm überhaupt erstmal irgendwie zum laufen kriege :).
Und ja sorry hier ist noch der Code für den Cent Bereich, ist aber im Grunde das selbe:
elif Betrag >= 1:
Betrag = Betrag - 1
counter = counter +1
elif Betrag >= 0.5:
Betrag = Betrag - 0.5
counter = counter +1
elif Betrag >= 0.2:
Betrag = Betrag - 0.2
counter = counter +1
elif Betrag >= 0.1:
Betrag = Betrag - 0.1
counter = counter +1
elif Betrag >= 0.05:
Betrag = Betrag - 0.05
counter = counter +1
elif Betrag >= 0.02:
Betrag = Betrag - 0.02
counter = counter +1
elif Betrag >= 0.01:
Betrag = Betrag - 0.01
counter = counter +1
elif Betrag < 0.01 and Betrag >0:
print "Der Betrag geht nicht"
exit ()
elif Betrag < 0:
print "Der Betrag geht nicht"
exit ()
Danke nochmal an alle die geantwortet haben :D.
Hab die Float Ungenauigkeit jetzt umgangen indem ich den eingegebenen Wert *100 nehme, also aus € Cents mache und diesen Wert dann nochmal Runde.
Damit konnte das Programm dann ohne Probleme weiter rechnen.
Wozu nochmal unnötig in den Kontext springen, wenn das komplette Programm beendet werden soll?