Taschenrechner Python

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.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Ich weiß nicht, bei mir kam: http://www.python-kurs.eu/operatoren.php

Aber hab jetzt nach etwas anderem gesucht und geschafft:

Code: Alles auswählen

    jein = input("Willst du weiter rechnen? (Ja/Nein)")
 
    jein = jein.lower()
    if jein == 'nein': 
        print("Tschüss!")
        break
Und danke für die Hilfe!
EEK
User
Beiträge: 14
Registriert: Donnerstag 6. April 2017, 07:41

SerBlack hat geschrieben:Ich weiß nicht, bei mir kam: http://www.python-kurs.eu/operatoren.php

Aber hab jetzt nach etwas anderem gesucht und geschafft:

Code: Alles auswählen

    jein = input("Willst du weiter rechnen? (Ja/Nein)")
 
    jein = jein.lower()
    if jein == 'nein': 
        print("Tschüss!")
        break
Und danke für die Hilfe!
Du solltest dir trotzdem gleich angewöhnen, dass du Falscheingaben mit einem else-Zweig abfängst. So reagierst du ja nur auf "nein".
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

So habe es etwas erweitert :

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
 
while True:
    try:
        num1 = int(input("Gib die erste Zahl ein: "))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")


oper = input("Welche Rechenoperation soll durchgeführt werden? (+,-,/.,*): ")

while True:
    try:        
        num2 = int(input("Gib die zweite Zahl ein: "))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
 
if (oper == "+"):
    print("Deine Rechnung:", num1, " + ", num2)
    print("Ergebnis:", num1 + num2)
 
elif (oper == "-"):
    print("Deine Rechnung:", num1, " - ", num2)
    print("Ergebnis:", num1 - num2)
 
elif (oper == "/"):
    print("Deine Rechnung:", num1, " / ", num2)
    print("Ergebnis:", num1 / num2)
 
elif (oper == "*"):
    print("Deine Rechnung:", num1, " * ", num2)
    print("Dein Ergebnis:", num1 * num2)
else:
    print("Deine Eingaben sind nicht gültig")
 
jein = input("Willst du weiter rechnen? (Ja/Nein)")
 
jein = jein.lower()
if jein == 'nein': 
    break
    print("Tschüss!")
Mein Problem: SyntaxError: 'break' outside loop
Was mache ich falsch? Wie kann ich es verbessern?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@SerBlack: schau mal Deine Einrückungen an. Die machen so keinen Sinn. if-Bedingungen brauchen immer noch keine Klammern.
EEK
User
Beiträge: 14
Registriert: Donnerstag 6. April 2017, 07:41

SerBlack hat geschrieben: Mein Problem: SyntaxError: 'break' outside loop
Was mache ich falsch? Wie kann ich es verbessern?
Ohne deinen Code durchzulesen, liegt es ziemlich sicher an der falschen Einrückung
Edit: Warum hast du jetzt zwei while-Schleifen?
BlackJack

Die Frage ist eher warum es nicht drei ``while``-Schleifen sind. Zumindest wenn man die Codewiederholung für die Eingabe einer Zahl so stehen lassen will.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Sry, war gerade Essen:
Habe jetzt 3 While Schleifen eingesetzt. Was ist falsch? (Einrückung)
https://vid.me/ocwL
Zuletzt geändert von SerBlack am Donnerstag 6. April 2017, 11:21, insgesamt 1-mal geändert.
BlackJack

@SerBlack: Wie sollen wir das wissen ohne zu wissen wie der Code jetzt aussieht und welche Fehlermeldung jetzt kommt oder ob überhaupt eine kommt‽
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
 
while True:
    try:
        num1 = int(input("Gib die erste Zahl ein: "))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
 
while True:
    try: 
        oper = input("Welche Rechenoperation soll durchgeführt werden? (+,-,/.,*): ")
        break
    except ValueError:
            print("Ups! Das war keine gültige Eingabe. Versuche es noch einmal...")
 
while True:
    try:        
        num2 = int(input("Gib die zweite Zahl ein: "))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
 
if (oper == "+"):
    print("Deine Rechnung:", num1, " + ", num2)
    print("Ergebnis:", num1 + num2)
 
elif (oper == "-"):
    print("Deine Rechnung:", num1, " - ", num2)
    print("Ergebnis:", num1 - num2)
 
