Wieso funktioniert es nicht?

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
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

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
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

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?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Was willst Du denn mit den `return` bewirken?
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

Ich hab das Programm jetzt umgeschrieben und es funktioniert. Danke für die Antworten!
Antworten