In wie vielen Tagen ist Semesterbeginn?

Aufgabe

In dieser Aufgabe geht es darum, erste Erfahrung mit Python-Modulen zu machen. An dieser Aufgabe soll vor allem ersichtlich werden, wie sich der Einsatz von (guten) Modulen auf die Lesbarkeit eines Programms auswirkt.

1.

Zuerst machen wir es ganz ohne Modulen. Sobald Ihnen diese Teilaufgabe (zurecht!) zu nervig wird, können Sie gerne zur Teilaufgabe 2 wechseln.

Schreiben Sie ein Programm, welches ein Datum d1 und ein Datum d2 bekommt und die Anzahl der Tage zwischen d1 und d2 berechnet. Achten Sie dabei…

  • … auf Schaltjahre. Ein Jahr ist genau dann ein Schaltjahr, wenn folgende Bedingungen gelten:
    • Das Jahr lässt sich ohne Rest durch vier teilen (Rest also 0).
    • Das Jahr lässt sich nicht ohne Rest durch hundert teilen (Rest also ungleich 0) oder es lässt sich durch vierhundert ohne Rest teilen.
  • … dass die übergebenen Daten korrekt sind (im Sinne des gregorianischen Kalenders).
    • Zum Beispiel mit einer Klasse “Datum”, welche ein Datum repräsentieren kann.
2.
Erst öffnen, wenn Sie Aufgabe 1 gelöst haben.

Schreiben Sie nun dasselbe Programm neu.

Nutzen Sie diesmal jedoch das Modul datetime. Wir haben Ihnen die Dokumentation verlinkt, hier sind vor allem die Abschnitte date Objects und timedelta Objects relevant.

Falls Sie sich durch die Dokumentation überfordert fühlen, ist das überhaupt kein Problem. Genau wie beim programmieren: Übung macht den Meister. Schauen Sie sich in diesem Fall gerne Tipp 2 unten an :)

Bonus:

Was fällt Ihnen auf, wenn Sie beide Programme bezüglich der Komplexität und Lesbarkeit vergleichen?

Tipp für 1.

Achtung Spoiler!

Aus der Vorlesung ist bekannt, dass man mit dem Operator % den Rest berechnen kann, z.B. 5 % 2 = 1.

Tipp für 2.

Achtung Spoiler!
import datetime as dt

# So erstellt man mithilfe des datetime Moduls ein Datum bzw. genauer gesagt eine Instanz der "date" Klasse (welche ein Datum repräsentiert)
d1 = dt.date(2042, 1, 1)
d2 = dt.date(2077, 12, 10)

# die date Klasse implementiert die __str__ Funktion, quak quak
print(d1)
print(d2)

# Das datetime Modul beinhaltet auch unterschiedliche Operatoren für dessen Objekte, so kann man z.B. zwei Daten substrahieren, als Ergebnis bekommt man ein "timedelta" Objekt, welches (unter anderem) die Tage zwischen den beiden Daten enthält!
# Wie praktisch!
print(f"Just {(d2 - d1).days} days left!")

Versuchen Sie diesen Code hier auszuführen. Welche Fehlermeldung tritt auf und wieso? Und warum ist dies für uns sehr praktisch?

import datetime as dt

d1 = dt.date(3939, 39, 39)
XKCD XKCD Abbildung 1: Eine Grafik zum Thema1