Seite 1 von 1

Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 12:29
von victoria
Ich arbeite zurzeit an einem Projekt für die Uni, ich habe nur wenige Vorkenntnisse in der Programmierung und deshalb fällt mir das Projekt nicht besonders leicht. Die Idee hinter dem Projekt ist für ein Restaurant (Bowl) eine Speisekarte zusammen zu stellen und den Kunden nach seinen Bedürfnissen die einzelnen Komponenten wählen zu lassen. Am Ende soll eine Liste ausgegeben werden mit den gewahälten Zutaten inkl. Preis. Ich habe bereits einen Teil programmiert, jedoch komme ich nicht weiter und funktioniert auch nicht so wie erwartet. Ich hoffe um Rückmeldung und etwas Hilfe hier weiterzukommen. Danke im Voraus!

Code:
def MenüBestellung(auswahl, min, max):
bestellung = []
index = 0

for item in auswahl:
print("["+str(index)+"] "+ item)
index += 1
#index = index + 1
#print(item)
auswahl = input("Was ist deine Auswahl")

if auswahl == index:
bestellung.append( auswahl[index])

fehlerNamen = ["Dreck", "Opfer", "Biest", "Dummy", "Sau"]
valid = True

'Die gesamte Speisekarten Auswahl angeben und die verschiedenen Komponenten der Bowl auflisten'
BasisAuswahl = [ "Reis", "Quinoa", "Couscous", "Bulgur" ]
ProteinAuswahl = [ "Hühnerfleisch", "Rindfleisch", "Lachs", "Tofu", "Linsen"]
GemüseAuswahl = [ "Zwiebel", "Tomaten", "Zucchini", "Melanzzani", "Gurken", "Paprika", "Brokkoli", "Erbsen", "Mais", "Avocado" ]
ObstAuswahl = [ "Mango", "Apfel", "Erdbeeren","Ananas", "Wassermelone", "Granatapfel"]
SaucenAuswahl = [ "Guacamole", "Mango-Curry", "Tsatsiki", "Joghurt-Knoblauch" ]
ToppingAuswahl = [ "Walnüsse","Kürbiskerne", "Erdnüsse", "Chia-Samen", "Pinienkerne", "Tortilla Chips" ]

'Die Minimale und Maximale Anzahl der einzelnen Komponenten bestimmen'
Speisekarte = [(BasisAuswahl,1,1), (ProteinAuswahl,1,1), (GemüseAuswahl,1,6), (ObstAuswahl,1,4), (SaucenAuswahl,1,2), (ToppingAuswahl,0,2)]

while valid:
'Nach dem Namen der Kunden fragen'
name = str(input("Wie ist dein Name? "))
# Bei unpassender Namenseingabe eine Fehlermeldung ausgeben und nach erneuter Eingabe fragen
if name in fehlerNamen:
print("Tut mir leid, dieser Name ist nicht erlaubt bei uns.")
continue
elif name.isdecimal() is True:
print("Tut mir leid, das ist kein Name.")
continue
elif any(substring in name.lower() for substring in fehlerNamen):
print("Tut mir leid, dieser Name ist nicht erlaubt bei uns.")
else:
print("Hallo " + name + ", Willkommen bei Bi-Ba-Bowl!")
valid = False
print("Du hast die Wahl zwischen:",(index+1),BasisAuswahl)
i+=1
print("Mit welcher Grundbasis hättest du gerne deine Bowl?")

Re: Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 13:12
von Sirius3
Bitte Code im Forum in Code-Tags setzen, damit man die Einrückungen sieht.
"Funktioniert nicht wie erwartet" ist eine schlechte Fehlerbeschreibung. Was erwartest Du? Was passiert? Wie weicht das davon ab, was Du erwartest?

Funktionen werden wie Variablennamen komplett klein geschrieben. Funktionen werden nach Tätigkeiten benannt, `MenüBestellung` ist keine Tätigkeit.
Wenn man einen Index zusätzlich zu `item` braucht, benutzt man `enumerate`.
Statt Strings mit + zusammenzustückeln benutzt man Formatstrings.
`auswahl` ist erst eine Liste und dann ein String. Das sollte man nie tun.
auswahl ist dann aber nie gleich einem Index, was ja eine Zahl ist.
Die Einrückung von `input` scheint nicht richtig zu sein.

