Seite 1 von 1

Nur Ganzzahlen als Eingabemöglichkeit

Verfasst: Dienstag 18. Oktober 2022, 11:29
von Flamme_W
Moin,
ich bin noch frischling und benötige mal eure Hilfe bei einem Problem:
ich möchte das in dieser Funktion nur die Eingabe von Ganzzahlen möglich ist. :shock:
Sollte der Benutzer etwas anderes eingeben, soll die Frage nochmal gestellt werden.
Ich denke man könnte eine While-Schleife verwenden.. :D
Vielleicht hat jemand eine smarte Erklärung für mich !

Code: Alles auswählen

rotwein = 12.99
rosewein = 9.98
weisswein = 11.99
 
    
def bestellung():
    print("Wieviel Wein möchtest du?")
    zahl_rot = int(input("Anzahl Rotwein: "))
    zahl_rose = int(input("Anzahl Rosewein: "))
    zahl_weiss = int(input("Anzahl Weißwein: "))
    ergebnis = (zahl_rot*rotwein) + (zahl_rose*rosewein) + (zahl_weiss*weisswein)
    print("Der Gesamtbetrag ist", round(ergebnis,2), "Euro.")
    
bestellung()

Re: Nur Ganzzahlen als Eingabemöglichkeit

Verfasst: Dienstag 18. Oktober 2022, 12:37
von Sirius3
Ja man könnte eine while-Schleife verwenden. Man muß nur die Exception bei nicht-Ganzzahlen abfangen.

`zahl` ist etwas anders als eine Anzahl. Daher solltest Du Deine Variablennamen auch so nennen. Konstanten schreibt man komlett gross: ROTWEIN_PREIS_IN_EURO.
Für die Ausgabe benutzt man f-Strings:

Code: Alles auswählen

print(f"Der Gesamtbetrag ist {ergebnis:.2f} Euro.")

Re: Nur Ganzzahlen als Eingabemöglichkeit

Verfasst: Dienstag 18. Oktober 2022, 12:44
von __blackjack__
@Flamme_W: Ja, da würde man eine ``while True:``-Schleife verwenden. Und ``try``/``except``/``else`` mit der Ausnahme die dabei auftreten kann, um die entsprechend zu behandeln. Und Du solltest da dann auch noch negative Zahlen nach der Umwandlung prüfen, damit niemand auf die Idee kommt -42 Flaschen Rotwein zu bestellen. 😉

Konstantennamen werden per Konvention KOMPLETT_GROSS geschrieben und den Aufruf von `bestellung()` würde man noch durch ein ``if __name__ == "__main__":`` absichern, damit das nur passiert wenn man das Modul als Programm ausführt, aber nicht wenn man es importiert.

Die Klammern bei der Rechnung sind nicht notwendig, es gilt selbstverständlich Punkt- vor Strichrechnung.

`round()` benötigt sehr selten, nämlich nur dann, wenn man tatsächlich mit gerundeten Werten weiterrechnen will. Um ausgaben, oder allgemein Umwandlungen in Zeichenketten auf eine Nachkommaanzahl zu beschränken, verwendet man die Formatanweisungen bei den Platzhaltern bei Zeichenkettenformatierung. Hat zudem den Vorteil, dass man darüber auch hinbekommt, das der Betrag immer genau zwei Nachkommastallen, auch bei abschliessenden 0en. Also "1199.00 Euro" statt "1198.0 Euro" falls man 100 Flaschen Rotwein kauft.

Namen sollten keine Abkürzungen enthalten und nicht in komischen Wortreihenfolgen. Also nicht `zahl_rot`, sondern `rotwein_anzahl`.

Funktionen (und Methoden) werden üblicherweise nach der Tätigkeit benannt die sie durchführen, damit man sich leichter von eher passiven Werten unterscheiden kann. `bestellung` wäre beispielsweise ein Name der für eine Datenstruktur geeignet wäre die eine Bestellung repräsentiert. Also zum Beispiel eine Liste aus Bestellposten und Einzelpreisen, oder ein komplexeres Objekt das auch das Bestelldatum und den Kundennamen enthält und von dem man beispielsweise auch den Gesamtpreis abfragen kann.

Das vorhandene Programm entsprechend überarbeitet:

Code: Alles auswählen

#!/usr/bin/env python3

ROTWEIN_PREIS = 12.99
ROSEWEIN_PREIS = 9.98
WEISSWEIN_PREIS = 11.99

def erfrage_anzahl(eingabeaufforderung):
    ...
    return 23  # TODO


def bestellen():
    print("Wieviel Wein möchtest du?")
    rotwein_anzahl = erfrage_anzahl("Anzahl Rotwein: ")
    rosewein_anzahl = erfrage_anzahl("Anzahl Rosewein: ")
    weisswein_anzahl = erfrage_anzahl("Anzahl Weißwein: ")
    ergebnis = (
        rotwein_anzahl * ROTWEIN_PREIS
        + rosewein_anzahl * ROSEWEIN_PREIS
        + weisswein_anzahl * WEISSWEIN_PREIS
    )
    print(f"Der Gesamtbetrag ist {ergebnis:.2f} Euro.")


if __name__ == "__main__":
    bestellen()
Nach der Funktion für die Abfrage von einer Anzahl vom Benutzer, wäre die nächste Verbesserung die Preise nicht als einzelne Konstanten zu definieren, sondern als Datenstruktur. Eine Liste mit Tupeln aus Produktname und Preis oder ein Wörterbuch das Produktnamen auf Preise abbildet. Dann ist das leichter erweiterbar, und man muss in der `bestellen()`-Funktion nicht den immer gleichen Code für jedes einzelne Produkt schreiben, sondern kann einer Schleife über die Produkte schreiben und die abfragen.

Danach kann man sich überlegen ob es sinnvoll ist immer nach allen Produkten zu fragen, denn wenn es es in dem Laden irgendwann einmal 100 Weinsorten gibt, will der Kunde sicher nicht 99 mal 0 eingeben müssen, wenn er eine Flasche von einer Sorte kaufen will. 😱

Re: Nur Ganzzahlen als Eingabemöglichkeit

Verfasst: Dienstag 18. Oktober 2022, 12:57
von Flamme_W
Super! Danke für die schnellen Antworten, da habe ich jetzt erstmal was zum Pauken!