Ich bin ein Python-Neuling und habe mal ein bisschen in einem Tutorial gelesen und wollte anschließend soeben erworbenes Wissen durch coden eines Programms testen.
Das Programm funktioniert wiefolgt:
* Es erwartet Zwei mal eine Eingabe und zwar Brutto-Einkommen und Familienstand.
* Der Wert der Funktion input() wird beide male einer Variablen zugewiesen (brutto und fam).
* Nachdem beide Variablen auf bestimmte Kriterien überprüft werden, wird aus ihnen der Steuersatz, das Netto-Einkommen und der Steuerbetrag errechnet/bestimmt und anschließend ausgegeben.
Hier est mal der Code:
Code: Alles auswählen
print "\n\nBitte geben sie ihr Brutto-Gehalt in Euro ein und"
print "bestaetigen Sie die Eingabe mit [Enter]."
#-------------------------Brutto-Einkommen----------------------------#
errorcounter = 1 # errorcounter = 1 ^= Error
# errorcounter = 0 ^= No Error
while errorcounter == 1:
try:
brutto = input()
if brutto>=0:
errorcounter = 0
else:
print "\nIhre Eingabe muss positiv sein."
print "Bitte ueberpruefen und Eingabe wiederholen."
except:
print "\nBitte ueberpruefen Sie ob ihre Eingabe nur aus Zahlen besteht"
print "und wiederholen sie ihre Eingabe."
#----------------------------Famileinstand-----------------------------#
print "\nBitte waehlen sie ihren Familienstand:"
print " 1 = ledig"
print " 2 = verheiratet"
errorcounter2 = 1 # errorcounter2 = 1 ^= Error
# errorcounter2 = 0 ^= No Error
while errorcounter2 == 1:
try:
fam=input()
if fam == 1:
errorcounter2 = 0
elif fam == 2:
errorcounter2 = 0
else:
print "\nIhre Eingabe muss 1 (Eins) oder 2 (Zwei) sein."
print "Bitte ueberpruefen und Eingabe wiederholen."
except:
print "\nIhre Eingabe muss 1 (Eins) oder 2 (Zwei) sein."
print "Bitte ueberpruefen und Eingabe wiederholen."
#-------------------------------Berechnungen------------------------------#
if brutto > 4000 and fam == 1: #Aufschluesselung des Steuersatzes
satz = 26
elif brutto > 4000 and fam == 2:
satz = 22
elif brutto <= 4000 and fam == 1:
satz = 22
elif brutto <= 4000 and fam == 2:
satz = 18
def steuer(brutto,fam):
foo = (brutto*satz)/100 #Betrag an Steuergeld
netto = brutto - foo #Bruttobetrag abzüglich Steuern ^= Nettobetrag
print "\nIhr Steuersatz betraegt: ",satz,"%\n"
print "Ihr Netto-Einkommen: %.2f Euro\n" % (netto)
print "Der Staat klaute Ihnen: %.2f Euro\n" % (foo)
steuer(brutto,fam)
Ich habe das Programm laufen lassen und bei der Ersten Eingabe (Brutto-Einkommen) folgendes eingegeben:
"errorcounter == 0"
Dadurch Springt Das Programm weiter zur Familienstand-Abrage (Zeile Nr. 24 in obigem Code).
Nachdem ich mir das Geschehen überlegt habe bin ich zum Schluss gekommen, dass "errorcounter == 0 >= 0"(Zeile 12) als Fehler gewertet wird (Die Eingabe ist nicht vergleichbar mit der Integerzahl brutto).
Folglich springt das Programm sofort in den except-Zweig. Dann will es anschließend wieder mit der while-Schleife von vorne beginnen. Doch gleich in der ersten Zeile der while-Schleife wird diese abgebrochen, da "errorcounter == 1" False ergibt. (In Worten: Die Schleifenbedingung ist nicht erfüllt --> Schleife auslassen, Nachfolgenden Code interpretieren)
Es folgt also nun die Zweite Eingabe. Ich habe mir überlegt ich könnte doch wieder das gleiche wie vorhin probieren. Folgich habe ich "errorcounter2 == 0" eingegeben. Doch das Programm antwortete mit der Meldung aus dem except-Zweig(Zeile 42 und 43) was mich schon mal verwundert hat.
Bei einem weiteren Start des Programmes habe ich an der Stelle der Eingabeaufforderung in der 2. While-Schleife gleich wie in der 1. While Schleife "errorcounter == 0" eingegeben. Beachte: Nicht errorcounter2, sondern wieder errorcounter. Und siehe da, das Programm überspringt die While-Schleife und läuft bis zum Schluss.
* Wieso kommt man mit "errorcounter == 0" durch die 2. While-Schleife?
* Stimmt mein Gedankenweg überhaupt? Habe ich was mit try-except, input oder sonstiges falsch verstanden?
* Kann man durch die Funktion raw_input() erreichen, dass das Programm nicht auf die Eingabe errorcounter == 0 reagiert (also nicht die Schleife überspringt) und falls ja, wie würde so ein Code aussehen? bzw. kann man auch ohne dieser Funktion(raw_input) das Gleiche erreichen?
Danke fürs lesen und danke für eine Antwort.
Mfg
1xNdR