Kontrollstruktur
Kontrollstrukturen (Steuerkonstrukte) sind Anweisungen in imperativen Programmiersprachen. Sie werden verwendet, um den Ablauf eines Computerprogramms zu steuern. Eine Kontrollstruktur ist entweder eine Verzweigung oder eine Schleife. Meist wird ihre Ausführung über logische Ausdrücke der booleschen Algebra beeinflusst. Kontrollstrukturen können über spezielle Diagramme visualisiert werden (z. B. Nassi-Shneiderman-Diagramme).
Inhaltsverzeichnis
Geschichte
In den frühen 1960er Jahren waren Flussdiagramme und Sprunganweisungen in Programmen üblich, was größere Programme nahezu unwartbar machte, da sie schnell unüberschaubar wurden. 1968 sprach sich Edsger W. Dijkstra in seinem Aufsatz Go To Statement Considered Harmful (der Titel geht allerdings auf Niklaus Wirth zurück), für eine Abschaffung des GOTO-Befehls in allen höheren Programmiersprachen aus.<ref>Edsger W. Dijkstra: Letters to the editor: Go To Statement Considered Harmful. In: Communications of the ACM. 11, Nr. 3, März 1968, S. 147–148, doi:10.1145/362929.362947.</ref>
Im Mai 1966 publizierten Böhm und Jacopini in der Zeitschrift Communications of the ACM einen Artikel, in dem sie zeigten, dass jedes Programm, das Goto-Anweisungen enthält, in ein Goto-freies Programm umgeschrieben werden kann, das nur mit Verzweigung (IF THEN ELSE) und einer Schleife (WHILE Bedingung DO Anweisung) arbeitet, gegebenenfalls unter Zuhilfenahme von etwas Code-Doppelung und der Einführung von booleschen Variablen (true/false).
Anfang der 1970er Jahre wurde damit begonnen, diesen Ansatz zur Selbstbeschränkung auf wenige, typische Elemente umzusetzen. Wegweisend war die Arbeit von Niklaus Wirth mit seiner Programmiersprache Pascal.
Konzept anhand eines Beispiels
Ohne Kontrollstrukturen müssen Wiederholungen und Bedingungen durch Sprünge (GOTO, IF … GOTO – englisch: springen zu, Wenn … springen zu) realisiert werden. Die Ausgabe der Zahlen von 1 bis 100, jedoch ohne den Bereich 40 bis 60, wird ohne Kontrollstruktur etwa so realisiert (Pseudocode, in Anlehnung an BASIC)
<syntaxhighlight lang="QBASIC" style="border: dashed 1px #2F6FAB; padding: 1em">
I := 1 M1: PRINT I -- Ausgabe von I IF I=39 THEN GOTO M2 -- Wenn ... springen (bedingte Ausführung) I := I+1 IF I<=100 THEN GOTO M1 -- Wenn ... springen (wiederholte Ausführung) END -- Programmende M2: I := 61 GOTO M1 -- Sprung nach M1
</syntaxhighlight>
- Unstrukturiertes Programm: Ausgabe der Zahlen 1, 2, ..., 39, 61, 62, 63, ..., 99, 100
Die Verwendung von Kontrollstrukturen ist auch Bestandteil der strukturierten Programmierung. Jede Kontrollstruktur besteht wenigstens aus einem Anfangs- und meistens einem Endeschlüsselwort. Sprachen wie Pascal, C, Modula-2 (und auch neuere Varianten der Sprache BASIC) verfügen über Kontrollstrukturen für Wiederholungen
<syntaxhighlight lang="pascal">
REPEAT Anweisungen UNTIL Bedingung
</syntaxhighlight>
und bedingte Ausführung von Anweisungen:
<syntaxhighlight lang="QBASIC">
IF Bedingung THEN Anweisungen ELSE Anweisungen ENDIF
</syntaxhighlight>
Die Schlüsselwörter rahmen dabei die Anweisungen ein, die mehrfach oder bedingt ausgeführt werden. Die obenstehende Programmieraufgabe kann dann folgendermaßen realisiert werden:
<syntaxhighlight lang="QBASIC" style="border: dashed 1px #2F6FAB; padding: 1em">
I := 1 REPEAT -- Wiederhole PRINT I IF I=39 THEN -- Wenn ... Dann I := 61 ELSE -- Sonst I := I+1 ENDIF -- EndeWenn UNTIL I>100 -- bis END -- Programmende
</syntaxhighlight>
- Strukturiertes Programm: Ausgabe der Zahlen 1, 2, ..., 39, 61, 62, 63, ..., 99, 100
Das Programm erhält eine Struktur, welche meist noch durch Einrückungen verdeutlicht wird. Die neuen Schlüsselwörter und die Formatierung erleichtern das Verständnis des Programmcodes.
Vermeidung von Goto
Kontrollstrukturen helfen Sprünge mit Goto zu vermeiden, da fast jede Programmieraufgabe mit Hilfe von Bedingungs- und Wiederholungsstrukturen gelöst werden kann. Programmierung ohne Goto unter Verwendung einer modernen Sprache ist heute der Normalfall. Die Programmiersprache Java unterstützt z. B. keine Goto-Anweisung mehr.
Dabei wird auf einige der Freiheiten verzichtet. Im obenstehenden Beispiel wird bei I=39
in der strukturierten Variante trotzdem noch I>100
abgefragt, obwohl dies eigentlich nicht notwendig ist. Ein optimierender Compiler könnte dies zwar korrigieren, ist aber wohl nicht in allen Fällen in der Lage, solche Feinheiten zu erkennen.
Die Verwendung von Kontrollstrukturen verhindert das Entstehen von Quelltext, bei dem auf unübersichtliche Weise hin- und hergesprungen wird. Die folgenden Merkmale kennzeichnen ein Programm bei Verwendung von Kontrollstrukturen:
- Anweisungen, die wiederholt werden, sind durch Schlüsselwörter klar gekennzeichnet
- Bedingungen und Wiederholungen sind sofort erkennbar
- Vermeidung von Goto und Sprungmarken
Flussdiagramme und Struktogramme
Flussdiagramme dienen der grafischen Wiedergabe des Programmflusses. Sie besitzen dieselben Freiheiten, die Goto im Programmcode bietet. 1972 hatten I. Nassi und B. Shneiderman die Idee, Flussdiagramme durch Struktogramme zu ersetzen, bei denen Kontrollstrukturen durch grafische Elemente dargestellt werden, den Nassi-Shneiderman-Diagrammen. Struktogramme lassen sich dann in einen strukturierten Programmcode umsetzen.
Der unstrukturierte Code zur Ausgabe der Zahlen 1 bis 39 und 61 bis 100 lässt sich durch ein Flussdiagramm wiedergeben:
- Flussdiagramm
- Flussdiagramm des unstrukturierten Programms
- Ausgabe der Zahlen 1,2,...,39,61,62,...,100
Auch der strukturierte Code ließe sich durch ein ähnliches Diagramm darstellen, zusätzlich jedoch durch ein Struktogramm
- Struktogramm
- Struktogramm des strukturierten Programms
- Ausgabe der Zahlen 1,2,...,39,61,62,...,100
Einzelnachweise
<references />