Programmierung einer geteilten Einlaufsliste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JustLazy
User
Beiträge: 1
Registriert: Mittwoch 6. November 2024, 13:26

Guten Tag, und zwar bin ich ein Anfänger in der Programmierung und habe mich mal an ein Anfänger-Projekt versucht. Das Problem ist, dass das Programm anstatt die If-Anweisung zu befolgen, wieder das ausgibt was in der While-Schleife steht.

Code: Alles auswählen

einkäufe = []

while True:
    print("=====Geteilte-Einkaufsliste=====")
    print("1. Produkte in die Liste hinzufügen")
    print("2. Produkte anzeigen")
    print("3. Produkte als erledigt markieren")
    print("4. Programm beenden")
    entscheidung = int(input("Geben Sie eine Entscheidung an: "))

    if entscheidung == "1":
        add_einkäufe = int(input("Wie viele Produkte wollen Sie hinzufügen: "))

        for i in range(add_einkäufe):
            einkauf = input("Geben Sie ihre Produkte an: ")
            einkäufe.append({"Produkt": einkauf, "fertig": False})
            print("Produkt/e wurde/n hinzugefügt!")

    elif entscheidung == "2":
        print("Produkte anzeigen")
        for index, einkauf in enumerate(einkäufe):
            status = "Fertig" if einkauf["fertig"] else "Nicht Erledigt"
            print(f"{index + 1}, {einkauf['Produkt']} - {status}")

    elif entscheidung == "3":
        einkauf_index = int(input("Welches Produkt möchten Sie als erledigt angeben: ")) - 1
        if 0 <= einkauf_index < len(einkäufe):
            einkäufe[einkauf_index]["fertig"] = True
            print("Das Produkt wurde als erledigt markiert!")
        else:
            print("Fehlerhafte Angabe!")
        
    elif entscheidung == "4":
        print("Programm beenden")
        break
    else:
        print("Ungültige Entscheidung. Bitte versuchen Sie es erneut!")
PS: Hättet ihr vielleicht paar Ratschläge, wie man effektiver programmieren lernt, denn ich bin echt manchmal ziemlich niedergeschlagen, wenn ich mir meinen Fortschritt so ansehe. :lol:
Benutzeravatar
__blackjack__
User
Beiträge: 14238
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JustLazy: Eine Zahl ist niemals gleich einer Zeichenkette. Auch nicht wenn die Zahl als Zeichenkette so aussehen könnte.

Code: Alles auswählen

In [504]: 42 == "42"
Out[504]: False
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Benutzeravatar
__blackjack__
User
Beiträge: 14238
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JustLazy: Noch ein paar Ratschläge: Die Namensgebung mit `einkauf`, `einkäufe`, und Produkt(e?) ist nicht so ganz stimmig. Die Interaktion mit dem Benutzer lässt vermuten, dass es pro `einkauf` mehr als ein Produkt sein darf. Das Wörterbuch das für einen einzelnen Einkauf steht, hat aber "Produkt" in der Einzahl als Schlüssel.

"fertig" ist nicht so toll für den Status. Was bedeutet denn ein Einkauf ist fertig? Offenbar nicht das er erledigt ist. Das verwirrt mich. Aus wessen Sicht ist denn diese Datenstruktur? Aus der des Ein- oder der des Verkäufers?

Wenn man Wörterbücher mit dem gleichen Satz an festen Schlüsseln hat, ist das eigentlich kein Wörterbuch, sondern ein Objekt. Also eine eigene Klasse oder zumindest ein `collections.namedtuple()`.

`add_einkaeufe` mischt Deutsch und Englisch und wäre auch eher ein Name für eine Funktion, nicht für die Anzahl der einzugebenden Einkäufe, weil `einkaeufe_hinzufuegen` eine Tätigkeit und kein ”Ding”/passiver Wert ist. Das ist für den Benutzer aber auch unschön hier erst eine Anzahl eingeben zu müssen. Benutzerfreundlicher wäre es wenn der Benutzer solange Eingaben machen kann bis er das Ende mit einer ”besonderen” Eingabe kennzeichnet. Beispielsweise in der er nichts eingibt, sondern einfach nur die Eingabetaste betätigt.

`enumerate()` kann man einen Startwert mitgeben. Dann muss man den nicht später addieren.

Bei der Eingabe von Zahlwerten gibt es keine Fehlerbehandlung falls der Benutzer etwas eingibt was nicht in eine Zahl umgewandelt werden kann.

Das ganze ist IMHO schon lang genug um es auf sinnvoll auf Funktionen aufteilen zu können.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Antworten