Browse Source

Eingabefehler abfangen fertig

stguegen 5 years ago
parent
commit
cd7ac5a546
1 changed files with 65 additions and 42 deletions
  1. 65 42
      Schaltjahr1.py

+ 65 - 42
Schaltjahr1.py

@@ -1,61 +1,83 @@
 # Schaltjahre
 # Autoren: Gunnar, Jan
 # Python 2.7.15
-# 2.2.19
+# 18.2.19
 
-#noch zu erledigen: Eingabefehler abfangen in Funktion packen, um Falscheingabe im x-ten Versuch abzufangen.
+
+#Kalenderreform 1582 nicht beruecksichtigt
 
 import math as m
 
-monate = ["Januar", "Februar", "Maerz", "April", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]
-einunddreissigtage = [1, 3, 5, 7, 8, 10, 12]
-dreissigtage = [4, 6, 9, 11]
-def Programm():
-    print ""
-    print "Bitte geben Sie ein Datum ein."
-    print ""
-    while True:
-        try:
-            jahr = raw_input("Jahr: ")
-            jahr = int(jahr)
-            break
-        except ValueError:
-            print "Bitte natuerliche Zahl eingeben!"
+monat = 0 #Anfangswert
+tag = 0 #Anfangswert
+monate = ["Januar", "Februar", "Maerz", "April", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] #fuer Ausgabe als Monatsname
+einunddreissigtage = [1, 3, 5, 7, 8, 10, 12] #Monate  mit 31 Tagen
+dreissigtage = [4, 6, 9, 11] #Monate mit 30 Tagen
+tagemonate = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] #Anzahl der Tage im Jahr, zu Beginn eines jeden Monats
+
+wochentage = ["Montag.", "Dienstag.", "Mittwoch.", "Donnerstag.", "Freitag.", "Samstag.", "Sonntag."] #fuer Ausgabe des Wochntags
+
+def EingabeMonat(): #integer Eingabe fuer Monat erzwingen
+    global monat
     while True:
         try:            
             monat = raw_input("Monat: ")
             monat = int(monat)
             break
         except ValueError:
-            print "Bitte natuerliche Zahl eingeben!"    
-    if monat > 12:
+            print "Bitte natuerliche Zahl eingeben!"
+
+def checkmonat(): #plausible Eingabe fuer Monat erzwingen
+    global monat
+    if monat > 12 or monat < 1:
         print "Fuer den Monat bitte Zahl zwischen 1 und 12 eingeben!"
-        monat = input("Monat: ")
+        EingabeMonat() #wiederholte Falscheingaben abfangen
+        checkmonat()
+
+def EingabeTag(): #integer Eingabe fuer Tag erzwingen
+    global tag
     while True:
         try:            
             tag = raw_input("Tag: ")
             tag = int(tag)
             break
         except ValueError:
-            print "Bitte natuerliche Zahl eingeben!"  
-    if tag > 31:
+            print "Bitte natuerliche Zahl eingeben!"
+
+def checktag(): #plausible Eingabe fuer Tag erzwingen
+    global tag
+    if tag > 31 or tag < 1: #unsinnige Zahlen fuer Tag ausschliessen
         print "Fuer den Tag bitte Zahl zwischen 1 und 31 eingeben!"
-        tag = input("Tag: ")
-    if monat in einunddreissigtage and tag > 31:
-        print "Der", monate[monat - 1], "hat nur 31 Tage!"
-        tag = input("Tag: ")
-    elif monat in dreissigtage and tag > 3:
+        EingabeTag()
+        checktag()        
+    if monat in dreissigtage and tag > 30: #31 fuer Monate mit 30 Tagen ausschliessen
         print "Der", monate[monat - 1], "hat nur 30 Tage!"
-        tag = input("Tag: ")
-    elif monat == 2 and tag > 29:
+        EingabeTag()
+        checktag()
+    if monat == 2 and tag > 29: #30 und 31 fuer Februar ausschliessen, 29 kann jetzt noch nicht ausgeschlossen werden
         print "Der Februar hat maximal 29 Tage!"
