Einstieg - Halb so alt

Halb so alt

Hallo! Heute am 21.02.2010 bin ich knapp 3 Jahre alt. Geboren wurde ich am 13.05.2006. Übrigens, am 02.04.2008 war ich genau halb so alt wie ich heute bin.

Hühner

Aufgabe 1

Wann warst du genau halb so alt wie du heute bist? Kannst du das Datum dieses Tages angeben? Wie könntest du den Tag ungefähr bestimmen? Was müsstest du alles beachten, wenn du ihn genau bestimmen wolltest?

Programm zur Bestimmung des halb-so-alt-Datums

Mit dem folgenden Programm kannst du den Tag bestimmen, an dem du halb so alt warst.

# Initialisierung
datumGeburt = (21, 1, 1992)
datumHeute = (5, 7, 2009)
# Verarbeitung
anzahl = 0
datum = datumGeburt
while datum != datumHeute:
    (tag, monat, jahr) = datum
    if monat in [1, 3, 5, 7, 8, 10, 12]:
        maxtage = 31
    elif monat in [4, 6, 9, 11]:
        maxtage = 30
    elif (jahr % 400 == 0) or ((jahr % 4 == 0) and not (jahr % 100 == 0)):
        maxtage = 29
    else:
        maxtage = 28
    if tag < maxtage:
        tag = tag + 1
    elif monat < 12:
        tag = 1
        monat = monat + 1
    else:
        tag = 1
        monat = 1
        jahr = jahr + 1
    datum = (tag, monat, jahr)
    anzahl = anzahl + 1
halbeanzahl = anzahl // 2
datum = datumGeburt
zaehler = 0
while zaehler < halbeanzahl:
    (tag, monat, jahr) = datum
    if monat in [1, 3, 5, 7, 8, 10, 12]:
        maxtage = 31
    elif monat in [4, 6, 9, 11]:
        maxtage = 30
    elif (jahr % 400 == 0) or ((jahr % 4 == 0) and not (jahr % 100 == 0)):
        maxtage = 29
    else:
        maxtage = 28
    if tag < maxtage:
        tag = tag + 1
    elif monat < 12:
        tag = 1
        monat = monat + 1
    else:
        tag = 1
        monat = 1
        jahr = jahr + 1
    datum = (tag, monat, jahr)
    zaehler = zaehler + 1
datumHalbzeit = datum
# Ausgabe
print("Geburtsdatum:", datumGeburt)
print("aktuelles Datum:", datumHeute)
print("halb-so-alt-Datum:", datumHalbzeit)

Aufgabe 2

(a) Teste das Programm. Ändere ggf. zuvor die Zuweisungen im Initialisierungsteil so ab, dass sie zu deinen Daten passen.

(b) Warum ist es recht schwierig, den Berechnungsablauf im vorliegenden Programm zu durchschauen?

Bausteine zur Bestimmung des halb-so-alt-Datums

Gegeben sind die folgenden Programmeinheiten (man nennt sie auch Funktionsdefinitionen):

def schaltjahr(jahr):
    if (jahr % 400 == 0) or ((jahr % 4 == 0) and not (jahr % 100 == 0)):
        return True
    else:
        return False

def anzahlTageImMonat(monat, jahr):
    if monat in [1, 3, 5, 7, 8, 10, 12]:
        anzahl = 31
    elif monat in [4, 6, 9, 11]:
        anzahl = 30
    elif schaltjahr(jahr):
        anzahl = 29
    else:
        anzahl = 28
    return anzahl

def naechstesDatum(datum):
    (tag, monat, jahr) = datum
    if tag < anzahlTageImMonat(monat, jahr):
        tag = tag + 1
    elif monat < 12:
        tag = 1
        monat = monat + 1
    else:
        tag = 1
        monat = 1
        jahr = jahr + 1
    return (tag, monat, jahr)

def anzahlTageZwischenDatum(datum1, datum2):
    anzahl = 0
    datum = datum1
    while datum != datum2:
        datum = naechstesDatum(datum)
        anzahl = anzahl + 1
    return anzahl

