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.
Taschenrechner Python
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.
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.
"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?
Und wie genau könnte ich das tun, also verbessern?
@SerBlack: Warum kann hier
ein ValueError ausgelöst werden, hier
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?
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...")
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...")
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.
Nein, die Rechenoperatoren sind doch keine Zahlen.SerBlack hat geschrieben:Soll dann das so schreiben:
?Code: Alles auswählen
oper = int(input("Welche Rechenoperation soll durchgeführt werden? (+,-,/.,*): "))
Du musst testen ob einer der Rechenoperatoren eingegeben wurde.
z.B.
[codebox=python file=Unbenannt.txt]
if oper == '+'
[/code]
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.
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.
@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.
Deswegen habe ich ja gefragt in welcher Schleife das (Deiner Meinung nach) steht und warum.
Danke für die Hilfe! habe die Einrückung verbessert.
# -*- coding: iso-8859-1 -*-
Mein Problem ist: Wenn man Ja am Ende antwortet, wiederholt sich das Ergebnis und die Rechnung die man vorher eingegeben hat.
# -*- 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
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 hat geschrieben: Mein Problem ist: Wenn man Ja am Ende antwortet, wiederholt sich das Ergebnis und die Rechnung die man vorher eingegeben hat.
Wenn das wirklich stimmt, was bringt es dir denn dann wenn es dir jemand erklärt?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!)
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.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
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.SerBlack hat geschrieben:War nur ein kleiner Scherz am Rande. Heute ist mein Letzter Tag dann gehe ich !! (Usbekistan, Urlaub)
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.
Gruss
Eros
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
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?
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?