Programmiertechnik/Programmierlogik

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche
Unter Programmierlogik versteht man die Prozesse und Strukturen, um Computer-Programme planen und entwerfen zu können. In diesem Artikel soll anhand von Beispielen aus der „realen Welt“ aufgezeigt werden, wie man Abläufe strukturiert und in Module gliedert, die dann in einer Programmiersprache umgesetzt werden können.

Vorüberlegungen

Was ist eigentlich ein Programm? Und wo findet man überall Programme? Woraus bestehen Programme? Die Antworten auf diese Fragen sind eigentlich sehr einfach, denn ein Computerprogramm besteht ebenso wie ein Wasch- oder Festtagsprogramm aus einer Liste von Aktionen, die von Menschen oder Computern befolgt werden. Das Wort selbst stammt aus dem Griechischen und steht für Vorschrift.

Das Besondere an Computerprogrammen ist jedoch ihre Komplexität. Die Liste mit Aktionen ist tendenziell sehr lang und sie wird nicht nur von oben bis unten abgearbeitet, sondern oft werden bestimmte Aktionen mehrmals oder in anderen Anordnungen ausgeführt. Obwohl Computer oft nur als „größere Taschenrechner“ bezeichnet werden, ist erst mit ihnen die Verarbeitung und Auswertung großer Mengen von Daten in kürzester Zeit möglich geworden.

Top-Down vs. Bottom-Up

Bei der Programmierung[1] gibt es zwei Ansätze: Top-down (engl. von oben nach unten) und Bottom-up (engl. von unten nach oben)[2]. Ein besonderes Datum wie ein Festtagsprogramm zum 80. Geburtstag der Oma oder den ersten Besuch der zukünftigen Freundin in der eigenen Wohnung wird man entsprechend genau planen. Neben dem Vorbereiten der Dekoration wird die Zubereitung der Speisen genau geplant und durchgeführt, damit der Abend zu einem Erfolg wird.

Dagegen steht der eher pragmatische Ansatz, spontan den Kühlschrank zu durchsuchen, um dann aus dem Vorhandenen etwas Schmackhaftes zu kochen.

Der Nutzen einer Top-down-Entwicklung liegt in der besseren Planung. Während Sie Syntaxfehler wie Satzbaufehler und Falschschreibungen durch Debuggen mit einem Entwicklerwerkzeug finden können, werden Laufzeitfehler oft erst später sichtbar. Dies sind semantische Fehler, zum Beispiel die Verarbeitung falscher Werte oder Logikfehler wie die Programmierung von rekursiven Funktionen oder Endlosschleifen, bei denen es keine Bedingung für den Schleifenabbruch gibt.

Vom Rezept zum Algorithmus

Aber wo wir gerade beim Essen sind – so ist eigentlich jedes Kochrezept ein Programm. Was oft wie eine nebenbei zu erledigende Tätigkeit wirkt, wird zu einer mittelschweren Katastrophe, wenn man es zum ersten Mal selbst probiert. Deshalb wird in einem Kochrezept jedes Gericht in seine Einzelschritte zerlegt und beschrieben, bis jeder es nachkochen kann.

Diese Aneinanderreihung von Einzelschritten hin zu einer Problemlösung wird in der Informatik Algorithmus genannt.[3] Dieser Algorithmus kann in Pseudocode oder in einem Diagramm oder Struktogramm dargestellt werden.

Anweisungen

Beispiel eines Struktogramms nach Nassi-Shneiderman für mehrere Anweisungen
Anweisungen

Jedes Kochrezept besteht aus einer Reihe von Befehlen oder Vorschriften. So sollen für einen Eintopf Kartoffeln geschält und geschnitten werden.

Anweisungen (engl. statement) sind Befehle oder Vorschriften, die im Rahmen der Abarbeitung des Programms auszuführen ist.

bedingte Anweisungen

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine bedingte Anweisung
bedingte Anweisung (Verzweigung)

Allerdings bleiben Kartoffelstücke trotz Einhaltung der Kochzeit zu hart, wenn sie zu groß sind. Nachdem die Kartoffeln geschnitten wurden, wird deshalb überprüft, ob die Kartoffeln größer als 3 cm sind. Falls die Bedingung zutrifft, werden sie gedreht und erneut geschnitten.

 WENN Kartoffel > 3cm
 DANN drehen
      schneiden
 SONST nix

