hi,
Ich bin neu und Bringe mir das Python Programmieren bei.
Ich hatte eine gute Idee wo ich ein tolles Geschenk für meine Älteren machen kann und gleichzeitig alles was ich jetzt gelehrten habe zu wiederholen und zu üben.
Aber es gibt ein großes Problem in den Zeilen nach Zeile 40 ich habe zwar das Prinzip von True und False verstanden aber es gibt ein Input der immer dann kommt wenn er nicht soll (Ich Tuhe ein screenshot in den Anhängen). Ich weiß halt nicht so ganz was ich machen soll ich will wenn man (Y) für nein eingibt dann das kommt Z.b print("Programmende")
print("-----------Danke für das nutzen des Programm´s-----------")
input("Drücke ein beliebege taste um das Programm zu beenden... ")
Es kommt ja auch Aber danach nochmal ein input der nicht da sein soll wo er ist (der input ist in Zeile 54).
https://github.com/Fabian-Toelle/kafffee
Kann mir wer Helfen oder mir Verbesserung Vorschläge geben.
Danke!
lg.
Fabian
If/Else/True/False Problem
Eine while-True-Schleife, die IMMER nach dem ersten Durchlauf per break beendet wird, ist unsinnig, was willst Du mit dieser while-Schleife sagen?
Der String "Y" ist niemals True und "n" ist niemals gleich False, die unteren while-Schleifen werden daher nie betreten und deshalb passt Deine Ausgabe auch nicht zum Programm.
Überlege Dir nochmal, an welchen Stellen Schleifen überhaupt sinnvoll sind, lass Dir Eingaben und das Ergebnis von Vergleichen mal per `print` ausgeben, damit Du lernst, was da wirklich passiert, übe viel damit im Interaktiven Modus.
Irgendwelche Stellen im Programm, wo per `input` etwas abgefragt wird, dessen Ergebnis aber dann nicht weiterverarbeitet wird, ist sehr verwirrend. Was soll da der Nutzer eingeben und warum?
Der String "Y" ist niemals True und "n" ist niemals gleich False, die unteren while-Schleifen werden daher nie betreten und deshalb passt Deine Ausgabe auch nicht zum Programm.
Überlege Dir nochmal, an welchen Stellen Schleifen überhaupt sinnvoll sind, lass Dir Eingaben und das Ergebnis von Vergleichen mal per `print` ausgeben, damit Du lernst, was da wirklich passiert, übe viel damit im Interaktiven Modus.
Irgendwelche Stellen im Programm, wo per `input` etwas abgefragt wird, dessen Ergebnis aber dann nicht weiterverarbeitet wird, ist sehr verwirrend. Was soll da der Nutzer eingeben und warum?
Hier nochmal dein Programmcode, damit nicht jeder dem Link folgen muss:
Spontan würde ich sagen, dass du hier keine "while" benutzen musst, um zweimal nach dem Menu zu fragen.
Code: Alles auswählen
print("Hello, welcome to my new Coffee-shop")
print("--------------------------------------------------------------------")
# vareable
latte = "Latte: 8€"
cappucino = "Cappucino: 9€"
esspresso = "Esspresso: 6€"
black_coffee = "Schwarzer Kaffee: 5€"
menu2 = "\n" + latte + "\n" + cappucino + "\n" + esspresso + "\n" + black_coffee + "\n"
name = input("Was ist dein name?: ")
input("Hallo " + name + ", was für ein Kaffee möchtest du heute Trinken? Hir ist was wir verkaufen: " + "\n" + menu2)
while True:
eingabe = input("Gebe deine bestellung ein: ")
if eingabe == "Latte":
print("Das macht dann 8€")
print("Hir bitte ihr getränk!")
break
while True:
if eingabe == "Cappucino":
print("Das macht dann: 9€")
print("Hir bitte ihr getränk!")
break
while True:
if eingabe == "Esspresso":
print("Das macht dann 6€")
print("Hir bitte ihr getränk!")
break
while True:
if eingabe == "Schwarzen Kaffee":
print("Das macht dann 5€")
print("Hir bitte ihr getränk!")
break
print("--------------------------------------------")
eingabe2 = input("[Y/n] wars das?")
yj = "Y"
nj = "n"
while True == yj:
if eingabe2 == True:
print("Programmende")
print("-----------Danke für das nutzen des Programm´s-----------")
input("Drücke ein beliebege taste um das Programm zu beenden... ")
break
break
while False == nj:
if eingabe2 == False == nj:
input("Was möchten sie denn noch bestellen? hir ist unser menu.")
input(menu2)
break
while False == nj:
eingabe3 = input("Geben ein was doch noch haben möchtest: ")
if eingabe3 == "Latte":
print("Das macht dann 8€")
print("Hir bitte ihr getränk!")
break
while False == nj:
if eingabe3 == "Cappucino":
print("Das macht dann: 9€")
print("Hir bitte ihr getränk!")
break
while False == nj:
if eingabe3 == "Esspresso":
print("Das macht dann 6€")
print("Hir bitte ihr getränk!")
break
while False == nj:
if eingabe3 == "Schwarzen Kaffee":
print("Das macht dann 5€")
print("Hir bitte ihr getränk!")
break
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
- __blackjack__
- User
- Beiträge: 14069
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Fabian: Das die ``while``-Schleifen deren Schleifenkörper wegen ``break`` genau einmal durchlaufen werden, und damit keine Schleifen sind, wurde ja bereits gesagt. An einer Stelle steht sogar direkt hintereinander zweimal ``break``. Das macht auch keinen Sinn, weil Code auf gleicher Ebene nach einem ``break`` natürlich nicht mehr ausgefürht werden kann.
Eine ``while``-Schleife mit Bedingung die genau 0 oder 1 mal durchlaufen wird ist auch keine ``while``-Schleife sondern eigentlich ein ``if``.
Eine weitere Bestellung würde man nicht dadurch lösen, dass man ganzen Code für eine Bestellung noch mal schreibt. Um Code wiederholt auszuführen gibt es Schleifen.
Selbst wenn der zweite Teil so funktionieren würde: Es wird vom Benutzer abgefragt ob es das war, und egal was der Benutzer da eingibt, wird erst mal "Programmende" ausgegeben. Also auch wenn der Benutzer gerne noch einen Kaffee kaufen würde.
Am Ende eines Programms sollte nicht noch mal eine Eingabe nötig sein um das Programm tatsächlich zu beenden. Das nervt Benutzer auf Dauer. Zudem ist der Text das eine beliebige Taste das Programm beenden würde falsch. Es sind nur relativ wenige Tasten(kombinationen) die zum Programmende führen.
Man nummeriert keine Namen. Entweder will man sich bessere Namen überlegen, oder gar keine Einzelnamen sondern eine Datenstruktur verwenden. Oft eine Liste. Im Konkreten Fall sind aber die angehängten Nummern bei den Namen schlicht überflüssig. `menu2` kann man ohne nachzudenken einfach `menu` nennen und bei `eingabe2` und `eingabe3` muss man keinen anderen Namen als `eingabe` verwenden, weil jeweils die vorherigen Benutzereingaben gar nicht mehr gebraucht werden.
Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.
Zwischenstand eines Bestellvorgangs (ungetestet):
Das Programm enthält allerdings Wiederholungen von Daten und Code die man so nicht machen würde. Das sind zum einen die Getränkenamen und Preise und zum Anderen die Ausgaben die sich pro Getränk kaum unterscheiden. Die zweite Ausgabe ist sogar bei allen Getränken gleich. Die Getränke und Preise stehen hier hart kodiert im Code statt *einmal* in einer Datenstruktur, wo man das leicht ändern/erweitern kann, ohne das man dafür den Code ändern muss.
Und man würde den Benutzer eigentlich schon nicht zwingen wollen komplette Getränkenamen einzugeben. Da würde ich mindestens mal führende und folgende Leerzeichen und Gross-/Kleinschreibung ignorieren. Aber eigentlich würde man es dem Benutzer einfacher machen wollen etwas aus dem Menü zu wählen. Beispielsweise in dem man die Optionen nummeriert und der Benutzer eine Nummer eingibt.
Zwischenstand (ungetestet):
Eine ``while``-Schleife mit Bedingung die genau 0 oder 1 mal durchlaufen wird ist auch keine ``while``-Schleife sondern eigentlich ein ``if``.
Eine weitere Bestellung würde man nicht dadurch lösen, dass man ganzen Code für eine Bestellung noch mal schreibt. Um Code wiederholt auszuführen gibt es Schleifen.
Selbst wenn der zweite Teil so funktionieren würde: Es wird vom Benutzer abgefragt ob es das war, und egal was der Benutzer da eingibt, wird erst mal "Programmende" ausgegeben. Also auch wenn der Benutzer gerne noch einen Kaffee kaufen würde.
Am Ende eines Programms sollte nicht noch mal eine Eingabe nötig sein um das Programm tatsächlich zu beenden. Das nervt Benutzer auf Dauer. Zudem ist der Text das eine beliebige Taste das Programm beenden würde falsch. Es sind nur relativ wenige Tasten(kombinationen) die zum Programmende führen.
Man nummeriert keine Namen. Entweder will man sich bessere Namen überlegen, oder gar keine Einzelnamen sondern eine Datenstruktur verwenden. Oft eine Liste. Im Konkreten Fall sind aber die angehängten Nummern bei den Namen schlicht überflüssig. `menu2` kann man ohne nachzudenken einfach `menu` nennen und bei `eingabe2` und `eingabe3` muss man keinen anderen Namen als `eingabe` verwenden, weil jeweils die vorherigen Benutzereingaben gar nicht mehr gebraucht werden.
Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.
Zwischenstand eines Bestellvorgangs (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
def main():
print("Hello, welcome to my new Coffee-shop")
print("-" * 68)
latte = "Latte: 8€"
cappucino = "Cappucino: 9€"
esspresso = "Esspresso: 6€"
black_coffee = "Schwarzer Kaffee: 5€"
menu = f"{latte}\n{cappucino}\n{esspresso}\n{black_coffee}"
name = input("Was ist Dein Name? ")
print(
f"Hallo {name}, was für einen Kaffee möchtest Du heute trinken?"
f" Hier ist was wir verkaufen:\n\n{menu}\n"
)
eingabe = input("Gib Deine Bestellung ein: ")
if eingabe == "Latte":
print("Das macht dann 8€.")
print("Hier bitte, Dein Getränk!")
if eingabe == "Cappucino":
print("Das macht dann: 9€.")
print("Hier bitte, Dein Getränk!")
if eingabe == "Esspresso":
print("Das macht dann 6€.")
print("Hier bitte, Dein Getränk!")
if eingabe == "Schwarzen Kaffee":
print("Das macht dann 5€.")
print("Hier bitte, Dein Getränk!")
print("Programmende")
print("-----------Danke für das Nutzen des Programms-----------")
if __name__ == "__main__":
main()
Und man würde den Benutzer eigentlich schon nicht zwingen wollen komplette Getränkenamen einzugeben. Da würde ich mindestens mal führende und folgende Leerzeichen und Gross-/Kleinschreibung ignorieren. Aber eigentlich würde man es dem Benutzer einfacher machen wollen etwas aus dem Menü zu wählen. Beispielsweise in dem man die Optionen nummeriert und der Benutzer eine Nummer eingibt.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
def main():
drink_to_price = {
"latte": 8,
"cappucino": 9,
"esspresso": 6,
"schwarzer kaffee": 5,
}
print("Hello, welcome to my new Coffee-shop")
print("-" * 68)
name = input("Was ist Dein Name? ")
print(
f"Hallo {name}, was für einen Kaffee möchtest Du heute trinken?"
f" Hier ist was wir verkaufen:\n"
)
for drink, price in drink_to_price.items():
print(f"{drink.title()}: {price}€")
drink = input("\nGib Deine Bestellung ein: ").strip().lower()
price = drink_to_price.get(drink)
if price is None:
print("Das führen wir leider nicht!")
else:
print(f"Das macht dann {price}€")
print("Hier bitte, Dein Getränk!")
print("Programmende")
print("-----------Danke für das Nutzen des Programms-----------")
if __name__ == "__main__":
main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari