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()
oderprint()
)
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 Wert42
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
... #
... #
... #
# oder auch so
... #
# Testausgabe
jahr, monat, tag
(Ellipsis, Ellipsis, Ellipsis)
# Kontext
jahr, monat, tag = ..., ..., ...
g = "1910-06-22"
# jahr, monat, tag mit List-Comprehension
... #
# Testausgabe
jahr, monat, tag
(Ellipsis, Ellipsis, Ellipsis)
# Kontext
jahr, monat, tag = ..., ..., ...
g = "1910-06-22"
d = {}
# oder das dict ganz fancy mit zip():
schlüssel = ["jahr", "monat", "tag"]
... #
jahr, monat, tag = d.values()
# Testausgabe
jahr, monat, tag
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[7], line 10
7 schlüssel = ["jahr", "monat", "tag"]
8 ... #
---> 10 jahr, monat, tag = d.values()
12 # Testausgabe
13 jahr, monat, tag
ValueError: not enough values to unpack (expected 3, got 0)
# 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}
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In[8], line 2
1 # Diese Tests sollen jedenfalls am Ende erfüllt sein
----> 2 assert jahr == 1910
3 assert monat == 6
4 assert tag == 22
AssertionError:
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 ):
... #
datum_dict = {}
# dict zu Fuß erstellen
... #
... #
... #
# oder mit zip()
jmt_keys = [ "jahr", "monat", "tag" ]
... #
#print( datum_dict )
return datum_dict
ergebnis = { k: datum_2_dict(v) for k, v in gd.items() }
ergebnis
{'Zuse': {}, 'Turing': {}}
assert ergebnis == { "Zuse": {"jahr": 1910, "monat": 6, "tag": 22}, "Turing": {"jahr": 1912, "monat": 6, "tag": 23} }
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In[10], line 1
----> 1 assert ergebnis == { "Zuse": {"jahr": 1910, "monat": 6, "tag": 22}, "Turing": {"jahr": 1912, "monat": 6, "tag": 23} }
AssertionError:
Aufgabe: Aufgabe 42#
(Platzhalter)
gegeben:
…
gesucht:
…
# Kontext
ergebnis = ...
# hier schlau programmieren
... #
# Testausgabe Ihrer Lösung (ggf. auch `print()` ausprobieren)
# print(ergebnis)
ergebnis
Ellipsis
# Diese Tests sollen erfüllt sein
ergebnis == 42
False