def datumTageNachDatum(datum1, anzahlTage):
    anzahl = 0
    datum = datum1
    while anzahl < anzahlTage:
        datum = naechstesDatum(datum)
        anzahl = anzahl + 1
    return datum

Du musst diese Funktionsdefinitionen auf den ersten Blick nicht ganz durchschauen.

Aufgabe 3

(a) Speichere diese Funktionsdefinitionen in einer Datei (z.B. halbsoalt.py) ab und führe sie einmal aus, damit sie vom Python-Interpreter übernommen werden.

Du kannst die definierten Funktionen jetzt einzeln testen, indem du Funktionsaufrufe wie die folgenden im Ausführfenster eingibst.

>>> schaltjahr(2010)
False
>>> schaltjahr(2012)
True
>>> anzahlTageImMonat(3, 2010)
31
>>> anzahlTageImMonat(2, 2012)
29
>>> naechstesDatum((3, 3, 2010))
(4, 3, 2010)
>>> naechstesDatum((28, 2, 2012))
(29, 2, 2012)
>>> anzahlTageZwischenDatum((10, 5, 2010), (10, 6, 2010))
31
>>> datumTageNachDatum((10, 5, 2010), 31)
(10, 6, 2010)

Führe selbst weitere Tests durch.

(b) Beschreibe möglichst genau, was die einzelnen Funktionen leisten.

Aufgabe 4

Mit den gegebenen Funktionen kannst du jetzt das Datum bestimmen, an dem du halb so alt warst. Du musst hierzu nur die richtigen Funktionsaufrufe auswerten lassen.

Ein Programm mit Funktionsbausteinen zur Bestimmung des halb-so-alt-Datums

Ausgehend von den Funktionsdefinitionen lässt sich jetzt auch ein Programm zur Bestimmung des halb-so-alt-Datums erstellen:

def schaltjahr(jahr):
    if (jahr % 400 == 0) or ((jahr % 4 == 0) and not (jahr % 100 == 0)):
        return True
    else:
        return False

def anzahlTageImMonat(monat, jahr):
    if monat in [1, 3, 5, 7, 8, 10, 12]:
        anzahl = 31
    elif monat in [4, 6, 9, 11]:
        anzahl = 30
    elif schaltjahr(jahr):
        anzahl = 29
    else:
        anzahl = 28
    return anzahl

def naechstesDatum(datum):
    (tag, monat, jahr) = datum
    if tag < anzahlTageImMonat(monat, jahr):
        tag = tag + 1
    elif monat < 12:
        tag = 1
        monat = monat + 1
    else:
        tag = 1
        monat = 1
        jahr = jahr + 1
    return (tag, monat, jahr)

def anzahlTageZwischenDatum(datum1, datum2):
    anzahl = 0
    datum = datum1
    while datum != datum2:
        datum = naechstesDatum(datum)
        anzahl = anzahl + 1
    return anzahl

def datumTageNachDatum(datum1, anzahlTage):
    anzahl = 0
    datum = datum1
    while anzahl < anzahlTage:
        datum = naechstesDatum(datum)
        anzahl = anzahl + 1
    return datum

# Initialisierung
datumGeburt = (21, 1, 1992)
datumHeute = (5, 7, 2009)
# Verarbeitung
anzahlTage = anzahlTageZwischenDatum(datumGeburt, datumHeute)
halbeAnzahlTage = anzahlTage // 2
datumHalbzeit = datumTageNachDatum(datumGeburt, halbeAnzahlTage)
# Ausgabe
print("Geburtsdatum:", datumGeburt)
print("aktuelles Datum:", datumHeute)
print("halb-so-alt-Datum:", datumHalbzeit)

Aufgabe 5

(a) Teste zuerst dieses Programm. Kannst du den Verarbeitungsteil erklären?

(b) Vergleiche die beiden Programme zur Bestimmung des halb-so-alt-Datums. Welches Programm ist wohl besser? Begründe deine Meinung.

Aufgabe 6

Wann wirst du genau doppelt so alt sein wie heute? Versuche, eines der beiden Programme zur Bestimmung dieses Datums geeignet abzuändern.

X

Fehler melden

X

Suche