Dicke Bücher in der Schulbibliothek
AFB I–IIDie Bibliotheks-AG möchte alle Titel mit mehr als 300 Seiten finden, um sie in ein eigenes Regal zu stellen. In der Liste buecher stehen (in dieser Reihenfolge): „Momo“ (304 Seiten), „Tschick“ (256 Seiten), „Die Welle“ (192 Seiten) und „Krabat“ (368 Seiten). Drei Mitglieder lösen die Aufgabe auf verschiedene Weise:
dicke = [] for buch in buecher: if buch["seiten"] > 300: dicke.append(buch["titel"])
SELECT titel FROM buecher WHERE seiten > 300;
def ist_dick(buch): return buch["seiten"] > 300 def titel_von(buch): return buch["titel"] dicke = list(map(titel_von, filter(ist_dick, buecher)))
- Ordne jedem Listing ein Programmierparadigma zu.
- Beschreibe den Ablauf von Listing A für die vier Bücher. Gib dabei an, welchen Inhalt
dickenach jedem Schleifendurchlauf hat. - Begründe, warum Listing B als deklarativ gilt, obwohl es dasselbe Ergebnis liefert wie Listing A.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
A: imperativ (Schleife, Liste dicke wird Schritt für Schritt verändert). B: deklarativ (SQL beschreibt nur das gewünschte Ergebnis). C: funktional (filter und map kombinieren Funktionen ohne Seiteneffekte).
Erwartungshorizont zu Aufgabe b)
Zu Beginn ist dicke leer. 1. Durchlauf: Momo, 304 > 300 ist wahr → ["Momo"]. 2.: Tschick, 256 → Bedingung falsch, unverändert. 3.: Die Welle, 192 → unverändert. 4.: Krabat, 368 → ["Momo", "Krabat"]. Am Ende enthält dicke die beiden Titel.
Erwartungshorizont zu Aufgabe c)
Listing B enthält weder Schleife noch Hilfsvariable noch Reihenfolge von Arbeitsschritten. Es beschreibt nur, was gesucht ist: die Spalte titel aller Zeilen mit mehr als 300 Seiten. Wie die Datenbank sucht (z. B. in welcher Reihenfolge sie die Zeilen durchgeht), entscheidet sie selbst. Das Ergebnis ist dasselbe, der Denkstil ein anderer.
Ein Quiz für den Tag der offenen Tür
AFB II–IIIFür den Tag der offenen Tür programmiert die Klasse 9a ein Informatik-Quiz. Für jede richtige Antwort gibt es 10 Punkte, für jede falsche werden 5 abgezogen. Deniz hat die Spieler objektorientiert umgesetzt:
class Spieler: def __init__(self, name): self.name = name self.punkte = 0 def antworten(self, richtig): if richtig: self.punkte = self.punkte + 10 else: self.punkte = self.punkte - 5 mia = Spieler("Mia") tom = Spieler("Tom") mia.antworten(True) tom.antworten(False) mia.antworten(True) tom.antworten(True) print(mia.name, mia.punkte, tom.name, tom.punkte)
Seine Mitschülerin Paula findet: „Objektorientierung ist immer das beste Paradigma — man sollte jedes Programm so schreiben.“
- Ermittle die Ausgabe des Programms.
- Implementiere eine Methode
bonus(self, n), die die Punkte eines Spielers umnerhöht, und gib an, wie Tom am Ende 15 Bonuspunkte erhält. - Vergleiche die objektorientierte Lösung mit einer prozeduralen Lösung, die für jede Person eigene Variablen wie
mia_punkteundtom_punkteund eine Funktionantworten(punkte, richtig)mit Rückgabewert nutzt. - Diskutiere Paulas Aussage.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
antworten: Die Methode verändert das Attribut self.punkte.Hinweis zu Aufgabe c)
Hinweis zu Aufgabe d)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
mia: 0 → 10 → 20. tom: 0 → −5 → 5. Ausgabe: Mia 20 Tom 5. Jedes Objekt hat eigene Attributwerte, obwohl beide aus derselben Klasse stammen.
Erwartungshorizont zu Aufgabe b)
def bonus(self, n): und eingerückt darunter self.punkte = self.punkte + n — innerhalb der Klasse Spieler. Aufruf: tom.bonus(15). Danach hat Tom 5 + 15 = 20 Punkte.
Erwartungshorizont zu Aufgabe c)
Gemeinsam: gleiche Rechenregel (+10/−5), gleiches Ergebnis. Prozedural: Daten (Variablen) und Funktion sind getrennt; für jede Person braucht man neue Variablen und muss den Rückgabewert selbst zuweisen, z. B. mia_punkte = antworten(mia_punkte, True). Objektorientiert: Name und Punkte sind mit der Methode im Objekt gebündelt; für weitere Personen genügt Spieler("…"), Verwechslungen von Variablen sind seltener. Dafür ist die Klasse am Anfang mehr Schreibarbeit.
Erwartungshorizont zu Aufgabe d)
Pro: Bei Programmen mit vielen gleichartigen Dingen (Spieler, Spielfiguren) ordnet Objektorientierung Daten und Verhalten übersichtlich. Contra: Für eine Datenbankabfrage ist SQL (deklarativ) viel kürzer, eine Webseite beschreibt man mit HTML, eine kurze Berechnung ist imperativ oder funktional schneller geschrieben; Funktionen ohne Seiteneffekte sind leichter zu testen. Begründetes Fazit, z. B.: Es gibt kein bestes Paradigma — Multiparadigmen-Sprachen wie Python erlauben, je nach Teilproblem den passenden Stil zu wählen.
