Seite 1 von 1

Wieso funktioniert es nicht?

Verfasst: Freitag 6. Juli 2018, 13:59
von Sarius
Das ist der erste Teil eines Programms das Rechenaufgaben stellen soll. Ich verstehe nicht warum das Programm nicht funktioniert.

Code: Alles auswählen

#Rechenaufgabenprogramm
from random import randint
#0 = Nein, 1 = Ja
Addieren = 0
Subtrahieren = 0
Multiplizieren = 0
Dividieren = 0
print("Willkommen beim Üben von Matheaufgaben.")
print("Ich werde dir jetzt ein paar Fragen zu den Aufgaben stellen. Antworte bitte immer nur mit Ja oder Nein")
#1 = an 0 = Aus
FallsAllesFalschSchleife = 1
while FallsAllesFalschSchleife == 1: 
    try:
        Addierenfrage = input("Möchtest du Addieren üben? ")
        if Addierenfrage == "Ja":
            Addieren = 1
            print("Ok, weiter gehts.")
            return Addieren
        elif Addierenfrage == "Nein":
            print("Ok, weiter gehts.")
    except:
        print("Falsche Eingabe, versuche es nochmal.")
    try:
        Subtrahierenfrage = input("Möchtest du Subtrahieren üben? ")
        if Subtrahierenfrage == "Ja":
            Subtrahieren = 1
            print("Weiter gehts!")
            return Subtrahieren
        elif Subtrahierenfrage == "Nein":
            print("In Ordnung.")
    except:
        print("Falsche Eingabe, versuche es nochmal.")
    try:
        Multiplizierenfrage = input("Möchtest du Multiplizieren üben? ")
        if Multiplizierenfrage == "Ja":
            Multiplizieren = 1
            print("Wie du möchtest.")
            return Multiplizieren
        elif Multiplizierenfrage == "Nein":
            print("Wie du möchtest.")
    except:
        print("Falsche Eingabe, versuche es nochmal")
    try:
        Dividierenfrage = input("Möchtest du Dividieren üben? ")
        if Dividierenfrage == "Ja":
            Dividieren = 1
            print("Verstanden")
            return Dividieren
        elif Dividierenfrage == "Nein":
            print("Verstanden.")
    except:
        print("Alles Klar!")
    if Addieren == 1 or Subtrahieren == 1 or Multiplizieren == 1 or Dividieren == 1:
        FallsAllesFalschSchleife = 0
        return FallsAllesFalschSchleife
    else:
        none

Re: Wieso funktioniert es nicht?

Verfasst: Freitag 6. Juli 2018, 14:35
von Sirius3
Es wäre gut, wenn Du auch verraten würdest, was denn nicht funktioniert, also z.B. den SyntaxError, dass man `return` nicht außerhalb von Funktionen benutzen kann, was dann auch schon die Lösung für diesen Fehler wäre.

Dann solltest Du nie nakte excepts benutzen, weil die potentielle Programmierfehler verdecken könnten und nur die nichtsagende Meldung "Falsche Eingabe" ausgeben, die aber nie zutrifft, weil man alles eingeben kann, ohne dass eine Exception geworfen wird.

Re: Wieso funktioniert es nicht?

Verfasst: Freitag 6. Juli 2018, 14:46
von Sarius
Sirius3 hat geschrieben: Freitag 6. Juli 2018, 14:35 Es wäre gut, wenn Du auch verraten würdest, was denn nicht funktioniert, also z.B. den SyntaxError, dass man `return` nicht außerhalb von Funktionen benutzen kann, was dann auch schon die Lösung für diesen Fehler wäre.

Dann solltest Du nie nakte excepts benutzen, weil die potentielle Programmierfehler verdecken könnten und nur die nichtsagende Meldung "Falsche Eingabe" ausgeben, die aber nie zutrifft, weil man alles eingeben kann, ohne dass eine Exception geworfen wird.
Danke für die Antwort, kannst du mir villeicht auch sagen wie das Programm jetzt umgeschrieben werden muss?

Re: Wieso funktioniert es nicht?

Verfasst: Freitag 6. Juli 2018, 14:53
von Sirius3
Was willst Du denn mit den `return` bewirken?

Re: Wieso funktioniert es nicht?

Verfasst: Freitag 6. Juli 2018, 15:03
von Sarius
Sirius3 hat geschrieben: Freitag 6. Juli 2018, 14:53 Was willst Du denn mit den `return` bewirken?
Das ich zum Beispiel die 0 von Addieren mit der 1 überschreibe, sodas es nicht nur in der Schleife ist. Habe ich die Funktion von return falsch verstanden?

Re: Wieso funktioniert es nicht?

Verfasst: Freitag 6. Juli 2018, 15:38
von __blackjack__
Was Du erreichen willst, habe ich nicht wirklich verstanden, aber ``return`` ist, wie die Fehlermeldung ja schon sagt, eine Anweisung die nur innerhalb von Funktionen (und Methoden) stehen darf. Dort beendet sie die Abarbeitung der Funktion und gibt den Wert den man dahinter angibt an den Aufrufer der Funktion zurück.

Statt 0 und 1 zu verwenden und dazu zu kommentieren das 0 Nein und 1 Ja bedeuten soll, verwendet man `True` und `False`. Da ist dem Leser dann auch klar was davon was bedeutet und man weiss auch sofort das es sich nicht um Zahlen handelt.

In den letzten ``else``-Zweig in dem Quelltext wolltest Du bestimmt keinen `NameError` schreiben, denn `none` wird nirgends definiert, sondern den das ``else`` einfach komplett weg lassen.

Re: Wieso funktioniert es nicht?

Verfasst: Samstag 7. Juli 2018, 10:24
von Sirius3
Schleifen bilden keinen eigenen Namespace, das heißt, werde, die man einer Variable zuweist, sind auch außerhalb der Schleife bekannt. Also `return` weglassen und gut ist's.

Was noch nicht so gut ist, sind neben den 0 und 1 auch die Variablennamen. `FallsAllesFalschSchleife` ist ja keine Schleife und auch keine Bedingung, sondern der Zustand `soll_scheife_wiederholt_werden_weil_keine_rechenoperation_ausgewaehlt_wurde` oder kurz `nichts_gewaehlt`. Die ganzen Frage-Variablen enthalten keine Frage, sondern die Antwort. Man braucht auch nicht für jeden Abschnitt eine andere Variable, weil ziemlich klar ist, auf was sich die Antwort bezieht. Bei den ganzen Antwortmöglichkeiten fehlt jeweils noch der Fall, dass Werte mit »Ja« noch mit »Nein« geantwortet wurde.

Verfasst: Samstag 7. Juli 2018, 13:37
von Sarius
Ich hab das Programm jetzt umgeschrieben und es funktioniert. Danke für die Antworten!