MINT lernen

Programmierparadigmen

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu imperativem, deklarativem, funktionalem und objektorientiertem Programmieren.

Dein Fortschritt:
0 / 0 Aufgaben
1

Dicke Bücher in der Schulbibliothek

AFB I–II

Die 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:

Listing A · Python
dicke = []
for buch in buecher:
    if buch["seiten"] > 300:
        dicke.append(buch["titel"])
Listing B · SQL
SELECT titel
FROM buecher
WHERE seiten > 300;
Listing C · Python
def ist_dick(buch):
    return buch["seiten"] > 300

def titel_von(buch):
    return buch["titel"]

dicke = list(map(titel_von, filter(ist_dick, buecher)))
  1. Ordne jedem Listing ein Programmierparadigma zu.
  2. Beschreibe den Ablauf von Listing A für die vier Bücher. Gib dabei an, welchen Inhalt dicke nach jedem Schleifendurchlauf hat.
  3. Begründe, warum Listing B als deklarativ gilt, obwohl es dasselbe Ergebnis liefert wie Listing A.

Hinweise

Hinweis zu Aufgabe a)
Achte darauf, ob Variablen Schritt für Schritt verändert werden, ob nur das Ergebnis beschrieben wird oder ob Funktionen kombiniert werden.
Hinweis zu Aufgabe b)
Gehe die Bücher in der gegebenen Reihenfolge durch und prüfe jeweils die Bedingung.
Hinweis zu Aufgabe c)
Was steht in Listing A, das in Listing B fehlt?

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.

2

Ein Quiz für den Tag der offenen Tür

AFB II–III

Fü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:

Python · quiz.py
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.“

Eine Klasse, zwei Objekte
Klasse (Bauplan)Spielernamepunkteantworten(richtig)Objekte (Exemplare)mianame = "Mia"punkte = 0tomname = "Tom"punkte = 0erzeugt
Zustand direkt nach dem Erzeugen der beiden Objekte — vor dem ersten Aufruf von antworten.
  1. Ermittle die Ausgabe des Programms.
  2. Implementiere eine Methode bonus(self, n), die die Punkte eines Spielers um n erhöht, und gib an, wie Tom am Ende 15 Bonuspunkte erhält.
  3. Vergleiche die objektorientierte Lösung mit einer prozeduralen Lösung, die für jede Person eigene Variablen wie mia_punkte und tom_punkte und eine Funktion antworten(punkte, richtig) mit Rückgabewert nutzt.
  4. Diskutiere Paulas Aussage.

Hinweise

Hinweis zu Aufgabe a)
Führe für jedes Objekt getrennt Buch über die Punkte. Beide starten laut Abbildung bei 0.
Hinweis zu Aufgabe b)
Orientiere dich am Aufbau von antworten: Die Methode verändert das Attribut self.punkte.
Hinweis zu Aufgabe c)
Überlege, was passiert, wenn statt zwei Personen 25 mitspielen, und wo Daten und passende Funktionen jeweils stehen.
Hinweis zu Aufgabe d)
Denke an Beispiele aus dieser Einheit: Datenbankabfrage, Webseite, kurze Berechnung, Spiel mit vielen Figuren.

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.