while & break

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
frootloop
User
Beiträge: 1
Registriert: Mittwoch 6. September 2017, 15:42

hallo zusammen!

ich bin gerade dabei mir einen "rechner" zu programmieren und es funktioniert bisher ganz gut nur bei der letzten antwort springe ich nach dem break in das if bzw else der vorigen schleife zurück.

ich habe vier while schleifen ineinander und bis auf die letzte funktioniert alles bestens. bei der letzten schleife wenn das if erfüllt wird sollte die schleife durch den break gebrochen werden nur springt es dann zum if/else der vorhergehenden while schleife zurück

was kann da nicht stimmen?

Code: Alles auswählen

print("What would you like to do today?")

##### RESTART at END #####
while 1==1:

    print("Please choose [h] for humans and [f] for fruit flies for further options!")
    q1=input("Your choice: ")

    while (True):    
        if q1=="h":
            print("humans it is!")
            print("SORRY this function is not available yet! Please come back another time!")
            break
#fruit flies        
        if q1=="f":
            print("fruit flies it is!")
            print("A wildtype fly with red eyes is crossed with a mutant fly with brown or white eyes")
            print("Would you like to look at a cross with brown or white eyed flies?")
            print("Please choose [b] for brown eyes and [w] for white eyes!")
            q2=input("Your choice: ")
            
            while (True):
#flies - brown eyes
                if q2=="b":
                    print("brown eyes it is!")

#flies - brown eyes - gender
                    print("Which fly for the cross should have red eyes?")
                    print("Please choose [f] for female or [m] male.")
                    browneyes=input("The fly with red eyes is: ")

                    while(True):
#flies - brown eyes - red female
                        if browneyes=="f":
                            print("A red eyed female fly crossed with a male brown eyed fly results in:")
                            print("generation F1: 100% red eyed flies!")
                            print("generation F2: 75% red eyed flies and 25% brown eyed flies.")
                            break
                            
#flies - brown eyes - red male
                        if browneyes=="m":
                            print("A red eyed male fly crossed with a female brown eyed fly results in:")
                            print("generation F1: 100% red eyed flies!")
                            print("generation F2: 75% red eyed flies and 25% brown eyed flies.")
                            break
                            
                        else:
                            print("ERROR please try again")
                            print("Which fly for the cross should have red eyes?")
                            print("Please choose [f] for female or [m] male.")
                            browneyes=input("Your choice: ")
#flies - white eyes
                if q2=="w":
                    print("white eyes it is!")
#flies - white eyes - gender
                    print("Please choose [f] for female or [m] male.")
                    whiteeyes=input("The fly with red eyes is: ")
            
                    while(True):
#flies - white eyes - red female
                        if whiteeyes=="f":
                            print("A red eyed female fly crossed with a male white eyed fly results in:")
                            print("generation F1: 100% red eyed flies!")
                            break
                            
#flies - white eyes - red male
                        if whiteeyes=="m":
                            print("A red eyed male fly crossed with a female white eyed fly results in:")
                            print("generation F1: 50% red eyed and white eyed flies each.")
                           break
                           
                        else:
                            print("ERROR please try again")
                            print("Please choose [f] for female or [m] male.")
                            whiteeyes=input("Your choice: ")

#choose brown/white - wrong input                           
                else:
                    print("ERROR please try again")
                    print("Please choose [b] for brown eyes and [w] for white eyes!")
                    q2=input("Your choice: ")
      
#choose human/fly - wrong input
        else:
            print(" ")
            print("ERROR please try again")
            print("Please choose [h] for humans and [f] for fruit flies for further options!")
            q1=input("Your choice: ")
            
    input(">>>Press Enter to start again!<<<")
  
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hui. Da ist leider so manches im argen.

Du solltest diverse Verbesserungen durchfuehren, damit man damit auch arbeiten kann, und Fehler leichter findet:

- while 1==1 kann zu while True werden. Ohne Klammern, wie du es an anderen Stellen hast.
- du solltest *dringend* die verschiedenen Teile in Funktionen gliedern. Dann brauchst du auch keine der zwischengestreuten Kommentare.

- auf Modulebene gehoeren nur Funktionen, Klassen und Konstanten. Man hat ueblicherweise ein guard "if __name__ == '__main__'" und dann eine main-Funktion.

Ein kleines Geruest zum anfangen (ungetestet):

Code: Alles auswählen

def ask(question, choices):
    while True:
        res = input(question)
        if res in choices:
            return res
        else:
            print("Please select from the choices", choices)


def fruitfly_questions():
    print("fruit flies it is!")
    print("A wildtype fly with red eyes is crossed with a mutant fly with brown or white eyes")
    print("Would you like to look at a cross with brown or white eyed flies?")

    brown_or_white = ask("Please choose [b] for brown eyes and [w] for white eyes!", ["b", "w"])
    ...


def human_questions():
    ...

def main():

    while True:
        humans_or_fruitflies = ask("Please choose [h] for humans and [f] for fruit flies for further options!", ["h", "f"])
        if humans_or_fruitflies == "f":
            fruitfly_questions()
        else:
            human_questions()


if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@frootloop: das Programm ist so nicht lauffähig, weil die Einrückungen kaputt sind. Man sollte meine Programme schreiben, die sieben Ebenen tief sind, das versteht kein Mensch mehr. Du benutzt while-Schleifen, if und break wie Sprungmarken. Das ist mehr BASIC als Python. Und dort liegt auch irgendwo der Fehler; das ist nur Fleißarbeit, alle Varianten durchzugehen und zu schauen, ob immer das Erwartete passiert. Alternativ schreibst Du das Programm so um, dass es übersichtlicher wird. Du fragst in jedem Zweig Deiner Verarbeitung das selbe ab, braune/weiße und rote Augen. Programme sind eigentlich immer gleich aufgebaut: Eingabe, Verarbeitung, Ausgabe. Bei Dir sind die Eingaben eigentlich unabhängig voneinander, Du machst aber eine künstliche Abhängigkeit. Versuche Eingabe und Verarbeitung/Ausgabe zu trennen.

Die Variablennamen sind schlecht gewählt. q1 und q2 sagen überhaupt nichts aus, browneyes und whiteeyes sind sogar falsch und damit irreführend, es wird nämlich das Geschlecht abgefragt und zwar von den rotäugigen Fliegen!
Antworten