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 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: 17754
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: 17754
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.
EEK
User
Beiträge: 14
Registriert: Donnerstag 6. April 2017, 07:41

SerBlack hat geschrieben: Mein Problem ist: Wenn man Ja am Ende antwortet, wiederholt sich das Ergebnis und die Rechnung die man vorher eingegeben hat.
Das kommt daher, weil du 3 getrennte while-Schleifen hast. Die Abfrage "Willst du weiter rechnen?..." ist ja nur in der dritten while-Schleife und somit wird auch nur diese wiederholt, wenn du was eingibst, das nicht "nein" ist.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Könntest du es mir erklären wie man diesen Fehler behebt? (Heute ist mein letzter Tag, dann gehe ich für immer weg. Nach Afrika, will ein leben ohne Technik!)
EEK
User
Beiträge: 14
Registriert: Donnerstag 6. April 2017, 07:41

SerBlack hat geschrieben:Könntest du es mir erklären wie man diesen Fehler behebt? (Heute ist mein letzter Tag, dann gehe ich für immer weg. Nach Afrika, will ein leben ohne Technik!)
Wenn das wirklich stimmt, was bringt es dir denn dann wenn es dir jemand erklärt?
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

War nur ein kleiner Scherz am Rande. Heute ist mein Letzter Tag dann gehe ich !! (Usbekistan, Urlaub)
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Dann mal einen schönen Urlaub! Du löst das Problem, indem du in deiner Schleife (auf sinnvolle Weise) alles zusammenfasst, was dann wiederholt werden soll.
Zuletzt geändert von Kebap am Freitag 7. April 2017, 11:15, insgesamt 1-mal geändert.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
EEK
User
Beiträge: 14
Registriert: Donnerstag 6. April 2017, 07:41

SerBlack hat geschrieben:War nur ein kleiner Scherz am Rande. Heute ist mein Letzter Tag dann gehe ich !! (Usbekistan, Urlaub)
Was du machen musst, hat dir Kebap ja schon gesagt. Du solltest dir aber wirklich die Grundlagen (noch)Mal anschauen. Wenn du mit so was schon Probleme hast, wirst du nicht besonders weit kommen beim Programmieren.
Eros
User
Beiträge: 9
Registriert: Montag 15. Februar 2021, 11:01

Moin Zusammen,

Ich habe mir diesen Code auch zufällig mal angeschaut. Ich bin dabei auf ein Problem gestossen, welches ich mir nicht erklären kann.
Wenn ich am schluss das Programm beenden will, muss ich, bei der Abfrage, ja einfach "Nein" eingeben. Obwohl ich dies mache, fährt das Programm fort und startet eigentlich wieder neu mit der Abfrage, welche Rechenoperation durchgeführt werden soll.

Code: Alles auswählen

doLoop = True
while doLoop:

    oper = input("Welche Rechenoperation soll durchgefuehrt werden? (+,-,/.,*): ")
    num1 = float(input("Gib die erste Zahl ein: "))
    num2 = float(input("Gib die zweite Zahl ein: "))

    num1 = int(num1)
    num2 = int(num2)

    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 gueltig")


    jein = input("Willst du weiter rechnen? (Ja/Nein)")

    if oper == "Nein":
        doLoop = False
        

Gruss

Eros
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Erklär mal, was die letzten 3 Zeilen mit Code deiner Meinung nach tun.

Zum Code:

if ist keine Funktion. Die Bedingung gehört nicht im Klammern.

Statt eine Variable auf True zu setzen und dann so lange die Schleife laufen lassen, bis sie False ist, würde man in python mit "while True:" eine Enlosschleife einleiten und die an gewünschter Stelle mit "break" verlassen.
"doLoop" sieht auch irgendwie wie Visual Basic aus. Unabhängig davon, dass die Variable überflüssig ist, schreibt man in Python Namen von Variablen klein_mit_unterstrich. Und man benutzt aussagekräftige Namen, keine verwirrenden Akürzungen. Welche Opern magst du denn am liebsten?
Antworten