Typische Klausuraufgaben#

Über diese Aufgaben: Die Aufgaben vermitteln einen Eindruck, wie typische praktische kleine Problemstellungen aussehen, die man am Ende von Python 101 in der Klausur lösen können sollte.

Diese Seite liegt in zwei Versionen vor (die man nur im Detail unterscheiden kann – genaues Hinschauen erforderlich):

Aufgaben:

Loesung:

Die Aufgaben sind so gestellt, dass sie sich auf Skript-Ebene zunächst mit minimalem technischen Aufwand lösen lassen. Gleichzeitig sind sie offen genug, auch fortgeschrittenere – insbesondere generischere – Lösungsmöglichkeiten zuzulassen. Damit lassenn sie sich auch in Programmier-Praktika einsetzen, bei denen Studierende mit sehr heterogenen Vorkenntnissen teilnehmen: Es gibt kein abschließendes “fertig”, fast immer kann man es auch noch etwas eleganter oder schöner machen.

Aufgaben-Schema#

(Diese Aufgabe ist eine Musteraufgabe, ein Stub, um die Umgebung der Aufgabenlösung in einem Jupyterbook kennenzulernen.)

Aufgaben in der Klausur Python-101 sind typischerweise strukturiert wie hier:

Als Markdown-Zelle:

  • gegeben: da kommt man her, Kontext

  • gesucht: da will man hin

    • Ziel ist eine selbst programmierte Lösung, die das Ergebnis z.B. in einer Variablen wie ergebnis ablegt.

Code-Zellen:

  • eine Zelle, die einen Kontext schafft

    • so dass man sofort schlau losprogrammieren kann

    • und die die Testausgabe auch gleicht sieht (display() oder print())

  • eine Zelle, die die eigene Ausgabe mit einem oder mehreren Soll-Werten vergleicht

BEISPIEL:

gegeben:

  • hier gar nichts besonderes

gesucht:

  • eine Operation, die der Variablen ergebnis den Wert 42 zuweist.

# Kontext
ergebnis = ... # irgend eine falsche Lösung

# hier schlau programmieren
ergebnis = 42

# Testausgabe Ihrer Lösung
ergebnis # display(ergebnis) oder print(ergebnis)
42
# Diese Tests sollen erfüllt sein
assert ergebnis == 42

Aufgabe: Datum als String ausgeben#

(echte Aufgabe, hier mit Lösung)

gegeben:

  • ein Geburtsdatum (z.B. von Alan Turing, 23. Juni 1912) als Dict

    • z.B. d = {"jahr": 1912, "monat": 6, "tag": 23}

gesucht:

  • dieses Datum als String im Format JJJJ-MM-TT

    • z.B. d_string == "1912-06-23"

Lösung bitte mit f-strings, es hilft dann die Format-Info :02, siehe z.B. https://fstring.help/cheat/.

# Kontext
d = {"jahr": 1912, "monat": 6, "tag": 23}
d_string = ...

# hier schlau programmieren
d_string = f"""{d["jahr"]:4}-{d["monat"]:02}-{d["tag"]:02}"""

# Testausgabe Ihrer Lösung (ggf. auch `print()` ausprobieren)
# print(ergebnis)
d_string
'1912-06-23'
assert d_string == '1912-06-23'

Aufgabe: Datum analysieren#

(echte Aufgabe, verschiedene Lösungsansätze)

Datum analysieren Teil 1: Ein einzelner Datensatz#

gegeben:

  • ein Geburtsdatum im Format jjjj-mm-tt

    • z.B. g = "1910-06-22" (ein Computer-Pionier: Wer wars?)

gesucht:

  • die entsprechenden Werte dieses Geburtsdatum in den Variablen jahr, monat, tag

Diese Aufgabe ist “zu Fuß” auch für Programmieranfänger lösbar, eine eher einfache Klausuraufgabe. Wer will, kann auch fancy Lösungen suchen. Ggf. die Beispiellösung anschauen und verstehen.

Hinweis: Wir üben hier an einem trivialen Beispiel grundlegende Operationen. “In echt” würde man natürlich eine Bibliothek wie z.B. https://docs.python.org/3/library/datetime.html verwenden.

# Kontext
jahr, monat, tag = ..., ..., ...
g = "1910-06-22" 

# jahr, monat, tag zu Fuß extrahieren, mit slicing
jahr = int( g[:4] ) #...
monat = int( g[5:7] ) #...
tag = int( g[8:] ) #...

# oder auch so
jahr, monat, tag = g[0:4], g[5:7], g[8:] #...

# Testausgabe
jahr, monat, tag
('1910', '06', '22')
# Kontext
jahr, monat, tag = ..., ..., ...
g = "1910-06-22" 

# jahr, monat, tag mit List-Comprehension
jahr, monat, tag = [ int(x) for x in g.split("-") ] #...
# Testausgabe
jahr, monat, tag
(1910, 6, 22)
# Kontext
jahr, monat, tag = ..., ..., ...
g = "1910-06-22" 
d = {}

# oder das dict ganz fancy mit zip():
schlüssel = ["jahr", "monat", "tag"]
d = dict( zip( schlüssel, [ int(x) for x in g.split("-") ] )) #...

jahr, monat, tag = d.values()

# Testausgabe
jahr, monat, tag
(1910, 6, 22)
# Diese Tests sollen jedenfalls am Ende erfüllt sein
assert jahr == 1910
assert monat == 6
assert tag == 22
# assert d == {"jahr": 1910, "monat": 6, "tag": 22}

Datum analysieren Teil 2: Verallgemeinerung auf mehrere Datensätze#

gegeben:

  • Ein Dict von Datumsangaben

gesucht:

  • obige Lösung für das komplette Dict

Vorgehen, Empfehlung:

  • für die Analyse eines einzelnen Records eine Funktion definieren

  • und diese dann auf den gesamten Datensatz anwenden

# gd ... Geburtstags-Dictionary
gd = { "Zuse": "1910-06-22", "Turing": "1912-06-23" }
ergebnis = ...

#hier Ihre Lösung
def datum_2_dict( datumstring ):
    jmt_liste = [ int(x) for x in datumstring.split("-") ] #...
    datum_dict = {}

    # dict zu Fuß erstellen
    datum_dict["jahr"]  = jmt_liste[0] #...
    datum_dict["monat"] = jmt_liste[1] #...
    datum_dict["tag"]   = jmt_liste[2] #...
    
    # oder mit zip()
    jmt_keys = [ "jahr", "monat", "tag" ] 
    datum_dict = dict( zip( jmt_keys, jmt_liste ) )  #...

    #print( datum_dict )
    return datum_dict

ergebnis = { k: datum_2_dict(v) for k, v in gd.items() }
ergebnis
{'Zuse': {'jahr': 1910, 'monat': 6, 'tag': 22},
 'Turing': {'jahr': 1912, 'monat': 6, 'tag': 23}}
assert ergebnis == { "Zuse": {"jahr": 1910, "monat": 6, "tag": 22}, "Turing": {"jahr": 1912, "monat": 6, "tag": 23} }

Aufgabe: Aufgabe 42#

(Platzhalter)

gegeben:

gesucht:

# Kontext
ergebnis = ...

# hier schlau programmieren
ergebnis = 42 #...

# Testausgabe Ihrer Lösung (ggf. auch `print()` ausprobieren)
# print(ergebnis)
ergebnis
42
# Diese Tests sollen erfüllt sein
ergebnis == 42
True