Nassi-Shneiderman-Diagramm und Schlacht bei Hohenmölsen: Unterschied zwischen den Seiten
K Redirectauflösung |
|||
Zeile 1: | Zeile 1: | ||
Die '''Schlacht bei [[Hohenmölsen]]''' war das letzte und damit entscheidende Aufeinandertreffen in der Auseinandersetzung zwischen König [[Heinrich IV. (HRR)|Heinrich IV.]] und dem Gegenkönig [[Rudolf von Rheinfelden]], dem [[Herzog von Schwaben]]. |
|||
{{Vorlage:Infobox Din | |
|||
NR = 66261| |
|||
Bereich = Programmierung| |
|||
Regel = Informationsverarbeitung; Sinnbilder für Struktogramme nach Nassi-Shneiderman| |
|||
Beschreib = Struktogramme| |
|||
Jahr = 1985| |
|||
ISO = | |
|||
}} |
|||
Ein '''Nassi-Shneiderman-Diagramm''' ist eine Entwurfsmethode für die strukturierte [[Programmierung]], die 1972/73 von Dr. [[Isaac Nassi|Isaac Nassi]] und Dr. [[Ben Shneiderman]] entwickelt wurde. |
|||
Es ist genormt nach [[DIN]] 66261. |
|||
Da Nassi-Shneiderman-Diagramme Programmstrukturen darstellen, werden sie auch als ''Struktogramme'' bezeichnet. |
|||
== Vorgeschichte == |
|||
Die Methode zerlegt das Gesamtproblem, das man mit dem gewünschten [[Algorithmus]] lösen will, in immer kleinere Teilprobleme bis schließlich nur noch elementare Grundstrukturen wie [[Befehlsfolge|Sequenzen]] und [[Kontrollstruktur]]en zur Lösung des Problems übrig bleiben. Diese können dann durch ein Nassi-Shneiderman-Diagramm oder einen [[Programmablaufplan]] (PAP) visualisiert werden. Die Vorgehensweise entspricht der sogenannten [[Top-down]] Programmierung, in der zunächst ein Gesamtkonzept entwickelt wird, das dann durch eine Verfeinerung der Strukturen des Gesamtkonzeptes aufgelöst wird. |
|||
Böhm und Jacopini hatten 1966 nachgewiesen, dass sich jeder beliebige Algorithmus ohne Sprung [[Sprunganweisung]] (Goto) formulieren lässt. |
|||
Im Februar [[1076]] hatte [[Papst]] [[Gregor VII.]] den [[Kirchenbann]] über König Heinrich IV. ausgesprochen, dem auf der Fürstenversammlung zu [[Trebur]] im Oktober der Beschluss folgte, dass Heinrich abgesetzt sei, wenn er diesen Bann nicht innerhalb eines Jahres löse. Der [[Gang nach Canossa]] im Januar [[1077]] brachte das gewünschte Ergebnis, hielt aber Heinrichs Gegner nicht davon ab, am [[15. März]] Rudolf von Rheinfelden zum König zu wählen und ihn am [[26. März]] auch salben zu lassen. Im Juni belegte Heinrich seinen Gegner mit der [[Reichsacht]], im November wurde er vom Papst erneut gebannt. |
|||
Für die Abbildung objektorientierter Programmkonzepte haben sich sowohl Programmablaufpläne als auch das Nassi-Shneiderman-Diagramm als ungeeignet erwiesen. Als Konsequenz wurde die [[Unified Modeling Language]] (UML) für objektorientierte Progammkonzepte entwickelt. |
|||
== |
== Die Schlacht == |
||
Die nachfolgenden Strukturblöcke können z.T. ineinander geschachtelt werden. Das aus den unterschiedlichen Strukturblöcken zusammengesetzte Struktogramm ist im Ganzen rechteckig, d.h. genauso breit wie sein breitester Strukturblock. |
|||
Nach mehreren vorangegangenen Schlachten ([[Schlacht bei Mellrichstadt]] am [[7. August]] [[1078]] und [[Schlacht bei Flarchheim]] am [[27. Januar]] [[1080]], die Rudolf beide gewonnen hatte) trafen die Gegner am [[15. Oktober]] [[1080]] bei [[Hohenmölsen]] aufeinander. |
|||
===Linearer Ablauf (Sequenz)=== |
|||
Heinrich war von Hessen über Thüringen Richtung Sachsen marschiert, um sich mit den Kontingenten des Markgrafen von Meißen und vor allem des Herzogs Bratislav von Böhmen zu vereinigen. Die von Goslar her anrückende Streitmacht Rudolfs holte das königliche Heer nahe der [[Weiße Elster|Weißen Elster]] ein. |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:lineareAnw.png|none|Anweisung]] |
|||
| |
|||
Jede [[Anweisung]] wird in einen rechteckigen Strukturblock geschrieben. |
|||
Heinrich nahm Aufstellung hinter dem Sumpf der Grunau, der für Reiter nur an wenigen Stellen passierbar war. Rudolf entschloss sich zum Angriff, ehe der Zuzug aus Meißen und Böhmen den König noch mehr verstärkt. Dazu begann er ein hinhaltendes Reitergefecht an den wenigen Übergangsstellen, während unter Führung [[Otto II. von Northeim|Ottos von Northeim]] ein Teil der Ritter absaß, den Sumpf durchschritt, so in den Rücken des königlichen Heeres gelangte, das Lager Heinrichs IV. eroberte und schließlich dessen Heer von hinten angriff. |
|||
Die Strukturblöcke werden nacheinander von oben nach unten durchlaufen. |
|||
Dieser Rückenangriff entschied die Schlacht zugunsten Rudolfs. Heinrich IV. floh vom Schlachtfeld Richtung Süden, wo Herzog Bratislav ihn rettete und nach Böhmen in Sicherheit brachte. |
|||
Rudolf von Rheinfelden jedoch wurde während der Schlacht tödlich verwundet. Einer der Ritter Heinrichs IV., dessen Name trotz seiner wichtigen Tat nicht überliefert ist, schlug dem Gegenkönig die rechte Hand ab und stach ihm das Schwert in den Unterleib. Rudolf starb einen Tag später an diesen Verletzungen, wurde im [[Merseburger Dom]] aufgebahrt und dort auch begraben. Die abgeschlagene Hand wurde im Dom aufbewahrt, da man hoffte, sie könne in der Folgezeit zu einer Reliquie werden. Heutzutage befindet sich die Hand in der Ausstellung des Dom-Museums. |
|||
Leere Strukturblöcke sind nur in Verzweigungen zulässig. |
|||
|} |
|||
Ihr seit husos XD |
|||
== Folgen == |
|||
===Verzweigung (Alternative)=== |
|||
====Einfache Auswahl (bedingte Verarbeitung)==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:einfAusw.png|none|Einfache Auswahl]] |
|||
| |
|||
Nur wenn die Bedingung zutreffend (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 (Austritt unten). |
|||
|} |
|||
Heinrich IV. reagierte auf die Nachricht von Rudolfs Tod, indem er die Reste seines Heeres sammelte und die Burgen, in denen sich Rudolfs Soldaten verschanzt hatten, [[Teuchern]], Hohenmölsen, [[Grunau]] und [[Pegau]], belagerte, eroberte und niederbrannte. Darüber hinaus nutzte er den Tod Rudolfs, vor allem das Abschlagen der rechten Hand, der [[Schwurhand]], propagandistisch als [[Gottesurteil]], womit er die Adelsopposition weiter schwächen konnte. |
|||
====Zweifache Auswahl (Selektion - alternative Verarbeitung)==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:zweifAusw.png|none|Zweifache Auswahl]] |
|||
| |
|||
Wenn die Bedingung zutreffend (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. Austritt unten nach Abarbeitung des jeweiligen Anweisungsblocks. |
|||
|} |
|||
Drei Jahre später, [[1083]], ließ Heinrich [[Rom]] erstürmen, [[1084]] zog er selbst in die Stadt ein, wo er am [[31. März]] zum Kaiser gekrönt wurde. |
|||
====Mehrfachauswahl==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:MehrfAusw.png|none|Mehrfachauswahl]] |
|||
| |
|||
Auch "verschachtelte" Auswahl genannt, da eine weitere Bedingung folgt. Die Verschachtelung ist ebenso im Nein-Fall (noch) möglich. |
|||
|} |
|||
====Fallauswahl==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:Fallauswahl.png|none|Fallauswahl]] |
|||
| |
|||
Besonders bei mehr als drei abzuprüfenden Bedingungen geeignet. Der Wert von "Variable" kann bedingt auf Gleichheit wie auch auf Bereiche (größer/kleiner bei Zahlen) geprüft werden und der entsprechend zutreffende "Fall" mit dem zugehörigen Anweisungsblock wird durchlaufen. Eine Fallauswahl kann manchmal in eine Mehrfachauswahl umgewandelt werden - etwa wenn die eingesetzte Programmiersprache Fallauswahlen nicht kennt. |
|||
|} |
|||
===Wiederholung (Iteration)=== |
|||
====Zählergesteuerte Schleife==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:Zaehlschleife.png|none|Zählergesteuerte Schleife]] |
|||
| |
|||
Wiederholungsstruktur, bei der die Anzahl der Durchläufe festgelegt ist. Als Bedingung 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 inkrementiert (bzw. bei negativer Schrittweite dekrementiert) und mit dem Endwert verglichen. Ist der Endwert überschritten, wird die Schleife verlassen. |
|||
|} |
|||
====Abweisende (vorprüfende - kopfgesteuerte) Schleife==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:kopfgesteuerteSchleife.png|none|Abweisende (kopfgesteuerte) Schleife]] |
|||
| |
|||
Wiederholungsstruktur mit vorausgehender Bedingungsprüfung. Der Schleifenkörper (Anweisungsblock 1) wird nur durchlaufen, wenn (und solange) die Bedingung zutreffend (wahr) ist. |
|||
Diese Symbolik wird auch für die Zählschleife (Anzahl der Durchläufe bekannt) benutzt. |
|||
|} |
|||
====Nicht abweisende (nachprüfende - fußgesteuerte) Schleife==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:fussgesteuerteSchleife.png|none|Abweisende (fußgesteuerte) Schleife]] |
|||
| |
|||
Wiederholungsstruktur mit nachfolgender Bedingungsprüfung. Der Schleifenkörper (Anweisungsblock 1) wird mindestens einmal durchlaufen, auch wenn die Bedingung von Anfang an nicht zutreffend (falsch) war. |
|||
|} |
|||
====Endlos-Schleife==== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:Endlosschleife.png|none|Endlos-Schleife]] |
|||
| |
|||
Kann allenfalls durch einen Aussprung (break) verlassen werden. |
|||
|} |
|||
===Aussprung=== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:Aussprung.png|none|Aussprung]] |
|||
| |
|||
Der Aussprung (break) stellt die Beendigung eines Programmteils dar und sollte nicht als das verstanden werden, was Nassi und Shneiderman mit den Struktogrammen eigentlich vermeiden wollten: Die Sprunganweisung (siehe oben: unbedingter Sprung [[Sprunganweisung|Goto]]). |
|||
|} |
|||
===Aufruf=== |
|||
{| border="0" |
|||
|- |
|||
|valign="top"|[[Bild:Aufruf.png|none|Aufruf]] |
|||
| |
|||
Symbolik zum Aufruf eines Unterprogramms bzw. einer Prozedur oder Funktion. Nach Durchlauf dieser wird genau zu der aufrufenden Stelle zurückgesprungen und der nächstfolgende Strukturblock durchlaufen. |
|||
|} |
|||
==Füllregeln== |
|||
===Allgemeingültigkeit=== |
|||
Struktogramme sollten keine programmiersprachenspezifische Befehlssyntax enthalten. Sie müssen so programmiersprachenunabhängig formuliert werden, dass die dargestellte Logik einfach zu verstehen und als Codiervorschrift in jede beliebige Programmiersprache umgesetzt werden kann. |
|||
===Deklaration=== |
|||
Ursprünglich für prozedurale Programmiersprachen entwickelt, bildete man in Struktogrammen nur die Prozedur und keine Deklarationsbereiche von Variablen und Konstanten ab (einfaches Struktogramm). Dadurch ist jedoch nicht sofort deutlich, welcher Datentyp einer Variablen zugeordnet werden muss. Die Deklaration von Variablen und Konstanten ist im ersten Anweisungsblock vorzunehmen. Diese Nassi-Shneiderman Diagramme bezeichnet man als erweiterte Struktogramme. |
|||
===Exklusivität=== |
|||
Jede Anweisung erhält einen eigenen Strukturblock (Sinnbilder nach [[DIN]] 66261). Selbst mehrere Anweisungen gleicher oder ähnlicher Art dürfen nicht in einem Strukturblock zusammengefasst werden. |
|||
Jede Anweisung muss mindestens aus einer Zuweisung bestehen (z. B. Zielvariable <- Zielvariable * AndereVariable). Eine Zuweisung wird durch einen nach Links gerichteten Pfeil dargestellt. Ältere Struktogramme benutzen alternativ aus alten Pascal-Zeiten 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 gehört ein Name, um die Identifikation durch Ereignis- oder (Unter-)Programmaufrufe gewährleisten zu können. |
|||
==Praxisrelevanz== |
|||
===Wirtschaft=== |
|||
In der [[Softwareentwicklung]] werden Nassi-Shneiderman-Diagramme sehr selten eingesetzt, da normaler Programmcode einfacher zu schreiben und zu verändern ist: Korrigiert man einen Fehler oder macht eine Ergänzung, muss man ein Nassi-Shneiderman Diagramm in der Regel komplett neu zeichnen. Daher werden dort (falls es sich um Softwareentwicklung mit einer objektorientierten Sprache handelt) heutzutage zumeist [[Unified Modeling Language|UML]]-Diagramme eingesetzt, für die Editoren existieren, die Änderungen am Code unmittelbar im Diagramm abbilden können. |
|||
===Bildung=== |
|||
Im Informatik-Unterricht der [[Sekundarstufe II]] werden Struktogramme dagegen verwendet, damit Schüler den Aufbau logischer Abläufe, die für die Programmierung nötig sind, trainieren können. Die Erstellung von Struktogrammen aufgrund von Beschreibungen betrieblicher Problemstellungen, die wegen wiederkehrender gleicher Vorgehensweise automatisiert werden können, ist immer noch Bestandteil vieler schulischer Abschlussprüfungen. |
|||
==Beispieldiagramme== |
|||
===Einfaches Struktogramm=== |
|||
Das folgende Beispiel zeigt ein Diagramm für die Berechnung des größten gemeinsamen Teilers mit dem [[Euklidischer_Algorithmus|euklidischen Algorithmus]]. |
|||
{| border="0" |
|||
!als Nassi-Shneiderman-Diagramm ... |
|||
!... und in [[Pascal (Programmiersprache)|Pascal]]: |
|||
|- |
|||
|valign="top"|[[Bild:NassiShneiderman.png|none|Beispiel eines Nassi-Shneiderman Diagramms]] |
|||
| |
|||
PROGRAM GGT(Input,Output); |
|||
VAR a,b: Integer; |
|||
BEGIN |
|||
ReadLn(a,b); |
|||
WHILE (a>0) AND (b>0) DO |
|||
IF a>b THEN |
|||
a:=a-b; |
|||
ELSE |
|||
b:=b-a; |
|||
IF b=0 THEN |
|||
WriteLn(a) |
|||
ELSE |
|||
WriteLn(b) |
|||
END. |
|||
|} |
|||
===Erweitertes Struktogramm=== |
|||
[[Bild:struktErweitert.png|none|Beispiel eines erweiterten Nassi-Shneiderman Diagramms]] |
|||
''... und die Umsetzung in [[Visual Basic for Applications|VBA]]:'' |
|||
Option Explicit |
|||
Private Sub btnZensur_Click() |
|||
Dim intZensur As Integer, strZensur As String |
|||
intZensur = InputBox("Geben Sie die Zensur als Zahl ein.") |
|||
Select Case intZensur |
|||
Case 1: strZensur = "sehr gut" |
|||
Case 2: strZensur = "gut" |
|||
Case 3: strZensur = "befriedigend" |
|||
Case 4: strZensur = "ausreichend" |
|||
Case 5: strZensur = "mangelhaft" |
|||
Case 6: strZensur = "ungenügend" |
|||
Case Else: strZensur = "ungültig" |
|||
End Select |
|||
MsgBox "Ihre eingegebene Zensur in Worten: " & strZensur |
|||
End Sub |
|||
== Software == |
|||
*[http://eii.ucv.cl/nessi/ Nessi] Nassi-Shneiderman-Diagramme erstellen, bearbeiten und ablaufen lassen(GPL). |
|||
*[http://diuf.unifr.ch/softeng/student-projects/completed/kalt/NSD.html Nassi-Shneiderman Diagram-Editor mit OnlineDoc] |
|||
*[http://www.learn2prog.de/ Struktogrammeditor (Struktogramme online erstellen und ablaufen lassen)] |
|||
*[http://www.tinohempel.de/info/info/info-cd/index2.htm#Klasse%2012/II Software für Struktogramme und Ablaufdiagramme] |
|||
*[http://www.dsw2.de/Randprodukte.html Struktogramme.dot] (Macros und Symbolleiste für MS-Word, Freeware) |
|||
*[http://www.winload.de/download/4127/WinGESy-lite-4.0.html Struktogramme erzeugen mit editierbaren Quelltextausgaben für beliebige Programmiersprachen] |
|||
*[http://tug.ctan.org/tex-archive/macros/latex/contrib/struktex/ struktex: LaTeX-Paket zum erzeugen von Nassi-Shneiderman-Diagrammen] |
|||
*[http://tug.ctan.org/tex-archive/macros/latex/contrib/nassflow/ nassflow: LaTeX-Paket zum erzeugen von Nassi-Shneiderman-Diagrammen] |
|||
*[http://www.easycode.de/ EasyCODE Development Suite zum Editieren im Struktogramm] |
|||
*[http://sourceforge.net/projects/pynassi/ PyNassi] (Struktogramme für [[Python (Programmiersprache)|Python]], die [[Freeware]] kann aus den Struktogrammen Python-Quelltext generieren) |
|||
*[http://www.fesch.lu/index.php?id=developpment&include=developpment_program&program=25 Structorizer 2006] Nassi-Shneiderman Diagram-Editor mit mehreren Features |
|||
== Weblinks == |
== Weblinks == |
||
*[http:// |
* [http://www.stadt-hohenmoelsen.de/stadt/Schlacht.htm Auszug aus der Chronik der Stadt Hohenmölsen] |
||
*[http://www.rdrop.com/~cary/html/psd.html Englische Übersicht über Nassi-Shneiderman Webseiten] |
|||
*[http://www.nassi.com/ Homepage von Ike Nassi] |
|||
[[Kategorie:Softwarearchitektur]] |
|||
[[Kategorie:Programmierung]] |
|||
[[Kategorie:Schlacht (Deutschland)|Hohenmolsen]] |
|||
[[en:Nassi-Shneiderman diagram]] |
Version vom 17. November 2006, 12:09 Uhr
Die Schlacht bei Hohenmölsen war das letzte und damit entscheidende Aufeinandertreffen in der Auseinandersetzung zwischen König Heinrich IV. und dem Gegenkönig Rudolf von Rheinfelden, dem Herzog von Schwaben.
Vorgeschichte
Im Februar 1076 hatte Papst Gregor VII. den Kirchenbann über König Heinrich IV. ausgesprochen, dem auf der Fürstenversammlung zu Trebur im Oktober der Beschluss folgte, dass Heinrich abgesetzt sei, wenn er diesen Bann nicht innerhalb eines Jahres löse. Der Gang nach Canossa im Januar 1077 brachte das gewünschte Ergebnis, hielt aber Heinrichs Gegner nicht davon ab, am 15. März Rudolf von Rheinfelden zum König zu wählen und ihn am 26. März auch salben zu lassen. Im Juni belegte Heinrich seinen Gegner mit der Reichsacht, im November wurde er vom Papst erneut gebannt.
Die Schlacht
Nach mehreren vorangegangenen Schlachten (Schlacht bei Mellrichstadt am 7. August 1078 und Schlacht bei Flarchheim am 27. Januar 1080, die Rudolf beide gewonnen hatte) trafen die Gegner am 15. Oktober 1080 bei Hohenmölsen aufeinander. Heinrich war von Hessen über Thüringen Richtung Sachsen marschiert, um sich mit den Kontingenten des Markgrafen von Meißen und vor allem des Herzogs Bratislav von Böhmen zu vereinigen. Die von Goslar her anrückende Streitmacht Rudolfs holte das königliche Heer nahe der Weißen Elster ein.
Heinrich nahm Aufstellung hinter dem Sumpf der Grunau, der für Reiter nur an wenigen Stellen passierbar war. Rudolf entschloss sich zum Angriff, ehe der Zuzug aus Meißen und Böhmen den König noch mehr verstärkt. Dazu begann er ein hinhaltendes Reitergefecht an den wenigen Übergangsstellen, während unter Führung Ottos von Northeim ein Teil der Ritter absaß, den Sumpf durchschritt, so in den Rücken des königlichen Heeres gelangte, das Lager Heinrichs IV. eroberte und schließlich dessen Heer von hinten angriff. Dieser Rückenangriff entschied die Schlacht zugunsten Rudolfs. Heinrich IV. floh vom Schlachtfeld Richtung Süden, wo Herzog Bratislav ihn rettete und nach Böhmen in Sicherheit brachte.
Rudolf von Rheinfelden jedoch wurde während der Schlacht tödlich verwundet. Einer der Ritter Heinrichs IV., dessen Name trotz seiner wichtigen Tat nicht überliefert ist, schlug dem Gegenkönig die rechte Hand ab und stach ihm das Schwert in den Unterleib. Rudolf starb einen Tag später an diesen Verletzungen, wurde im Merseburger Dom aufgebahrt und dort auch begraben. Die abgeschlagene Hand wurde im Dom aufbewahrt, da man hoffte, sie könne in der Folgezeit zu einer Reliquie werden. Heutzutage befindet sich die Hand in der Ausstellung des Dom-Museums.
Folgen
Heinrich IV. reagierte auf die Nachricht von Rudolfs Tod, indem er die Reste seines Heeres sammelte und die Burgen, in denen sich Rudolfs Soldaten verschanzt hatten, Teuchern, Hohenmölsen, Grunau und Pegau, belagerte, eroberte und niederbrannte. Darüber hinaus nutzte er den Tod Rudolfs, vor allem das Abschlagen der rechten Hand, der Schwurhand, propagandistisch als Gottesurteil, womit er die Adelsopposition weiter schwächen konnte.
Drei Jahre später, 1083, ließ Heinrich Rom erstürmen, 1084 zog er selbst in die Stadt ein, wo er am 31. März zum Kaiser gekrönt wurde.