© APSIS GmbH |
Leider verfügen nicht alle Programmiersprachen über die Sprachmittel für die oben beschriebenen Steuerstrukturen. Assemblersprachen kennen z.B. nur bedingte Sprünge. In einem solchen fall ist jeder Programmierer gut beraten, sie ausschließlich zur Nachbildung der oben genannten Steuerstrukturen (Fallunterscheidung und Wiederholung) zu benutzen, um zumindest eine gewisse Durchschaubarkeit zu erreichen.
Algorithmen, die nur Sequenzen, Alternativen und Wiederholungen enthalten, heißen strukturierte Algorithmen. Ihr Ablauf kann mit Hilfe von Struktogrammen dargestellt werden.
Für den Entwurf von komplexeren (mehrfach geschachtelten) Algorithmen, die mit Hilfe von Sequenz, Alternative und Wiederholung ausgedrückt werden sollen, wurden Struktogramme oder Nassi-Shneidermann-Diagramme entwickelt. Sie bestehen aus Struktogrammelementen. Ein Struktogrammelement ist ein viereckiges Kästchen, das entweder eine
enthält. Die Nullanweisung wird durch ein X im Kästchen ausgedrückt, die elementare Anweisung eine (evtl. formale, meistens aber verbale) Beschreibung des Methodenaufrufs. Eine Sequenz (als ein einzelnes Struktogrammelement) besteht aus zwei oder mehrere untereinandergeschriebenen Struktogrammelementen:
Abb. 10.5: Sequenz
Eine Ein- oder Zweiweg-Alternative enthält einen logischen Ausdruck und zwei Struktogrammelemente, die nach den selben Regeln gebaut sind. Ihre grafischen Darstellungen sind:
Abb. 10.6: Alternativen
Das Zeichen + drückt aus, daß das Struktogrammelement auf der linken Seite bei erfüllter Bedingung ausgeführt wird. Die Zeichen + und - können vertauscht werden, um das Struktogramm bequemer zu gestalten.
Eine (allgemeine) Wiederholung enthält einen logischen Ausdruck (die Abbruchbedingung) und zwei Struktogrammelemente (den Eins-Block und den Null-Block), die ebenfalls nach den obigen Regeln gebaut sind. Ihre grafische Darstellung ist:
Abb. 10.7: Wiederholung mit Abbruchbedingung
Die beiden Spezialfälle kopf- und fußgesteuerte Schleife werden grafisch folgendermaßen dargestellt:
Abb. 10.8: Wiederholungen
Manche Programmiersprachen wie Pascal verlangen (etwas inkonsequent) bei der kopfgesteuerten Schleife eine Fortsetzungs-, bei der fußgesteuerten Schleife eine Abbruchbedingung anzugeben. Dies ist aufgrund der reservierten Wörter while und until einsichtig. In Java wird bei der kopf- und rumpfgesteuerten Schleifen (nach while) die Fortsetzungsbedingung angegeben, während bei der rumpfgesteuerten Schleife (zwischen if und break) die Abbruchbedingung. Beim Struktogramm soll deutlich gemacht werden, in welchem Sinne die Schleifenbedingung angegeben wurde; am besten immer konsequent gleich.
Ein Struktogrammelement kann den Namen eines weiteren Struktogramms enthalten, wenn der Algorithmus nicht auf einer Seite dargestellt werden kann. Dann wird ein Teil des Struktogramms auf einer anderen Seite entworfen, ihm ein Name gegeben und dieser Name in das umfassende Struktogramm eingesetzt.
Abb. 10.9: Einsetzen von Struktogrammen
Dieser Fall kann durch ein ausreichend großes Papier und durch kleine Algorithmen (wie empfohlen) vermieden werden: Statt den Namen eines eingeschlossenen Struktogramms einzusetzen, sollte lieber der Teilalgorithmus als eigene Operation implementiert und der Aufruf als Anweisung dargestellt werden.
Die wichtigste Eigenschaft von strukturierten Algorithmen ist an den Struktogrammen ersichtlich: Jedes Struktogrammelement hat genau einen Eingang und einen Ausgang, nämlich die das Struktogrammelement von oben und von unten begrenzende Linie. Für strukturierte Algorithmen gilt dasselbe Prinzip.
Aus diesem Grund sollte auf die folgende, von Java erlaubte Möglichkeit weitgehend verzichtet werden:
Als Beispiel für die Verwendung von Struktogrammen betrachten wir den Algorithmus der Inklusion a Í b zwischen Multibehältern. Sie ist eine logische Funktion mit den Parametern a und b, der feststellt, ob alle Elemente einer Menge a in einer zweiten Menge b vorhanden sind oder ob es ein Element in a gibt, das in b nicht vorhanden ist. .
Die einfachste Lösung als Struktogramm sieht folgendermaßen aus:
Abb. 10.10: Inklusion von Multibehältern
Hierbei können zweifelsohne Optimierungsmöglichkeiten wahrgenommen werden:
Der Preis für den schnelleren Algorithmus ist:
Besonders dieses letztere kann ein Grund sein, auf die Optimierung zu verzichten. Vermutlich ist die Arbeitszeit des Programmierers und besonders dessen, der das Programm für die Wartung lesen, verstehen und nachvollziehen muß, deutlich teurer, als die Ersparnisse an Prozessorzeit durch den schnelleren Programmablauf. Dies gilt nur dann nicht, wenn das Programm sehr oft (z.B. im Betriebssystem oder im Interpreter) ausgeführt wird oder wenn die Laufzeitersparnis enorm groß ist (was selten der Fall ist).
Übung 10.13: Erweitern Sie die positionierbare Liste aus dem Programm (9.13) auf der Seite 211 mit der neuen Methode "Inklusion" nach dem obigen Struktogramm. Sie stellt fest, ob alle Elemente der Parametermenge in der Menge enthalten sind.
Übung 10.14: Entwerfen Sie den Algorithmus in Form von Struktogrammen für die Übung 10.7 auf der auf der Seite 233.
Übung 10.15: Entwerfen Sie den Algorithmus in Form von Struktogrammen, der entscheidet, ob alle Elemente in einem Sack nur einfach vorkommen oder es auch mehrfach vorkommende Elemente gibt. Auf die Elemente des Sacks können sie mit folgenden Methoden zugreifen: erstesLesen (liefert es ein beliebiges Element des Sacks), naechstesLesen (liefert ein seit dem letzten erstesLesen noch nicht gelesenes Element; wenn es keine mehr gibt, liefert ein beliebiges Element) sowie alleGelesen (liefert true, wenn seit dem letzten erstesLesen alle Elemente gelesen wurden, sonst false).
© APSIS GmbH |