Hilfe beim Verständnis if/else

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
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Hallo Leute!


Wie ich ja schon anders wo geschrieben habe, bringe ich mir gerade Python bei und habe mir im Netz ein paar Anfänger Aufgaben herausgesucht.
Ich sitze nun schon ein paar Stunden bei dieser Aufgabe und komme einfach nicht drauf wo der Fehler liegt...

Bild

Mein Code dazu:

Code: Alles auswählen

input('Funktioniert das System? J/N ... ')
if input == 'J':
    print('Dan Fummel nicht dran rum!')
    print('Alles  ist gut ;)')
else:
    input('Bist du dran Schuld J/N ...')
    if input == 'N':
        print('Dan trifft es dich nicht!')
    else:
        print('Du Idiot!')
        input('Hat es jemand gemerkt? J/N ... ')
        if input == 'N':
            print('Man wird dich eh nicht finden!')
        else:
            print('Du bist im Arsch!')
            input('Kannst du einem anderem die Schuld zuschieben? J/N ... ')
            if input == 'N':
                print('Dan bist du wirklich im Arsch!')
            else:
                print('Keine Sorge! Dan ist jemand anders im Arsch')

Wenn ich die Benutzereingabe mit 'N, J, J, N' ablaufe, läuft es bis zum vorletzten if/else Block normal, letzter passt dan wieder nicht.
Ich glaube dass ich irgendwo einen Einrück oder Denkfehler habe, aber wie ich es auch drehe und wende, sobald ich bei der ersten Eingabe 'J' drücke, geht`s schon in die falsche Richtung.


Könnte mir bitte jemand auf Anfängerisch (xD) erklären woran es hier happert?


Danke euch vielmals!!


Lg Chris
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

`input` ist eine Funktion. Die kann niemals gleich "J" oder "N" sein. Du landest also immer im else-Block.
Wenn Du `input` aufrufst, mußt Du den Rückgabewert irgendeiner Variable zuweisen und diese mit "N" vergleichen.
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Ahhh ... Zack bum! Da ist der Haken :)
Vielen lieben dank, wieder einen Schritt weiter gelernt!

Super wie das funktioniert nun:

Code: Alles auswählen

antwort = input('Funktioniert das System? J/N ... ')
if antwort == 'J':
    print('Dan Fummel nicht dran rum!')
    print('Alles  ist gut ;)')
else:
    antwort2 = input('Bist du dran Schuld J/N ...')
    if antwort2 == 'N':
        print('Dan trifft es dich nicht!')
    else:
        print('Du Idiot!')
        antwort3 = input('Hat es jemand gemerkt? J/N ... ')
        if antwort3 == 'N':
            print('Man wird dich eh nicht finden!')
        else:
            print('Du bist im Arsch!')
            antwort4 = input('Kannst du einem anderem die Schuld zuschieben? J/N ... ')
            if antwort4 == 'N':
                print('Dan bist du wirklich im Arsch!')
            else:
                print('Keine Sorge! Dan ist jemand anders im Arsch')
lg Chris
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chrisu: Man nummeriert keine Namen. Ist hier ja auch überhaupt gar nicht notwendig weil eine vorherige Antwort nach dem erfragen einer neuen Antwort nirgends mehr benötigt wird.

Man könnte sich die Namen sogar komplett sparen. Und die Vezweigungen regelmässiger gestalten, also das beispielsweise im ``if`` immer der "Ja"-Fall und im ``else`` imer der "Nein"-Fall behandelt wird. Das wäre der erste Schritt den Verzweigungsbaum aus dem Code heraus zu holen und in eine Datenstruktur zu stecken.

Jede Frage endet mit dem gleichen Suffix "? J/N ... ". Das kann man nutzen um da eine Funktion heraus zu ziehen. Programmierer sind nämlich die gute Art von Faul und mögen keine Wiederholungen von Code oder Daten im Programm. Die Funktion könnte man dann auch so schreiben, das sie den Benutzer so lange Eingaben machen lässt, bis er auch tatsächlich "J" oder "N" eingegeben hat. Und die könnte einen Wahrheitswert liefern, so dass man im ``if`` keinen Vergleich mehr machen muss.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3


def ask_confirmation(prompt):
    #
    # TODO Make sure the user enters "J" or "N".
    #
    return input(f"{prompt} J/N ... ").lower() == "j"


def main():
    #
    # TODO Extract decision tree as data structure.
    #
    if ask_confirmation("Funktioniert das System?"):
        print("Dann Fummel nicht dran rum!")
        print("Alles ist gut.")
    else:
        if ask_confirmation("Bist Du Schuld?"):
            print("Du Idiot!")
            if ask_confirmation("Hat es jemand gemerkt?"):
                print("Du bist am Arsch!")
                if ask_confirmation(
                    "Kannst du einem Anderen die Schuld zuschieben?"
                ):
                    print("Keine Sorge, jemand anderes ist am Arsch!")
                else:
                    print("Dann bist du wirklich am Arsch!")
            else:
                print("Man wird dich nie finden!")
        else:
            print("Dich trifft es nicht!")


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten