i

Denkweise funktionaler und imperativer Programmierparadigmen

In den vorangegangenen Kapiteln hast du dich ausführlich mit funktionaler Programmierung auseinandergesetzt und einige Besonderheiten dieses Programmierparadigmas kennengelernt. In diesem Kapitel wollen wir uns die Unterschiede zwischen funktionaler und imperativer Programmierung noch einmal zusammengefasst anschauen und miteinander vergleichen. Neben Racket als unsere funktionale Programmiersprache kommt Python zur Darstellung der imperativen Konzepte zum Einsatz.

Die Frage nach dem "Was?" nicht nach dem "Wie?"

Die unterschiedliche Denkweise der beiden Programmierparadigmen kann folgendermaßen beschrieben werden:

In der funktionalen Programmierung steht die Frage "Was möchte ich als Ergebnis genau wissen?" im Vordergrund. Der Fokus liegt darauf, das gewünschte Resultat möglichst genau zu beschreiben, ohne sich um die schrittweise Berechnung zu kümmern.

Der Fokus in der imperativen Programmierung liegt auf der Frage "Wie möchte ich das Ergebnis berechnen?". Hier wird der Lösungsweg detailliert und Schritt für Schritt angegeben.

Aufgabe 1: Denkweisen zur Problemlösung

Neue Datei - funktional_imperativ.rkt
Neue Datei - funktional_imperativ.py

Wir möchten eine Notenliste mit den Noten: 9, 14, 4, 6, 7, 13, 8, 4, 11, 3, 9 untersuchen und dafür sowohl das funktionale als auch das imperative Programmierparadigma nutzen.

(a) Zuerst wollen wir herausfinden wie viele Noten in der Liste als bestanden gelten. Betrachte hierzu die folgenden zwei Beschreibungen. Welche Beschreibung beschreibt das "Was", welche das "Wie"?

  1. "Ich möchte die Länge der Notenliste wissen, die nur die bestandenen Noten größer-gleich 5 enthält."
  2. "Für jedes Element der Notenliste bestimme ich, ob dieses größer-gleich 5 ist. Falls ja, zähle ich +1 für die Anzahl an bestandenen Noten."

(b) Ordne die Beschreibungen aus (a) den jeweiligen Programmcodes zu.

;Racket
(define notenliste (list 9 14 4 6 7 13 8 4 11 3 9))

(define anzahl-bestanden
  (lambda (l)
    (length (filter (lambda (note) (>= note 5)) l))))
#Python
notenliste = [9, 14, 4, 6, 7, 13, 8, 4, 11, 3, 9]

def anzahlBestanden(l):
    anzahl = 0
    for note in l:
        if (note >= 5):
            anzahl = anzahl + 1
    return anzahl

(c) Schreibe eine Was? und eine Wie?-Beschreibung für die folgende Fragestellung:
"Anzahl aller Noten, die größer als 10 sind."

(d) Schreibe eine Was? und eine Wie?-Beschreibung für die folgende Fragestellung:
"Jeder Notenpunkt soll um 1 erhöht werden."

Aufgabe 2: Funktionen und Anweisungen

Die Frage nach dem Was? und Wie? stellen die Denkweise der zwei Paradigmen zwar dar, spannend ist für uns jedoch besonders, wie wir diese Denkweisen anschließend in Programmcode umsetzen können.

Im Mittelpunkt der funktionalen Programmierung stehen Funktionen, die aus Übergabedaten Rückgabedaten erzeugen. Jede Funktion beschreibt dabei ein Stück des "Was". Die Verkettung verschiedener Funktionen löst anschließend das Gesamtproblem.

(a) Betrachte den Racket-Code aus Aufgabe 1 (b) und erkläre welche Funktionen welche Teilprobleme der folgenden Lösungsbeschreibung lösen:

  • "Ich möchte die Länge der Notenliste wissen, die nur die bestandenen Noten größer-gleich 5 enthält."

In der imperativen Programmierung nutzen wir Anweisungen, um die einzelnen Schritte zur Lösung durchzuführen. Jeder Schritt stellt auch hier ein Stück des "Wie" dar. Durch die hintereinander Ausführung der einzelnen Schritte wird das Gesamtproblem so gelöst.

(b) Betrachte den Python-Code aus Aufgabe 1 (b) und erkläre welche Anweisungen welche Teilprobleme der folgenden Lösungsbeschreibung lösen:

  • "Für jedes Element der Notenliste bestimme ich, ob dieses größer-gleich 5 ist. Falls ja, zähle ich +1 für die Anzahl an bestandenen Noten."

Suche

v
100.137.6.1.1 Denkweise funktionaler und imperativer Programmierparadigmen
Kopieren durch Anklicken

Rückmeldung geben