Programm wiederholen

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

Hallo,

ich würde gerne wissen wie man ein Programm wiederholt.
Das Programm ist dieses hier:

print("Willkommen zu meinen Taschenrechner!")
a = 0
x = 1
c = 1
d = 1
while x == 1:
a = 0
y = input("Welche Rechenart willst du verwenden? ")
if y == "Addieren":
while c == 1:
try:
print(int(input("Gebe die erste Zahl ein: ")) + int(input("Gebe die zweite Zahl ein: ")))
x = 0
a = 1
c = 0
except:
print("Fehler, nochmal")
elif y == "Subtrahieren":
while c == 1:
try:
print(int(input("Gebe die erste Zahl ein: ")) - int(input("Gebe die zweite Zahl ein: ")))
x = 0
a = 1
c = 0
except:
print("Fehler, nochmal")
elif y == "Multiplizieren":
while c == 1:
try:
print(int(input("Gebe die erste Zahl ein: ")) * int(input("Gebe die zweite Zahl ein: ")))
x = 0
a = 1
c = 0
except:
print("Fehler, nochmal")
elif y == "Dividieren":
while c == 1:
try:
print(int(input("Gebe die erste Zahl ein: ")) / int(input("Gebe die zweite Zahl ein: ")))
x = 0
a = 1
c = 0
except:
print("Fehler, nochmal")
elif y == "Lösungsvorschläge":
print("Hast du den Fachbegriff benutzt? Hast du auf Groß- und Kleinschreibung geachtet?")
else:
print("Fehler, für Lösungsvorschläge gebe \"Lösungsvorschläge\" ein.")
while d == 1:
if a == 1:
b = input("Möchtest du noch eine Aufgabe stellen? ")
if b == "Ja":
x = 1
a = 0
elif b == "Nein":
print("Bis zum nächsten mal!")
break
else:
print("Fehler")

Wie kann ich es schaffen, das wen man Ja eingibt das Programm von Vorne beginnt? Also das es wieder mit der Frage "Welche Rechenart willst du verwenden?" startet?
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

du kennst und benutzt doch schon while-schleifen, wie wäre es damit?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

ThomasL hat geschrieben: Dienstag 5. Juni 2018, 18:43 du kennst und benutzt doch schon while-schleifen, wie wäre es damit?
X müsste sich ja eigentlich auch wieder auf 1 stellen, sodass es sich wiederholt. Aber es funktioniert anscheinend nicht. Oder mache ich einen Fehler?
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

das Problem für uns ist, dass wir den Code so nicht lesen können, da keine Formatierung erkennbar ist.
Bitte setzte den Code zwischen
[ Python]
# hier Code
[ /Python]
(jeweils ohne das Leerzeichen hinter der "[")
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

ThomasL hat geschrieben: Dienstag 5. Juni 2018, 19:08 das Problem für uns ist, dass wir den Code so nicht lesen können, da keine Formatierung erkennbar ist.
Bitte setzte den Code zwischen
[ Python]
# hier Code
[ /Python]
(jeweils ohne das Leerzeichen hinter der "[")

Code: Alles auswählen

print("Willkommen zu meinen Taschenrechner!")
a = 0
x = 1
c = 1
d = 1
while x == 1:
    a = 0
    y = input("Welche Rechenart willst du verwenden? ")
    if y == "Addieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) + int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Subtrahieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) - int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Multiplizieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) * int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Dividieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) / int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Lösungsvorschläge":
        print("Hast du den Fachbegriff benutzt? Hast du auf Groß- und Kleinschreibung geachtet?")
    else:
        print("Fehler, für Lösungsvorschläge gebe \"Lösungsvorschläge\" ein.")
while d == 1:
    if a == 1:
        b = input("Möchtest du noch eine Aufgabe stellen? ")
        if b == "Ja":
            x = 1
            a = 0
        elif b == "Nein":
            print("Bis zum nächsten mal!")
            break
        else:
            print("Fehler")
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Rücke mal den Code der 2. while Schleife um 4 Stellen ein
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

ThomasL hat geschrieben: Dienstag 5. Juni 2018, 19:36 Rücke mal den Code der 2. while Schleife um 4 Stellen ein
Dann würde doch ein Fehler entstehen, oder nicht? Oder hab ich was Falsch verstanden?
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Die erste while Schleife wird beendet und dann fragst du in der 2. while Schleife ob man wiederholen möchte,
beantwortet man das mit Ja, setzt du x zwar wieder auf 1, aber dann wird die 2. while Schleife beendet
und damit auch dein Programm.
Die Abfrage ob man Wiederholen möchte muss also auch innerhalb der ersten Schleife liegen, oder?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

ThomasL hat geschrieben: Dienstag 5. Juni 2018, 19:56 Die erste while Schleife wird beendet und dann fragst du in der 2. while Schleife ob man wiederholen möchte,
beantwortet man das mit Ja, setzt du x zwar wieder auf 1, aber dann wird die 2. while Schleife beendet
und damit auch dein Programm.
Die Abfrage ob man Wiederholen möchte muss also auch innerhalb der ersten Schleife liegen, oder?
Das Programm sieht nun so aus, funktioniert aber immer noch nicht:

Code: Alles auswählen

