Hallo,
das mit dem try ist eine gute Sache, der Rest ist vielleicht etwas kompliziert.
Wenn du das Programm neu starten möchtest, funktioniert das hier vielleicht:
Schreibe am Anfang des Programmes:
beachte dabei, dass alles darunter eingerückt werden muss.
Am Ende des Programmes ist, denke ich mir mal, eine Abfrage, ob das Programm nochmal ausgeführt werden soll. Sagt der Benutzer "Nein", sollte es so aussehen:
Du kannst eine genauere Unterscheidung mit elif machen, damit bei einer fehlerhaften Eingabe das Programm nicht neu startet, wie beispielsweise:
Code: Alles auswählen
if restart == 'n':
break
elif restart == 'j';
continue
else:
restart = raw_input("Ihre Eingabe war nicht eindeutig. Bitte versuchen Sie es erneut!")
wobei bei Umsetzung des else-Zweiges eine weitere while-Schleife mit der Bedingung "True" unabdingbar ist.
Aus Sicherheitsgründen solltest du auch von input() Abstand nehmen. Gehe mal in den interaktiven Modus, gebe dort
und wenn du danach zur Eingabe gebeten wirst, gebe einfach mal
ein. Es erscheint eine Fehlermeldung, die einen falschen Syntax meldet.
Um das zu verhindern, solltest du IMMER raw_input() verwenden.
Denn wenn du
verwendest und dahinter, bei Abfrage
schreibst, wird genau das ausgegeben, was du eingegeben hast.
Achja, übrigens noch:
Derzeit würde dir dein Programm bei der Berechnung von 2 / 3 0 ausgeben. Das liegt daran, dass das Ergebnis einer Division einer Zahl ohne Dezimalpunkt durch eine Zahl ohne Dezimalpunkt in Python keinen Dezimalpunkt hat, d. h., wenn die Zahlen, mit denen zu rechnen sind, in der Zahlenmenge der Ganzen Zahlen liegen, liegt das Ergebnis auch dort.
Um das zu verhindern, reicht es, einer Zahl ein .0 anzuhängen. Um das dem Benutzer aber zu verschleiern, reicht es, folgende Zeile einzufügen:
Der Punkt ist dabei das wichtige, die zweite Zahl wird hier nämlich im voraus durch 1.0 dividiert.
Und nochwas:
Durch das try: kannst du auch ein korrektes Ergebnis bei Division durch 0 übergeben, statt eines Fehlers:
Code: Alles auswählen
elif choice == 4 :
print ("Bitte stellen Sie nun Ihre Aufgabe")
zahl_1 = int(input("Erste Zahl: "))
zahl_2 = int(input("Zweite Zahl: "))
try:
result = zahl_1 / zahl_2
except ZeroDivisionError:
result = "Nicht definiert"
print result
Ansonsten würde der Benutzer bei einer Aufgabe wie 20 / 0 folgendes kriegen:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
0/0
ZeroDivisionError: integer division or modulo by zero
und das Programm wäre beendet.
So, als letztes vielleicht noch eine sauberere Lösung zum Neustart als ich oben genannt habe:
Code: Alles auswählen
def restart():
"""Asks the user if he wants to restart the calculator. """
while True:
reboot = raw_input(
"""Die Ausfuehrung des Programmes war erfolgreich. Wollen Sie es
neu starten? [J]a, [N]ein: """
)
reboot = reboot.lower()
if reboot == 'j':
print
choice()
elif reboot == 'n':
sys.exit()
else:
print """Ihre Eingabe war leider nicht eindeutig. Bitte versuchen
Sie es erneut. """
Damit das dann aufgerufen wird, musst du die Funktion restart() am besten nach ganz oben schreiben und diese dann am Ende deiner Datei einfach mit restart() aufrufen. In meinem Beispiel ist es aber so, dass auch das Auswahlmenü in einer Funktion steckt. Des weiteren musst du bei meinem Beispiel noch über die Funktion restart() folgendes schreiben:
Da das alles vielleicht ein bisschen umständlich klingt, habe ich mir auch mal einen Taschenrechner zusammen getüftelt. Einige Bildschirmausgaben und andere Strings sind gemäß PEP8 zweizeilig, deshalb werden sie mit drei Anführungszeichen eingeleitet.
Code: Alles auswählen
# A simple calculator
# Addition, subtraction, multiplication und exponentiation are
# supported
import sys
def addition_calc(num1, num2):
"""Addition of the two numbers num1 and num2. Function prints result."""
result = num1 + num2
print "Das Ergebnis der Rechnung lautet:", result
def subtraction_calc(num1, num2):
"""Subtraction of the two numbers num1 and num2. Function prints result."""
result = num1 - num2
print "Das Ergebnis der Rechnung lautet:", result
def multiplication_calc(num1, num2):
"""Multiplication of the two numbers num1 and num2. Function prints
result."""
result = num1 * num2
print "Das Ergebnis der Rechnung lautet:", result
def division_calc(num1, num2):
"""Division of the two numbers num1 and num2. Function prints result."""
num2 /= 1.
try:
result = num1 / num2
except ZeroDivisionError:
result = "Nicht definiert"
print "Das Ergebnis der Rechnung lautet:", result
def exponentiation_calc(num1, num2):
"""Exponentation of the two numbers num1 and num2. Function prints
result"""
result = num1 ** num2
print "Das Ergebnis der Rechnung lautet:", result
def addition_demand():
"""Function demands user to input the required numbers and calls the
function addition_calc()"""
while True:
try:
num1 = int(
raw_input(
"Geben Sie bitte den ersten Summanden ein: "
)
)
num2 = int(
raw_input(
"Geben Sie bitte den zweiten Summanden ein: "
)
)
break
except ValueError:
print """Deine Eingabe war keine Zahl. Bitte versuche es noch
einmal."""
print
addition_calc(num1, num2)
def subtraction_demand():
"""Function demands user to input the required numbers and calls the
function subtraction_calc()"""
while True:
try:
num1 = int(
raw_input(
"Geben Sie bitte den Minuent ein: "
)
)
num2 = int(
raw_input(
"Geben Sie bitte den Subtrahend ein: "
)
)
break
except ValueError:
print """Deine Eingabe war keine Zahl. Bitte versuche es noch
einmal."""
print
subtraction_calc(num1, num2)
def multiplication_demand():
"""Function demands user to input the required numbers and calls the
function multiplication_calc()"""
while True:
try:
num1 = int(
raw_input(
"Geben Sie bitte den ersten Faktor ein: "
)
)
num2 = int(
raw_input(
"Geben Sie bitte den zweiten Faktor ein: "
)
)
break
except ValueError:
print """Deine Eingabe war keine Zahl. Bitte versuche es noch
einmal."""
print
multiplication_calc(num1, num2)
def division_demand():
"""Function demands user to input the required numbers and calls the
function division_calc()"""
while True:
try:
num1 = int(
raw_input(
"Geben Sie bitte den Divisor ein: "
)
)
num2 = int(
raw_input(
"Geben Sie bitte den Divident ein: "
)
)
break
except ValueError:
print """Deine Eingabe war keine Zahl. Bitte versuche es noch
einmal."""
print
division_calc(num1, num2)
def exponentiation_demand():
"""Function demands user to input the required numbers and calls the
function division_calc()"""
while True:
try:
num1 = int(
raw_input(
"Geben Sie bitte die Basis ein: "
)
)
num2 = int(
raw_input(
"Geben Sie bitte den Exponenten ein: "
)
)
break
except ValueError:
print """Deine Eingabe war keine Zahl. Bitte versuche es noch
einmal."""
print
exponentiation_calc(num1, num2)
def choice():
"""User decides the arithmetic operator. Function calls, depending on the
user's decision, the demand()-function. """
print "[1] Addition"
print "[2] Subtraktion"
print "[3] Multiplikation"
print "[4] Division"
print "[5] Potenzierung"
while True:
try:
arithmetic_op = int(
raw_input(
"Bitte waehlen Sie eine Rechenoperation: "
)
)
break
except ValueError:
print "Ihre Eingabe war keine Zahl. Bitte versuchen Sie es erneut."
if arithmetic_op == 1:
addition_demand()
elif arithmetic_op == 2:
subtraction_demand()
elif arithmetic_op == 3:
multiplication_demand()
elif arithmetic_op == 4:
division_demand()
elif arithmetic_op == 5:
exponentiation_demand()
else:
print """Ihre Eingabe war nicht eindeutig. Bitte versuchen Sie es
erneut."""
choice()
def restart():
"""Asks the user if he wants to restart the calculator. """
while True:
reboot = raw_input(
"""Die Ausfuehrung des Programmes war erfolgreich. Wollen Sie es
neu starten? [J]a, [N]ein: """
)
reboot = reboot.lower()
if reboot == 'j':
print
choice()
elif reboot == 'n':
sys.exit()
else:
print """Ihre Eingabe war leider nicht eindeutig. Bitte versuchen
Sie es erneut. """
print "Herzlich Willkommen zum Taschenrechner!"
choice()
print
restart()