Die Listen sollten Konstanten sein, die außerhalb der Funktion definiert werden.

Innerhalb der while-Schleife hast Du dann wirklich einen Einrückungsfehler, der zu einem Compilefehler führt.

input liefert, schon einen String, so dass das `str` bei `name` überflüssig ist.
`is True` sollte ein `== True` und mit True vergleicht man nicht explizit, das kann also komplett ersatzlos gestrichen werden.
`substring` ist niemals gleich name.lower(), da substring großbuchstaben enthält.
Dann scheint `valid` genau falsch herum zu sein.
In Zeile 44 gibt es dann plötzlich ein `i`, das nicht definiert ist, und `index` ist keine Liste, so dass da ein Indexzugriff nicht funktioniert.

Das Eingeben und Prüfen des Namens sollte nicht in der Funktion Bestellung stehen, sondern in einer separaten Funktion.

`min`, `max` und viele weitere Variablen werden gar nicht benutzt.

Re: Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 13:36
von victoria
Vielen Dank für die Antwort. Ich tue mir leider echt schwer bei der Programmierung und verwende diese Forum Seite auch zum 1. Mal. Das Ziel ist das nach der Reihe die einzelnen Komponenten des Rezepts abgefragt werden und der Kunde immer zwischen einer minimalen und maximalen Menge auswählen muss. Dafür stehen die Variablen min und max die dafür definiert werden sollen.
Wie verwende ich in dem Zusammenhang enumerate?
Nach einer Abfrage sollte immer die gesamte Liste mit einem [ ], der Zahl darin und der Zutat ausgegeben werden. Wie könnte ich das umschreiben?
Falls ein Name eingetippt wird der von dem Programm nicht akzeptiert wird, sollte dieser auch erkannt werden wenn er klein geschrieben wird, wie setze ich das mit lower case um?

Code: Alles auswählen

from operator import index

def menüBestellung(auswahl, min, max):
    bestellung = []
    index = 0

    for item in auswahl:
            print("["+str(index)+"]"+item)
            index += 1
            #index = index + 1 
            #print(item)
            auswahl = input("Was ist deine Auswahl")

            if auswahl == index:
                bestellung.append(auswahl[index])

# Die Minimale und Maximale Anzahl der einzelnen Komponenten bestimmen
    MenüBestellung(BasisAuswahl, 1, 1)
    MenüBestellung(ProteinAuswahl, 1, 1)
    MenüBestellung(GemüseAuswahl, 1, 6)
    MenüBestellung(ObstAuswahl, 1, 4)
    MenüBestellung(SaucenAuswahl, 1, 2)
    MenüBestellung(ToppingAuswahl, 0, 2)

fehlerNamen = ["Dreck", "Opfer", "Biest", "Dummy", "Sau"]
valid = True 

# Speisekarte auflisten und einzelen Komponente kategorisieren
BasisAuswahl = ["Reis", "Quinoa", "Couscous", "Bulgur"]
ProteinAuswahl = ["Hühnerfleisch", "Rindfleisch", "Lachs", "Tofu", "Linsen"]
GemüseAuswahl = ["Zwiebel", "Tomaten", "Zucchini", "Melanzzani", "Gurken", "Paprika", "Brokkoli", "Erbsen", "Mais", "Avocado"]
ObstAuswahl = ["Mango", "Apfel", "Erdbeeren","Ananas", "Wassermelone", "Granatapfel"]
SaucenAuswahl = ["Guacamole", "Mango-Curry", "Tsatsiki", "Joghurt-Knoblauch"]
ToppingAuswahl = ["Walnüsse","Kürbiskerne", "Erdnüsse", "Chia-Samen", "Pinienkerne", "Tortilla Chips"]

#for section in Speisekarte:
    #valid_auswahl = False
    #while !valid_auswahl:
while valid:
    # Nach dem Namen der Kunden fragen
        name = (input("Wie ist dein Name? "))
    # Bei unpassender Namenseingabe eine Fehlermeldung ausgeben und nach erneuter Eingabe fragen
        if name in fehlerNamen:
            print("Tut mir leid, dieser Name ist nicht erlaubt bei uns.")
            continue
        #elif any(substring in name.lower() for substring in fehlerNamen):
         #   print("Tut mir leid, dieser Name ist nicht erlaubt bei uns.")
        else:
            print("Hallo " + name + ", Willkommen bei Bi-Ba-Bowl!")
            valid = False
            print("Mit welcher Grundbasis hättest du gerne deine Bowl?")
            input("Du hast die Wahl zwischen:", BasisAuswahl)

Re: Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 13:40
von __blackjack__
@victoria: Ergänzend zu Sirius3: Literale Zeichenketten sind keine Kommentare und sollten auch nicht dafür missbraucht werden. Kommentarzeilen starten mit ``#`` und das ist die einzige syntaktisch vorgesehene Möglichkeit Code zu kommentieren in Python.

`min` und `max` sind die Namen von zwei eingebauten Funktionen, die sollte man nicht an andere Werte binden.

Die ganzen Auswahlen und die Speisekarte werden definiert aber nirgends verwendet. Wenn Du einen Fehler hast, schmeiss am besten alles raus was nichts mit dem Fehler zu tun hat, oder gar überhaupt nicht verwendet wird, dann muss man sich nicht mit Quelltext beschäftigen der nichts mit dem Fehler zu tun hat.

``continue`` sollte man möglichst vermeiden wenn es geht und es geht eigentlich immer. Es ist eher selten, dass Code dadurch verständlicher statt unübersichtlicher wird.

Da ist insgesamt ein ziemliches durcheinander mit deutlich mehr Code als man schreiben sollte ohne den mal laufen zu lassen, womit dann gar nicht erst so viele Fehler auf einmal zusammen kommen können, weil man schon viel früher über einen davon gestolpert wäre, ohne die anderen zu machen.

Re: Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 14:10
von victoria
Ungefähr so hätte ich mir die Ausgabe vorgestellt.


Hallo ‚Philipp, Willkommen bei Bi-Ba-Bowl!
Mit welcher Grundbasis hättest du gerne deine Bowl?
Du hast die Wahl zwischen:
[1] Reis
[2] Quinoa
[3] Couscous
[4] Bulgur
Deine Auswahl ist: 1

Super, welche Proteinquelle hättest du gerne dabei?
[1] Hühnerfleisch
[2] Rindfleisch
[3] Lachs
[4] Tofu
[5] Linsen
Deine Auswahl ist: 2,3
Tut mir leid, du kannst nur maximal eine Zutat hier wählen.
Deine Auswahl ist: 2

Welches Gemüse möchtest du auf deine Bowl?
[1] Zwiebel
[2] Tomaten
[3] Zucchini
[4] Melanzzani
[5] Gurken
[6] Paprika
[7] Brokkoli
[8] Erbsen
[9] Mais
[10] Avocado
Wähle bis zu maximal 6 Zutaten aus!
Deine Auswahl ist:1,2,4,5,10

……

Vielen Dank für deine Bestellung.
‚Philipp’s Bowl mit ‚Reis‘, ‚Rindfleisch‘, ‚Zwiebel‘, ‚Tomaten‘,… wird in Kürze zubereitet.

Re: Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 15:01
von __blackjack__
@victoria: Warum wird denn jetzt `index` aus dem `operator`-Modul importiert?

Der Quelltext hat immer noch viel zu viele Probleme die in dieser Masse gar nicht existieren dürften. Fang mit einer leeren Datei an das Programm zu entwickeln und schreib da nicht Unmengen an Code der nicht funktioniert sondern ein Schritt nach dem anderen und teste jeden. Bevor die Eingabe und Überprüfung vom Namen nicht funtkioniert macht es keinen Sinn da schon irgendwelche Menüauswahlen zu kodieren.

Wobei ich das mit der Überprüfung von Namen mit Hinweis auf das Scunthorpe-Problem ganz sein lassen würde.

Der Name `menüBestellung()` beschreibt immer noch keine Tätigkeit und enthält auch immer noch einen Grossbuchstaben, auch wenn es jetzt netterweise von der Schreibweise nicht mehr so leicht mit einem Klassennamen verwechselt werden kann.