print("Willkommen zu meinen Taschenrechner!")
a = 0
x = 1
c = 1
d = 1
while x == 1:
    a = 0
    y = input("Welche Rechenart willst du verwenden? ")
    if y == "Addieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) + int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Subtrahieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) - int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Multiplizieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) * int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Dividieren":
        while c == 1:
            try:
                print(int(input("Gebe die erste Zahl ein: ")) / int(input("Gebe die zweite Zahl ein: ")))
                x = 0
                a = 1
                c = 0
            except:
                print("Fehler, nochmal")
    elif y == "Lösungsvorschläge":
        print("Hast du den Fachbegriff benutzt? Hast du auf Groß- und Kleinschreibung geachtet?")
    else:
        print("Fehler, für Lösungsvorschläge gebe \"Lösungsvorschläge\" ein.")
    while d == 1:
        if a == 1:
            b = input("Möchtest du noch eine Aufgabe stellen? ")
            if b == "Ja":
                x = 1
                a = 0
            elif b == "Nein":
                print("Bis zum nächsten mal!")
                break
            else:
                print("Fehler")
Zuletzt geändert von Sarius am Dienstag 5. Juni 2018, 20:18, insgesamt 1-mal geändert.
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Welche Bedingung muss denn erfüllt werden, damit die 2. while Schleife verlassen wird?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

ThomasL hat geschrieben: Dienstag 5. Juni 2018, 20:13 Welche Bedingung muss denn erfüllt werden, damit die 2. while Schleife verlassen wird?
Sie wird nur verlassen wenn man Nein eingibt.
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sie wird auch nicht verlassen wenn man Ja eingibt
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

ThomasL hat geschrieben: Dienstag 5. Juni 2018, 20:28 Sie wird auch nicht verlassen wenn man Ja eingibt
Jetzt funktioniert es! Vielen Dank für die Hilfe!
Edit: Aber dadurch geht der Fehlersatz wenn man am Anfang was Falsches eingetippt hat verloren. Kann man das auch noch beheben?
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sarius: gewöhn Dir gleich an sprechende Variablennamen zu benutzen, einbuchstabige sagen nichts. Also `Rechenart` statt `y`.

Statt while-Schleifen mit Flags benutzt man normalerweise Endlosschleifen while True: die man per break verläßt. Du setzt nämlich bei vielen Fällen x=0 obwohl erst später entschieden werden sollte, ob die äußere Schleife verlassen werden soll oder nicht.

Nakte excepts nie benutzen, weil da auch viele Programmierfehler verschluckt werden, die man dann nur schwer finden kann. Was Du hier willst, ist eigentlich nur einen ValueError. Eingabe und Ausgabe sollten eigentlich nicht in einer Zeile stehen, das macht das Lesen sehr schwer. Zudem hast Du vier Fälle, wo jeweils zwei Zahlen zu lesen sind, Du hast also Code 4 mal kopiert. Versuche möglichst viel gleichen Code nur einmal zu haben, also erst zwei Zahlen einlesen, dann nach Rechenoperation unterschiedlich das Ergebnis berechnen und dann wieder in einem Codepfad die Ausgabe machen.

Im Fall a=0 ist Deine letzte while-Schleife eine Endlosschleife. d hat nie einen anderen Wert als 1. Was Du wirklich mit a, d, c oder x meinst, ist nicht klar, weil die Namen so kurz sind. Bei längeren Namen wird die Logik klarer, und man würde schneller merken, dass da was nicht stimmen kann, oder dass eine Variable gar nicht sinnvoll ist.
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

Sirius3 hat geschrieben: Dienstag 5. Juni 2018, 23:20 @Sarius: gewöhn Dir gleich an sprechende Variablennamen zu benutzen, einbuchstabige sagen nichts. Also `Rechenart` statt `y`.

Statt while-Schleifen mit Flags benutzt man normalerweise Endlosschleifen while True: die man per break verläßt. Du setzt nämlich bei vielen Fällen x=0 obwohl erst später entschieden werden sollte, ob die äußere Schleife verlassen werden soll oder nicht.

Nakte excepts nie benutzen, weil da auch viele Programmierfehler verschluckt werden, die man dann nur schwer finden kann. Was Du hier willst, ist eigentlich nur einen ValueError. Eingabe und Ausgabe sollten eigentlich nicht in einer Zeile stehen, das macht das Lesen sehr schwer. Zudem hast Du vier Fälle, wo jeweils zwei Zahlen zu lesen sind, Du hast also Code 4 mal kopiert. Versuche möglichst viel gleichen Code nur einmal zu haben, also erst zwei Zahlen einlesen, dann nach Rechenoperation unterschiedlich das Ergebnis berechnen und dann wieder in einem Codepfad die Ausgabe machen.

Im Fall a=0 ist Deine letzte while-Schleife eine Endlosschleife. d hat nie einen anderen Wert als 1. Was Du wirklich mit a, d, c oder x meinst, ist nicht klar, weil die Namen so kurz sind. Bei längeren Namen wird die Logik klarer, und man würde schneller merken, dass da was nicht stimmen kann, oder dass eine Variable gar nicht sinnvoll ist.
Ich werde es mir merken! Vielen Dank für die Antwort
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Nicht nur merken, sondern gleich bei Deinem jetzigen Programm umsetzen ;-)
Antworten