In einer bedingten Anweisung oder Verzweigung wird eine Bedingung überprüft (auch: Fallunterscheidung). Trifft sie zu, werden eine (oder mehrere) Anweisung(en) ausgeführt. Trifft sie nicht zu, wird entweder nichts unternommen oder es werden andere Anweisungen ausgeführt.

Schleifen

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine while-Schleife
kopfgesteuerte Schleife

Eine solche Überprüfung, ob das Schnittgut bereits klein genug ist, wird aber nicht nur einmal durchgeführt, sondern in einer Schleife solange wiederholt, bis die Kartoffeln auch wirklich klein genug sind.

 SOLANGE Kartoffel > 3cm
  drehen
  schneiden

Eine kopfgesteuerte Schleife fragt eine Bedingung ab, bevor der Schleifenrumpf ausgeführt wird, also am Kopf des Konstruktes. Solange diese Bedingung wahr ist, werden die Anweisungen innerhalb der Schleife ausgeführt.

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine while-Schleife
fußgesteuerte Schleife

Logischer wäre es hier aber, erst nach dem ersten Schnittvorgang Schneideergebnis und gewünschte Größe zu vergleichen.

WIEDERHOLE
  drehen
  schneiden
 SOLANGE Kartoffel > 3cm

Eine fußgesteuerte Schleife fragt eine Bedingung ab, nachdem der Schleifenrumpf ausgeführt wurde, also am Fuß des Konstruktes. Solange die Bedingung wahr ist, wird ein weiterer Schleifendurchlauf vorgenommen. Sobald die Abbruchbedingung erfüllt ist, wird die Schleife abgebrochen.

Beim Programmieren verwendet man meist zählergesteuerte Schleifen mit einer festen Anzahl von Durchläufen. In der Küche würden Profis aber nicht fest an einer Kochzeit von 20min festhalten, sondern immer wieder überprüfen, ob es schon fertig ist.

Funktionen

Die Autoren von Kochrezepten erwähnen die oben genannten Einzelschritte nicht, da man sie auch woanders nachschauen und lernen kann. Wenn ein Rezept jedes Mal beschreiben müsste, wie man Kartoffeln schält, wären die Rezepte sehr viel länger, und die meisten Köche wären nicht erfreut über die ganzen Informationen, die sie ohnehin im Schlaf runterbeten könnten.

Was hat das mit Programmieren zu tun? Nun, beim Programmieren hat man auch oft das Problem, dass gewisse Aktionen immer wieder durchgeführt werden müssen. Für dieses Problem gibt es mehrere Lösungen, die hier vorgestellt werden sollen.

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine Funktion
Funktion (Unterprogramm)

Eine Lösung ist die Verwendung von Prozeduren oder Funktionen, die mehrere Anweisungen und Kontrollstrukturen zu einem Unterprogramm zusammenfassen.

 Funktion zuschneiden 
  schälen
  schneiden
  WENN Kartoffel > 3cm
  DANN schneiden

Eine Funktion ist eine Art Unterprogramm, das dann mehrfach verwendet (aufgerufen) werden kann. Sie besteht aus einer Liste mit Aktionen, gegebenenfalls Parametern und einem Rückgabewert, und sollte idealerweise wirklich nur eine einzige Aufgabe beschreiben.

Variablen

Beispiel eines Struktogramms nach Nassi-Shneiderman für eine Funktion mit Übergabewerten
Funktion mit Übergabewerten

Wer das Prinzip des Schälens und Schneidens verstanden hat, kann dies auf alle Zutaten anwenden. Durch die Verwendung von Variablen für unser Schnittgut und die Größe können wir nun unsere Funktion mehrfach aufrufen:

 Funktion zuschneiden (Objekt, Größe)
  schälen
  schneiden
  WENN Objekt > Größe
  DANN schneiden

 zuschneiden (Kartoffel, 3cm)
 zuschneiden (Karotte, 3cm)
 zuschneiden (Fleisch, 1cm)

Eine Variable ist ein Behältnis für eine Menge von verschiedenen Werten. Dies können Zahlen wie die Anzahl von Kartoffeln, boolesche Wahrheitswerte (true/false) für den Fall, ob der Herd an- oder ausgeschaltet ist oder auch beliebige Zeichenketten sein.

OOP

Im Unterschied zur prozeduralen Programmierung wie oben können Sie das Stück Fleisch für unsere Suppe als Objekt mit festen Eigenschaften wie Art, Größe, Frische etc. ansehen. Die Eigenschaften können durch Methoden wie Säubern, Einlegen, Schneiden und Zubereiten verändert werden.

Gerade bei großen Projekten ist die objektorientierte Programmierung ein geeignetes Mittel, um einzelne Programmteile sauber zu verarbeiten.

Diagramme

Die oben erfolgte Umsetzung eines Kochrezepts in einen Algorithmus kann auf verschiedene Weisen dokumentiert werden. Häufig werden Algorithmen als Folge von Operationen zur Lösung einer Aufgabe in einem Diagramm grafisch dargestellt. Dabei gibt es verschiedene Varianten, die heute aber meist nur noch zu Schulungszwecken eingesetzt werden.

Programmablaufplan

Programmablaufplan des RoboPro von Fischertechnik
Programmablaufplan des RoboPro von Fischertechnik

Ein Programmablaufplan ist ein Ablaufdiagramm für ein Computerprogramm, das auch als Flussdiagramm (engl. flowchart) oder Programmstrukturplan bezeichnet wird.[4]

Sie können Programmablaufpläne auch mit Bürosoftware wie MS Word und seinen Vorlagen erstellen.[5]

Grafische Entwicklungsumgebungen wie Scratch[6][7], ROBO Pro von Fischertechnik[8] oder Lego RCX-Code[9] verwenden Programmablaufpläne, um Programme durch Klicken auf Symbole für Programmierbefehls-Bausteine zu entwerfen – der dazu nötige Programmcode wird von der IDE erstellt.

Struktogramm

Kartoffelkochen in Nassi-Shneidermann-Darstellung
Kartoffelkochen in Nassi-Shneidermann-Darstellung

Ein Nassi-Shneiderman-Diagramm ist ein Diagrammtyp zur Darstellung von Programmentwürfen im Rahmen der Methode der strukturierten Programmierung.[10] Da Nassi-Shneiderman-Diagramme Programmstrukturen darstellen, werden sie auch als Struktogramme bezeichnet.

Im Bereich der Softwareerstellung werden sie jedoch nur noch selten verwendet, da der Programmcode moderner Programmiersprachen einen ähnlichen Abstraktionsgrad bietet, jedoch einfacher zu erstellen und zu verändern ist.

Aktivitätsdiagramm

Kartoffelkochen als UML-Aktivitätsdiagramm
Kartoffelkochen als UML-Aktivitätsdiagramm

Heute verwendet man für die Darstellung Objekt-orientierter Programmierung erweiterte Aktivitätsdiagramme nach UML.

Aktivitätsdiagramme beschreiben den Ablauf eines (Teil-)Programms und führen von einem Start- zu einem Endknoten. Das Programmverhalten wird insbesondere mittels Aktionen beschrieben, welche durch Kontrollflüsse (dargestellt als Pfeil) miteinander verbunden werden. Weitere häufig verwendete Elemente sind Verzweigungs- und Verbindungsknoten, mit deren Hilfe parallele Aktivitäten dargestellt werden können. Ebenfalls sehr häufig finden Entscheidungsknoten Verwendung, welche eine Wenn-Dann-Entscheidung repräsentieren.

Beachten Sie: Es gibt zwei verschiedene Versionen von UML-Aktivitätsdiagrammen: Version 1 und Version 2. Die Begrifflichkeiten wurden in Version 2 angepasst und die Diagramme selbst überarbeitet; Version 1 orientiert sich stärker an Programmablaufplänen, während Version 2 eher Petri-Netzen ähnelt.

Quellen

  1. Wikipedia: Programmierung
  2. Wikipedia: Top-Down- und Bottom-Up-Design
  3. Wikipedia: Algorithmus
  4. Wikipedia: Programmablaufplan
  5. Officecoach24: Mit Microsoft Word ein Flussdiagramm erstellen - wie gehts?
  6. Wikipedia: Scratch (Programmiersprache)
  7. Scratch: das deutschsprachige Scratch-Wiki
  8. Fischertechnik: ROBO Pro Software
  9. Wikipedia: Lego Mindstorms
  10. Wikipedia: Nassi-Shneiderman-Diagramm

Weblinks