Der Funktionsaufruf sollte nicht 6× mit verschiedenen Argumenten im Quelltext stehen. Da werden Daten als Code modelliert die besser in einer Datenstruktur aufgehoben wären. In den `*Auswahl`-Namen sind auch Daten kodiert. Das sollte man nicht machen. Daten gehören nicht in Namen sondern als Werte in Datenstrukturen. Dann liesse sich das später auch eine Datei auslagern in der die Speisekarte beispielsweise als JSON oder XML kodiert wird.

Das grundsätzliche vorgehen beim Programmieren ist das Problem in kleinere Teilprobleme zu zerlegen. Und die Teilprobleme wieder in kleinere Teilprobleme. Solange bis einzelne Teilprobleme leicht mit einer Funktion in ein paar Zeilen Code lösbar sind. Diese Funktion/Teillösung testet man dann und macht nur mit der nächsten Teillösung weiter wenn die funktioniert. Dann kann man Funktionen für Teillösungen schreiben die ihrerseits aus anderen Teillösungen bestehen, solange bis man das Gesamtproblem gelöst hat.

Zwei häufig verwendete ”Bruchstellen” um Probleme aufzuteilen sind eine Aufteilung von Eingabe, Verarbeitung, und Ausgabe und das Lösen eines Problems für *ein* Element von mehreren wenn die alle gleichartig vearbeitet werden sollen. Also Beispielsweise kann man das Teilproblem `komponenten_auswählen()` runterbrechen auf `komponente_auswaehlen()` das man dann auf die Auswählmöglichkeiten für jede einzelne Komponente anwenden kann.

Ein Grundgerüst/Start könnte beispielsweise so aussehen:

Code: Alles auswählen

#!/usr/bin/env python3

COMPONENTS = ...


def ask_name():
    ...


def ask_bowl_content(components):
    ...


def print_order(name, bowl_content):
    ...


def main():
    name = ask_name()
    print(f"Hallo {name}, Willkommen bei Bi-Ba-Bowl!")
    bowl_content = ask_bowl_content(COMPONENTS)
    print_order(name, bowl_content)


if __name__ == "__main__":
    main()
Wobei eine eigene Funktion für das Fragen nach dem Namen nur Sinn macht wenn da die nicht so sinnvolle Prüfung gemacht wird. Sonst könnte man auch einfach gleich `input()` verwenden.

Re: Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 15:24
von victoria
Ich danke für die Hilfe. Ich bin hier echt schon am verzweifeln weil das einfach überhaupt nicht mein Fach ist. Ich reime oft etwas zusammen was weniger mit Verständnis zu tun hat, sondern mehr mit Recherche und Arbeit die wir bereits gemacht haben. Es fällt mir schwer aber ich werde nochmal beginnen und hoffe diesmal auf einen besseren Weg.
Das mit der falschen Nameneingabe werde ich weglassen.
Bezüglich der Anzahl der ausgewählten Komponenten, wie würde ich das hier dann umschreiben? Wäre es möglich das zb so anzugeben: choices = [(basis, 1, 1), (protein, 1, 1), (vegetable, 1, 6), (fruit, 1, 4)…]

Re: Restaurant Bestell System

Verfasst: Mittwoch 16. Februar 2022, 16:23
von Sirius3
Statt hier mit Tupeln zu arbeiten, wo jeder Eintrag eine magische Bedeutung hat, bietet es sich an, statt dessen Wörterbücher zu verwenden, weil man die auch einfach z.B. als JSON auslagern kann.

Was brauchst Du für eine Auswahl? Einen sprechende Namen (Proteinquelle), eine Liste mit Zutaten, und die minimale und maximale Anzahl an Zutaten.
Mit diesen Informationen mußt Du eine Funktion schreiben, die
1) Einen einleitenden Text mit dem sprechenden Namen ausgibt
2) Die Liste der Zutaten ausgibt
3) Die Zutaten abfrage
4) Die Eingabe auf Korrektheit prüft (sind nur Zahlen eingegeben worden, sind die Zahlen im richtigen Range, sind zu wenig oder zu viele Zahlen eingegeben worden, Doppelte Zahlen?)
5) Das Ergebnis als Liste zurückliefert.

Erst wenn Du diese Funktion fertig und ausgiebig getestet hast, kannst Du Dir überlegen, wie Du diese Funktion dann benutzt, um alle sechs Zutaten abzufragen, und so weiter.