@Pitwheazle: 1,200 mag ”falsch” sein, aber 1,2 € eben auch. Muss man halt je nach Situation passenden Code dafür schreiben. Aber eben mehr explizit, eine Funktion `format_number()` und eine `format_currency()` statt das mit `round()`, `format()`, und `replace()` überall ad hoc, über den kompletten Ausdruck verteilt, und mit potentiellen Nebenwirkungen für *alle* Punkte in einer Zeichenkette zu machen.
`NOTES` wäre tatsächlich ein Kandidat für eine Konstante, die definiert man dann aber nicht in einer Funktion oder Methode. Die ``while``-Schleife bei der Auswahl ist ein bisschen umständlich. Da dann sowieso eine Kopie der Teilliste erstellt wird, könnte man hier auch einfach eine neue Liste mit einer „list comprehension“ erstellen und da die Filterung als Bedingung einbauen.
Im Fall des 2€-Stücks fehlt ein Platzhalter in der Zeichenkette und bei Zahlen <0 fehlt ein "f" beim Format in der Vorlage.
Weiterer Fehler `loesung` basiert nicht immer auf ``zahl2 - zahl1`` was dann dem letzten Wert im Rückgabetupel widerspricht.
Diese Fehler sind IMHO ein guter Grund die Aufgabenerstellungen in Funktionen heraus zu ziehen, die man einzeln testen kann. Oder besser noch einen Datentyp dafür einführen, denn das Ergebnis besteht aus fast schon zu vielen Einzelteilen.
Zwischenstand (ungetestet):
Code: Alles auswählen
import random
DENOMINATIONEN = [2, 5, 10, 20, 50, 100]
...
def format_number(value, precision=2, trailing_zeros=False):
text = f"{value:.{precision}f}".replace(".", ",")
return text.rstrip(",0") if not trailing_zeros and "," in text else text
...
...
...
aufgabentyp = random.randint(aufgabentyp_anfang, aufgabentyp_ende)
#
# Wechselgeld.
#
if aufgabentyp == 1:
zahl1 = random.randint(5, 5950) / 100
zahl2 = random.choice(
[wert for wert in DENOMINATIONEN if wert > zahl1]
)
geld_art = "Schein" if zahl2 > 2 else "Stück"
text = (
f"Du hast für {format_number(zahl1, 2, True)}€ eingekauft und"
f" bezahlst mit einem {format_number(zahl2)}€ {geld_art}."
f" Wieviel Wechselgeld erhälst du?"
)
pro_text = (
f"Wechselgeld: {format_number(zahl2)}€"
f" - {format_number(zahl1, 2, True)}€"
)
loesung = zahl2 - zahl1
loesungstext = f"{format_number(loesung, 2, True)}€"
#
# Ganze Zahlen.
#
elif aufgabentyp <= 3:
zahl1 = 10 ** random.randint(2, 4)
zahl2 = random.randint(1, zahl1 - 1)
text = pro_text = f"ergänze {zahl2} zu {zahl1}"
loesung = zahl2 - zahl1
loesungstext = str(loesung)
#
# Zahlen kleiner 0
#
else:
exponent = random.randint(0, 2)
zahl1 = 10 ** (-1 * exponent)
zahl2 = random.randint(1, 9) * zahl1 / 10
text = pro_text = (
f"ergänze {format_number(zahl2, exponent)} zu"
f" {format_number(zahl1)}"
)
loesung = zahl2 - zahl1
loesungstext = format_number(loesung, exponent)
return aufgabentyp, text, pro_text, loesungstext, loesung