elif (oper == "/"):
    print("Deine Rechnung:", num1, " / ", num2)
    print("Ergebnis:", num1 / num2)
 
elif (oper == "*"):
    print("Deine Rechnung:", num1, " * ", num2)
    print("Dein Ergebnis:", num1 * num2)
else:
    print("Deine Eingaben sind nicht gültig")
 
jein = input("Willst du weiter rechnen? (Ja/Nein)")
 
jein = jein.lower()
if jein == 'nein':
    break
    print("Tschüss!")
SyntaxError: 'break' outside loop
BlackJack

@SerBlack: Zu welcher ``while``-Schleife soll denn das ``break`` gehören? Und warum? So wie es jetzt da steht gehört es laut Fehlermeldung zu keiner Schleife.

Bei der Rechenoperation hast Du offenbar nicht ausprobiert was passiert wenn Du eine andere als die erfragten eingibst.

Ebenfalls nicht berücksichtig ist der Fall das als zweite Zahl 0 bei der Division eingegeben werden könnte.

Die drei ``while``-Schleifen sind sehr wahrscheinlich durch kopieren und einfügen und dann leicht abändern entstanden: Das sollte immer ein Warnzeichen sein. Code- und Datenwiederholungen sollte man vermeiden, weil das den Code bei Änderungen und Fehlerbeseitigungen fehleranfälliger macht. Man muss dann immer darauf achten das man auch alle Kopien von dem Code oder den Daten entsprechend ändert und keine Stelle vergisst, und auch überall die gleichen Änderungen durchführt.

Codewiederholungen vermeidet man durch Schleifen und/oder Funktionen, wo der gemeinsame Code von den veränderlichen Teilen/Daten getrennt wird. Der Code zur Eingabe einer Zahl unterscheidet sich beispielsweise nur durch den Aufforderungstext bei der Eingabe und den Namen an den die Zahl gebunden wird.

Auch bei den Ausgaben bei den einzelnen Berechnungen wiederholt sich viel. Dort würde ich nur die Berechnungen durchführen und am Ende dann einmal eine Ausgabe schreiben.

Der ``else``-Zweig ist in der Form unnötig wenn man den Benutzer zwingt eine gültige Eingabe für die Operation zu machen.

Und die Klammern um die Bedingungen bei ``if`` und ``elif`` gehören da immer noch nicht hin. Entferne die doch endlich mal.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Ich denke else ist notwendig, weil man sonst Buchstaben beim Rechenoperation eingeben könnte. Ich habe dann die Klammern raus genommen, die dre iwhile schleifen wurden teilweise kopiert (Tutorial, dort gelernte, aber nicht so gute).

"Auch bei den Ausgaben bei den einzelnen Berechnungen wiederholt sich viel. Dort würde ich nur die Berechnungen durchführen und am Ende dann einmal eine Ausgabe schreiben."

Habe nicht ganz verstanden, was du damit meinst. :?:
BlackJack

Der ``else``-Zweig ist in der Form unnötig wenn man den Benutzer zwingt eine gültige Eingabe für die Operation zu machen. Und mit kopieren ist nicht nur aus einem Tutorial kopieren gemeint, sondern wenn Du in Deinem *eigenen* Code anfängst Teile zu kopieren und leicht anzupassen, dann ist das auch in der Regel ein Warnzeichen das Du was falsch machst.

Es sieht halt weiter oben so aus als würdest Du den Benutzer zwingen wollen eine der angebotenen Rechenoperation zu wählen, es macht ja auch Sinn, nur tut der Code das nicht. Die Schleife hat so wie sie da steht keinen Effekt weil da niemals ein `ValueError` ausgelöst wird und damit immer im ersten Schleifendurchlauf das ``break`` erreicht wird. Und eine Schleife die grundsätzlich genau *einmal* ausgeführt wird, ist sinnlos, weil semantisch keine Schleife.

Bei den Berechnungen steht immer wieder und wieder zweimal `print()` mit fast den gleichen Daten. Wenn Du den Text ändern möchtest, musst Du den viermal ändern, statt nur einmal. Berechnung und Ausgabe sollte man hier trennen und in den ``if``/``elif``-Zweigen nur die Berechnung durchführen und dann *danach* zwei `print()`-Aufrufe stehen haben, die das Ergebnis ausgeben.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

