Struktogramme wurden 1972/73 von Isaac Nassi und Ben Shneiderman entwickelt. Daher sind sie auch unter dem Namen Nassi-Shneiderman-Diagramm bekannt.
Ein Struktogramm ist ein Diagrammtyp zur Darstellung von Programmentwürfen. Das Struktogramm zerlegt ein Gesamtproblem, das man mit einem Algorithmus lösen will, in immer kleinere Teilprobleme – bis schließlich nur noch elementare Grundstrukturen wie Befehle und Kontrollstrukturen zur Lösung des Problems übrig bleiben. Diese werden dann durch ein Struktogramm oder einen Programmablaufplan wie z.B. ein Aktivitätendiagramm der UML visualisiert.
Somit ist ein Struktogramm Teil der Entwurfsphase des Softwareentwicklungsprozesses. Allerdings werden In der Softwareentwicklung Struktorgramme selten eingesetzt. Dort werden vorrangig erweiterte Programmablaufpläne (Aktivitätsdiagramme der UML) verwendet.
Im Informatik-Unterricht werden Struktogramme verwendet, um den Aufbau von Algorithmen zu veranschaulichen. Die Erstellung von Struktogrammen aufgrund von Beschreibungen betrieblicher Anforderungen, die wegen wiederkehrender gleicher Vorgehensweise automatisiert werden können, ist immer noch Bestandteil vieler schulischer Abschlussprüfungen.
Folgendes Struktogramm beschreibt einen simplen Algorithmus, der eine Zahl in eine textbasierte Note umwandelt. Das Diagramm beginnt mit einem Titel (btnZensur). Dann folgt die Deklaration der benötigten Variablen. Es folgen zwei Befehle zur Bildschirmaus- und Eingabe in zwei Strukturblöcken. Dann folgt eine Mehrfachverzweigung. Je nachdem welchen Wert die Variable angenommen hat, wird ein Strukturblock ausgewählt. Es folgt ein abschließender Strukturblock mit der Ausgabe des Ergebnisses. Dieser Algorithmus wurde allgemeingültig formuliert; also unabhängig von einer bestimmten Programmiersprache. Jeder Befehl befindet sich exklusiv in einem eigenen Strukturblock.
Quelle (http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm)
Der Aufbau eines Struktograms wird in der DIN 66261definiert. Folgende Darstellungen wurden aus http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm entnommen.
Im folgenden wird die Modellierung von Verzweigungsvarianten beschrieben.
Einfache Auswahl
Wenn die Bedingung der einfach Auswahl im Sinne der booleschen Algebra wahr ist, wird der Anweisungsblock 1 durchlaufen. Ein Anweisungsblock kann aus einer oder mehreren Anweisungen bestehen. Trifft die Bedingung nicht zu (falsch), wird der Durchlauf ohne eine weitere Anweisung fortgeführt (siehe leeren Kasten). Nur in diesem Fall sind leere Strukturblöcke zulässig.
Zweifache Auswahl
Wenn die Bedingung der zweifach Auswahl im Sinne der booleschen Algebra wahr ist, wird der Anweisungsblock 1 durchlaufen. Trifft die Bedingung nicht zu (falsch), wird der Anweisungsblock 2 durchlaufen. Ein Anweisungsblock kann aus einer oder mehreren Anweisungen bestehen. Abschließend folgt ein Austritt nach Abarbeitung des jeweiligen Anweisungsblocks.
Mehrfach Auswahl
Die mehrfach Auswahl ist besonders bei mehr als drei abzuprüfenden Bedingungen geeignet. Der Wert von „Variable“ kann wieder im Sinne booleschen Algebra geprüft werden und der entsprechend zutreffende „Fall“ mit dem zugehörigen Anweisungsblock wird durchlaufen. Eine Fallauswahl kann stets in eine verschachtelte Auswahl umgewandelt werden.
Verschachtelte Auswahl
Alle Varianten der Verzweigung lassen sich auch verschachtelt modellieren.
Prinzipiell werden folgende Schleifentypen unterschieden:
Die kopfgesteuerte oder vorprüfende Schleife, bei der die Schleifenbedingung geprüft wird, bevor der Schleifenrumpf durchlaufen wird (meist mit WHILE).
Die fußgesteuerte oder nachprüfende Schleife, bei der nach dem Durchlauf des Schleifenrumpfes die Schleifenbedingung überprüft wird (meist als DO...WHILE = „ausführen...solange“ Konstrukt).
Kopfgesteuerte Schleifen
Der Schleifenkörper (Anweisungsblock 1) wird durchlaufen, solange die Bedingung im Sinne der booleschen Algebra wahr ist.
Zählschleife
Bei der Zählschleife ist die Anzahl der Durchläufe festgelegt. Als Bedingung im Sinne der booleschen Algebra muss eine Zählvariable angegeben und mit einem Startwert initialisiert werden. Ebenso muss ein Endwert und die (Zähl-)Schrittweite angegeben werden. Nach jedem Durchlauf des Schleifenkörpers (Anweisungsblock 1) wird die Zählvariable um die Schrittweite erhöht (bzw. bei negativer Schrittweite reduziert ) und mit dem Endwert verglichen. Ist der Endwert überschritten bzw. unterschritten, wird die Schleife verlassen.
Fußgesteuerte Schleife
Die fußgesteuerter Schleife hat eine nachfolgender Bedingungsprüfung für den Abbruch im Sinne der booleschen Algebra. Der Schleifenkörper (Anweisungsblock 1) wird mindestens einmal durchlaufen, auch wenn die Bedingung von Anfang an nicht zutreffend (falsch) war.
Symbol für den Aufruf eines Unterprogramms bzw. einer Methode. Nach deren Durchlauf wird zu der aufrufenden Stelle zurückgesprungen und der nächstfolgende Strukturblock durchlaufen. Dieses Symbol ist nicht genormt.
Des weiteren gelten folgende Konventionen zur Erstellung von Struktorgrammen.
Struktogramme sollten keine programmiersprachenspezifische Syntax (z.B. Java) enthalten. Sie müssen so programmiersprachenunabhängig formuliert werden, dass der dargestellte Algorithmus einfach zu verstehen und als Programmentwurf in jede beliebige Programmiersprache (z.B. Java) umzusetzen ist.
Die Deklaration von Variablen und Konstanten ist im ersten Anweisungsblock vorzunehmen.
Jeder Befehl erhält einen eigenen Strukturblock. Selbst mehrere Befehle gleicher oder ähnlicher Art dürfen nicht in einem Strukturblock zusammengelegt werden.
Jeder Befehl muss mindestens aus einer Zuweisung bestehen (beispielsweise Zielvariable ← Zielvariable * AndereVariable). Eine Zuweisung wird durch einen nach links gerichteten Pfeil dargestellt. Andere Struktogramme benutzen alternativ als Zuweisungszeichen den Doppelpunkt gefolgt vom Gleichheitszeichen (Zielvariable := Zielvariable * AndereVariable). Das Ziel einer Anweisung steht immer links vom Zuweisungszeichen. Rechts davon steht die Quelle.
Über jedes Struktogramm ist mit einem Titel zu versehen, um die Identifikation durch (Unter-)Programmaufrufe gewährleisten zu können.