Kontrollstruktur
Kontrollstrukturen werden in imperativen Programmiersprachen verwendet, um den Ablauf eines Computerprogramms zu steuern. Die wichtigsten Kontrollstrukturen sind Verzweigungen und Schleifen. Meist wird ihre Ausführung über logische Ausdrücke der booleschen Algebra beeinflusst. Kontrollstrukturen können auch über spezielle Diagramme visualisiert werden (z.B. Nassi-Shneiderman-Diagramme).
In den 1960er Jahren waren Flussdiagramme und Sprunganweisungen in Programmen üblich, was bei größeren Programmen nahezu zu Unwartbarkeit führte, da sie schnell unleserlich wurden. Anfang der 1970er Jahre erfolgte ein Ansatz zur Selbstbeschränkung auf wenige Elemente, nicht zuletzt durch Niklaus Wirth mit seiner Programmiersprache Pascal.
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 (in Anlehnung an die Programmiersprache BASIC)
I:=1 M1: PRINT I -- Ausgabe von I IF I=39 GOTO M2 -- Wenn ... springen (bedingte Ausführung) I:=I+1 IF I<=100 GOTO M1 -- Wenn ... springen (wiederholte Ausführung) END -- Programmende M2: I:=61 GOTO M1 -- Sprung zu M1
- Unstrukturiertes Programm: Ausgabe der Zahlen 1,2,..,39,61,62,63,...,99,100
Bei Verwendung von Kontrollstrukturen spricht man auch von strukturierter Programmierung. Jede Kontrollstruktur besteht mindestens aus einem Anfangs- und meistens einem Endeschlüsselwort. Sprachen wie Pascal, C, Modula-2 (und auch neuere Varianten der Sprache BASIC) besitzen Kontrollstrukuren für Wiederholungen
REPEAT Anweisungen UNTIL Bedingung
und bedingte Ausführung von Anweisungen:
IF Bedingung THEN Anweisungen ELSE Anweisungen ENDIF
Die Schlüsselwörter "klammern" dabei die Anweisungen, die mehrfach oder bedingt ausgeführt werden. Die obenstehende Programmieraufgabe kann dann folgendermaßen realisiert werden:
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
- Strukturiertes Programm: Ausgabe der Zahlen 1,2,..,39,61,62,63,...,99,100
Das Programm erhält eine Struktur. Meist wird diese durch Einrückungen noch verdeutlicht. Die neuen Schlüsselwörter und die Formatierung erleichtern das Verständnis des Programmcodes.
Verzicht auf Goto
Kontrollstrukturen ermöglichen den Verzicht auf Sprünge mit Goto, da jede Programmieraufgabe mit Hilfe von Bedingungs- und Wiederholungsstrukturen gelöst werden kann. Programmierung ohne Goto unter Verwendung einer modernen Sprache gilt heute als guter Stil.
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 sogenanntem Spagetticode, bei dem wild hin- und hergesprungen wird. Die folgenden Merkmale kennzeichnen ein Programm bei Verwendung von Kontrollstrukturen:
- Der Programmfluss ist immer von oben nach unten
- Anweisungen, die wiederholt werden, sind durch Schlüsselwörter klar gekennzeichnet
- Bedingungen und Wiederholungen sind sofort erkennbar
- Kein Goto und keine Marken
Flussdiagramme und Struktogramme
Flussdiagramme dienen zur 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 strukturierten Programmcode umsetzen.
Der unstrukturierte Code zur Ausgabe der Zahlen 1 bis 39 und 61 bis 100 lässt sich durch ein Flussdiagramm wiedergeben:
Auch der strukturierte Code ließe sich durch ein ähnliches Diagramm darstellen, zusätzlich jedoch durch ein Struktogramm