"Es sieht halt weiter oben so aus als würdest Du das tun wollen, es macht ja auch Sinn, nur tut der Code das nicht. Die Schleife hat so wie sie da steht keinen Effekt weil da niemals ein `ValueError` ausgelöst wird und damit immer im ersten Schleifendurchlauf das ``break`` erreicht wird. Und eine Schleife die grundsätzlich genau *einmal* ausgeführt wird, ist sinnlos, weil semantisch keine Schleife."

Und wie genau könnte ich das tun, also verbessern?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@SerBlack: Warum kann hier

Code: Alles auswählen

while True:
    try:
        num1 = int(input("Gib die erste Zahl ein: "))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
ein ValueError ausgelöst werden, hier

Code: Alles auswählen

while True:
    try:
        oper = input("Welche Rechenoperation soll durchgeführt werden? (+,-,/.,*): ")
        break
    except ValueError:
            print("Ups! Das war keine gültige Eingabe. Versuche es noch einmal...")
aber nicht? Wer prüft im ersten Fall, ob eine gültige Zahl eingegeben wurde? Wer prüft im zweiten Fall, ob es eine gültige Eingabe war?
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Soll ich es dann so schreiben:

Code: Alles auswählen

oper = int(input("Welche Rechenoperation soll durchgeführt werden? (+,-,/.,*): "))
?
Zuletzt geändert von SerBlack am Donnerstag 6. April 2017, 12:21, insgesamt 1-mal geändert.
EEK
User
Beiträge: 14
Registriert: Donnerstag 6. April 2017, 07:41

SerBlack hat geschrieben:Soll dann das so schreiben:

Code: Alles auswählen

oper = int(input("Welche Rechenoperation soll durchgeführt werden? (+,-,/.,*): "))
?
Nein, die Rechenoperatoren sind doch keine Zahlen.
Du musst testen ob einer der Rechenoperatoren eingegeben wurde.
z.B.
[codebox=python file=Unbenannt.txt]
if oper == '+'
[/code]
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@SerBlack: statt irgendetwas zu raten, kannst Du versuchen, meine Fragen zu beantworten?
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Und dürfte ich fragen warum: "SyntaxError: 'break' outside loop" kommt?

Surius3: Hier kann ein ValueError ausgelöst werden weil er weiß das es Zahlen sein muss (durch int)
Und bei 2. wird kein ValueError ausgelöst, da er nicht weiß ob das ein Buchstabe,Zahl oder etwas anderes sein muss.
BlackJack

@SerBlack: Weil die ``break``-Anweisung nicht innerhalb einer Schleife steht. ``break`` verlässt die Schleife in der diese Anweisung steht, und wenn sie nicht in einer Schleife steht, dann ist halt nicht klar was das soll.

Deswegen habe ich ja gefragt in welcher Schleife das (Deiner Meinung nach) steht und warum.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Danke für die Hilfe! habe die Einrückung verbessert.

# -*- coding: iso-8859-1 -*-

Code: Alles auswählen

while True:
    try:
        num1 = int(input("Gib die erste Zahl ein: "))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
        
oper = input("Welche Rechenoperation soll durchgeführt werden? (+,-,/.,*): ")

while True:
    try:        
        num2 = int(input("Gib die zweite Zahl ein: "))
        break
    except ValueError:
        print("Ups! Das war keine gültige Zahl. Versuche es noch einmal...")
 
while True:
    if (oper == "+"):
        print("Deine Rechnung:", num1, " + ", num2)
        print("Ergebnis:", num1 + num2)
 
    elif (oper == "-"):
        print("Deine Rechnung:", num1, " - ", num2)
        print("Ergebnis:", num1 - num2)
 
    elif (oper == "/"):
        print("Deine Rechnung:", num1, " / ", num2)
        print("Ergebnis:", num1 / num2)
 
    elif (oper == "*"):
        print("Deine Rechnung:", num1, " * ", num2)
        print("Dein Ergebnis:", num1 * num2)
    else:
        print("Deine Eingaben sind nicht gültig")
 
    jein = input("Willst du weiter rechnen? (Ja/Nein)")
 
    jein = jein.lower()
    if jein == 'nein':
        print("Tschüss!")
        break
Mein Problem ist: Wenn man Ja am Ende antwortet, wiederholt sich das Ergebnis und die Rechnung die man vorher eingegeben hat.
Antworten