-        tag = input("Tag: ")
+        EingabeTag()
+        checktag()
         
-    tagemonate = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] #Anzahl der Tage im Jahr, zu Beginn eines jeden Monats
-    monatetage = tagemonate[monat - 1] #Anzahl der Tage im Jahr, zu Beginn des gewaehlten Monats
-    jahrtage = monatetage + tag #Anzahl der Tage im Jahr, zum gewaehlten Datum
-
-    wochentage = ["Montag.", "Dienstag.", "Mittwoch.", "Donnerstag.", "Freitag.", "Samstag.", "Sonntag."]
+def Programm(): #Hauptfunktion
+    print ""
+    print "Berechnung von Schaltjahren und Wochentagen nach dem astronomischen Kalender:" #Einleitung
+    print "Bitte geben Sie ein Datum ein."
+    print ""
+    
+    while True: #interger Eingabe fuer Jahr erzwingen
+        try:
+            jahr = raw_input("Jahr: ")
+            jahr = int(jahr)
+            break
+        except ValueError:
+            print "Bitte natuerliche Zahl eingeben!"
+            
+    EingabeMonat() #Eingabefehler abfangen
+    checkmonat()
+    EingabeTag()
+    checktag()
+    
 
     schaltjahr = "kein Schaltjahr." #Kein Jahr ist ein Schaltjahr,
     if jahr % 4 == 0:              #ausser es ist durch 4 teilbar,
@@ -65,8 +87,7 @@ def Programm():
             if jahr % 400 == 0:    #aber trotzdem, wenn es auch durch 400 teilbar ist.
                 schaltjahr = "ein Schaltjahr."
 
-
-    tage = (jahr - 1)* 365 #Anzahl Tage gesamt, zu Beginn des gewaehlten Jahrs
+    tage = (jahr - 1)* 365 #Anfangswert für Anzahl der Tage vor dem gewaehlten Jahr
 
     if jahr >= 4:                       #Alle 4 Jahre
         tage = tage + m.floor(jahr / 4) #wird 1 Tag addiert.
@@ -78,18 +99,20 @@ def Programm():
     if monat < 3 and schaltjahr == "Schaltjahr.": #Liegt das gewaehlte Datum in einem Schaltjahr und im Januar oder Februar,
         tage = tage - 1                               #wird ein Tag abgezogen.
 
-
+    monatetage = tagemonate[monat - 1] #Anzahl der Tage im Jahr, zu Beginn des gewaehlten Monats
+    jahrtage = monatetage + tag #Anzahl der Tage im Jahr, zum gewaehlten Datum
     tage = tage + jahrtage #Tage vor dem gewaehlten Jahr und Tage im gewaehlten Jahr werden addiert.
-    if schaltjahr == "kein Schaltjahr." and monat == 2 and tag == 29:
+
+    if schaltjahr == "kein Schaltjahr." and monat == 2 and tag == 29: #Ausgabe für 29. Februar in einem Nicht-Schaltjahr
         print "Das Jahr", jahr, "ist kein Schaltjahr."
         print "Daher gibt es in diesem Jahr keinen 29. Februar"
-    else:
+    else: #Ausgabe regulaer
         print ""
         print "Das Jahr", jahr, "ist", schaltjahr
-        print "Das gewaehlte Datum ist ein", wochentage[int(tage % 7 - 1)]  #Teilt gesamte Tage durch Laenge einer Woche und ordnet dem Rest einen Wochentag zu.
+        print "Der", str(tag)+".", monate[monat - 1], str(jahr),"ist ein", wochentage[int(tage % 7 - 1)]  #Teilt gesamte Tage durch Laenge einer Woche und ordnet dem Rest einen Wochentag zu.
     print ""
     print "Zum Berechnen eines weiteren Datums druecken Sie J. "
     nochmal = raw_input("Beenden des Programms mit beliebiger Taste. ")
-    if nochmal == "j" or nochmal == "J":
+    if nochmal == "j" or nochmal == "J": #ermoeglicht mehrmaliges Durchlaufen der Hauptfunktion
         Programm()
-Programm()
+Programm()#hier startet das Programm