\documentstyle[11pt,german,strukto]{article}

\hoffset=0.5cm
\voffset=-1cm

\textwidth=15cm
\textheight=25cm
\parindent=0pt
\frenchspacing

\hyphenation{ Kon-strukt Kon-struk-te Kon-struk-ten }
\begin{document}


\section*{Dokumentation zu `{\tt strukto.sty}' (V2.0)}

\begin{tabbing}
Aufgabe:\quad \= \kill
F"ur:    \> \LaTeX \\
Aufgabe: \> Stellt eine Umgebung zum Setzen von Struktogrammen zur Verf"ugung. \\
Autor:   \> Thomas Birnthaler, IMMD5 (Mustererkennung),
            FAU Erlangen-N"urnberg.
\end{tabbing}


Struktogramme dienen zur "ubersichtlichen Darstellung von Programmen in
graphischer Form. Aus einigen wenigen einfachen graphischen Grundelementen
lassen sich damit durch Aneinanderreihung und Verschachtelung beliebig
komplexe Programmstrukturen beschreiben.
Das folgende einfache Struktogramm

\begin{center}
\footnotesize
\begin{struktogramm}{6cm}{0.5cm}
  \BLOCK {READ untergrenze\\
          READ obergrenze}
  \FOR {i = untergrenze TO obergrenze}
  DO {\IF {Odd(i)}
      THEN {\BLOCK* {print 3 * i + 1}}
      ELSE {\BLOCK* {print i / 2}}}
\end{struktogramm}
\end{center}

\bigskip
wurde mit der {\tt struktogramm}-Umgebung der hier beschriebenen
Dokumentstil-Option durch folgende Anweisungen erstellt:

{\footnotesize
\begin{verbatim}
    \begin{struktogramm}{6cm}{0.5cm}
      \BLOCK {READ untergrenze\\
              READ obergrenze}
      \FOR {i = untergrenze TO obergrenze}
      DO {\IF {Odd(i)}
          THEN {\BLOCK* {print 3 * i + 1}}
          ELSE {\BLOCK* {print i / 2}}}
    \end{struktogramm}
\end{verbatim}}

In den folgenden Beispielen ist rechts neben jedem Struktogramm der
sein Quelltext angegeben.
Zur Erzeugung von Struktogrammen werden von der {\tt struktogramm}-Umgebung
folgende graphische Grundelemente zur Verf"ugung gestellt:

\hskip2cm
\begin{minipage}[t]{4cm}
\footnotesize
\begin{struktogramm}{4cm}{0.5cm}
   \BLOCK {elementare Anweisung 1 \\
           \ldots \\
           elementare Anweisung N}
\end{struktogramm}
\end{minipage}%
%
\hskip1cm
%
\begin{minipage}[t]{7cm}
\footnotesize
\begin{verbatim}

   \BLOCK {elementare Anweisung 1 \\
           \ldots \\
           elementare Anweisung N}
\end{verbatim}
\end{minipage}

\medskip
\hskip2cm
\begin{minipage}[t]{4cm}
\footnotesize
\begin{struktogramm}{4cm}{0.5cm}
   \FOR {Bedingung}
   DO {\BLOCK {Anweisung}}
\end{struktogramm}
\end{minipage}%
%
\hskip1cm
%
\begin{minipage}[t]{7cm}
\footnotesize
\begin{verbatim}

   \FOR {Bedingung}
   DO {\BLOCK {Anweisung}}
\end{verbatim}
\end{minipage}

\medskip
\hskip2cm
\begin{minipage}[t]{4cm}
\footnotesize
\begin{struktogramm}{4cm}{0.5cm}
   \WHILE {Bedingung}
   DO {\BLOCK {Anweisung}}
\end{struktogramm}
\end{minipage}%
%
\hskip1cm
%
\begin{minipage}[t]{7cm}
\footnotesize
\begin{verbatim}

   \WHILE {Bedingung}
   DO {\BLOCK {Anweisung}}
\end{verbatim}
\end{minipage}

\medskip
\hskip2cm
\begin{minipage}[t]{4cm}
\footnotesize
\begin{struktogramm}{4cm}{0.5cm}
   \REPEAT {\BLOCK {Anweisung}}
   UNTIL {Bedingung}
\end{struktogramm}
\end{minipage}%
%
\hskip1cm
%
\begin{minipage}[t]{7cm}
\footnotesize
\begin{verbatim}

   \REPEAT {\BLOCK {Anweisung}}
   UNTIL {Bedingung}
\end{verbatim}
\end{minipage}

\medskip
\hskip2cm
\begin{minipage}[t]{4cm}
\footnotesize
\begin{struktogramm}{4cm}{0.5cm}
   \LOOP
   {\BLOCK {Anweisung}}
\end{struktogramm}
\end{minipage}%
%
\hskip1cm
%
\begin{minipage}[t]{7cm}
\footnotesize
\begin{verbatim}

   \LOOP
   {\BLOCK {Anweisung}}
\end{verbatim}
\end{minipage}

\medskip
\hskip2cm
\begin{minipage}[t]{4cm}
\footnotesize
\begin{struktogramm}{4cm}{0.5cm}
   \IF {Bedingung}
   THEN {\BLOCK* {Anweisung}}
   ELSE {\BLOCK* {Anweisung}}
\end{struktogramm}
\end{minipage}%
%
\hskip1cm
%
\begin{minipage}[t]{7cm}
\footnotesize
\begin{verbatim}

   \IF {Bedingung}
   THEN {\BLOCK* {Anweisung}}
   ELSE {\BLOCK* {Anweisung}}
\end{verbatim}
\end{minipage}

\bigskip
Diese Konstrukte k"onnen zur Erzeugung
eines beliebigen Struktogramms entsprechend den folgenden Regeln
aneinandergereiht und ineinandergeschachtelt werden:

\begin{itemize}

\item
Die Befehle  zur Erzeugung eines Struktogramms stehen {\em nur\/} in der
{\tt struktogramm}-Umgebung zur Verf"ugung. Beim Einleitungsbefehl der Umgebung 
{\em m"ussen\/} die ge\-w"un\-schte Breite dieses 
Struktogramms und die gew"unschte Einr"uckungsbreite von Schleifenk"orpern 
angegeben werden. Im folgenden Beispiel betr"agt die
Struktogrammbreite 6\,cm und die Einr"uckungsbreite 0.5\,cm:

{\footnotesize
\begin{verbatim}
    \begin{struktogramm}{6cm}{0.5cm}
      ...
    \end{struktogramm}
\end{verbatim}}

In den Quelltexten der Beispiele wurden diese beiden Befehle 
zur Einleitung und Beendigung der {\tt struktogramm}-Umgebung 
der "Ubersichtlichkeit halber weggelassen.

\item
Eine komplette Struktogrammumgebung kann als eine Einheit betrachtet werden,
die wie ein gro"ser Einzelbuchstabe in den umgebenden Text eingef"ugt wird
(Basislinie ist der obere Rand).
Da dies wenig sinnvoll erscheint, wird sie am besten in eine {\tt figure}-
Umgebung eingeschachtelt und mit einem \verb|\centering|-Befehl zentriert zum
umgebenden Text dargestellt:

{\footnotesize
\begin{verbatim}
    \begin{figure}[htbp]
      \centering
      \begin{struktogramm}{6cm}{0.5cm}
        ...
      \end{struktogramm}
    \end{figure}
\end{verbatim}}

\item
Elementare Anweisungen {\em m"ussen\/} in ein 
\verb|\BLOCK|-Konstrukt eingeschachtelt werden. Wird dies vergessen, kann
der Programmtext nicht korrekt im Struktogramm plaziert werden. 
Ein Beispiel daf"ur, wie man es also nicht machen sollte, ist

\medskip
\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
   \FOR {i = 1 TO 10}
   DO {Print $i$ \\
       Print $i^2$}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

   \FOR {i = 1 TO 10}
   DO {Print $i$ \\
       Print $i^2$}
\end{verbatim}
\end{minipage}

\bigskip

\item
Eine Sequenz von aufeinanderfolgenden Konstrukten wird (ohne Leerzeile
dazwischen) einfach untereinandergeschrieben.

\medskip
\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
   \BLOCK {$A = 1, B = 2$}
   \BLOCK {$C = 1$}
   \IF {$A \le B \wedge B \le C$}
   THEN {\BLOCK* {Print ``sorted''}}
   ELSE {\BLOCK* {Print ``muddled''}}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

   \BLOCK {$A = 1, B = 2$}
   \BLOCK {$C = 1$}
   \IF {$A \le B \wedge B \le C$}
   THEN {\BLOCK* {Print ``sorted''}}
   ELSE {\BLOCK* {Print ``muddled''}}
\end{verbatim}
\end{minipage}
\bigskip

\item
Als {\em Bedingung\/} in IF-, FOR-, WHILE- und REPEAT-Konstrukten ist
beliebiger Text erlaubt, aber (sinnvollerweise) keine Struktogrammanweisung.
Siehe die FOR- und IF-Anweisung in den beiden vorhergehenden Beispielen.

\item
In den Anweisungsteilen der IF-, FOR-, WHILE-, REPEAT- und LOOP-Konstrukte,
sowie in den THEN- und ELSE-Zweigen des IF-Konstrukts sind wiederum beliebige
Struktogramm-Konstrukte erlaubt. Im einfachsten Fall ist dies eine
\verb|\BLOCK|-Kom\-man\-do mit Programmtext.
Ein Beispiel f"ur eine komplexere Verschachtelung von Konstrukten ist

\medskip
\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
   \REPEAT{%
     \BLOCK {Read $i$}
     \WHILE {$i > 1$}
     DO {\IF {Odd($i$)}
         THEN {\BLOCK* {$i = 3 * i + 1$}}
         ELSE {\BLOCK* {$i = i / 2$}}}}
   UNTIL{$i = 0$}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

   \REPEAT{%
     \BLOCK {Read $i$}
     \WHILE {$i > 1$}
     DO {\IF {Odd($i$)}
         THEN {\BLOCK* {$i = 3 * i + 1$}}
         ELSE {\BLOCK* {$i = i / 2$}}}}
   UNTIL{$i = 0$}
\end{verbatim}
\end{minipage}
\bigskip

Nebenbei: Es ist nicht bekannt, ob nach Eingabe eines beliebigen Wertes
f"ur $i$ jemals ein zweiter Wert eingegeben werden kann.

\item
Wird nur der THEN-Teil eines IF-Konstruktes ben"otigt, {\em mu"s\/} ein
ELSE-Teil mit leerem Argument angegeben werden. Der ELSE-Teil wird dann
im Struktogramm weggelassen.

\medskip
\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
     \IF {Odd($i$)}
     THEN {\BLOCK* {$i = 3 * i + 1$}}
     ELSE {}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

     \IF {Odd($i$)}
     THEN {\BLOCK* {$i = 3 * i + 1$}}
     ELSE {}
\end{verbatim}
\end{minipage}
\bigskip

\item
Zum IF-Konstrukt gibt es eine {\em extended\/}-Form, bei der links vom 
gesamten IF-Konstrukt eine schmale Spalte erscheint (halb so breit wie
die Einr"uckungsbreite von Schleifenk"orpern).

\medskip
\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
     \IFx {$B < 0$}
     THEN {\BLOCK* {$B = B + 1$}}
     ELSE {\BLOCK* {$B = B - 1$}}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

     \IFx {$B < 0$}
     THEN {\BLOCK* {$B = B + 1$}}
     ELSE {\BLOCK* {$B = B - 1$}}
\end{verbatim}
\end{minipage}
\bigskip

\item
Bei beiden Formen des IF-Konstrukts kann optional ein {\tt *} nach dem 
Schl"usselwort IF/IFx angegeben werden, der daf"ur sorgt, da"s die 
IF-, THEN- und ELSE-Teile alle gleich breit werden und zwischen dem
IF-Schl"usselwort und der Bedingung ein Trennstrich gezogen wird.

\medskip
\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
     \IF* {$B < 0$}
     THEN {\BLOCK {$B = B + 1$}}
     ELSE {\BLOCK {$B = B - 1$}}
     \IFx* {$B < 0$}
     THEN {\BLOCK {$B = B + 1$}}
     ELSE {\BLOCK {$B = B - 1$}}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

     \IF* {$B < 0$}
     THEN {\BLOCK {$B = B + 1$}}
     ELSE {\BLOCK {$B = B - 1$}}
     \IFx* {$B < 0$}
     THEN {\BLOCK {$B = B + 1$}}
     ELSE {\BLOCK {$B = B - 1$}}
\end{verbatim}
\end{minipage}
\bigskip

\item
Zum BLOCK-Konstrukt gibt es eine {\tt *}-Form, die daf"ur sorgt, da"s links vom
Block {\em kein\/} Strich erscheint. Dieser \verb|\BLOCK*|-Befehl ist {\em nur\/}
im normalen IF-Konstrukten sinnvoll anwendbar. Siehe die 
IF-Konstrukte in vorhergehenden Beispielen.

\item
Zu jedem der Befehle \verb|\FOR|, \verb|\WHILE|, \verb|\REPEAT| und
\verb|\LOOP|
kann optional ein (kurzer) Text angegeben werden, der das jeweilige
Standard-Schl"usselwort FOR, WHILE, UNTIL oder LOOP ersetzt. Dieser optionale
Parameter darf auch leer sein.

\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
    \FOR[$\forall$]{Bedingung}
    DO {\BLOCK {Anweisung}}
    \WHILE[SOLANGE]{Bedingung}
    DO {\BLOCK {Anweisung}}
    \REPEAT[BIS]{\BLOCK {Anweisung}}
    UNTIL {Bedingung}
    \LOOP[WIEDERHOLE]
    {\BLOCK {Anweisung}}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

    \FOR[$forall$] {Bedingung}
    DO {\BLOCK {Anweisung}}
    \WHILE[SOLANGE] {Bedingung}
    DO {\BLOCK {Anweisung}}
    \REPEAT[BIS] {\BLOCK {Anweisung}}
    UNTIL {Bedingung}
    \LOOP[WIEDERHOLE]
    {\BLOCK {Anweisung}}
\end{verbatim}
\end{minipage}
\bigskip

\item
Zu den Befehlen \verb|\IF| bzw. \verb|\IFx| k"onnen optional drei durch
Komma getrennte (kurze) Texte angegeben werden, die die Standard-Schl"usselworte
IF, THEN und ELSE ersetzen.

\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
    \IF[WENN,DANN,SOLANGE] {$B < 0$}
    THEN {\BLOCK* {$B = B + 1$}}
    ELSE {\BLOCK* {$B = B - 1$}}
    \IFx*[{\bf ???},
          $\Rightarrow$,
          $\not\Rightarrow$] {$B < 0$}
    THEN {\BLOCK {$B = B + 1$}}
    ELSE {\BLOCK {$B = B - 1$}}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

    \IF[WENN,DANN,SOLANGE] {$B < 0$}
    THEN {\BLOCK* {$B = B + 1$}}
    ELSE {\BLOCK* {$B = B - 1$}}
    \IFx[{\bf ???},
         $\Rightarrow$,
         $\not\Rightarrow$] {$B < 0$}
    THEN {\BLOCK* {$B = B + 1$}}
    ELSE {\BLOCK* {$B = B - 1$}}
\end{verbatim}
\end{minipage}
\bigskip

\item
Das Ma"s \verb|\struktohskip| (0.5ex) bestimmt den (Mindest)Abstand von
Schl"usselworten und
Programmtexten vom linken und rechten Rand des umgebenden Kastens. Es kann
mit dem Kommando \verb|\setlength{\struktohskip}{Laenge}| {\em innerhalb\/} 
der {\tt struktogramm}-Umgebung beliebig ver"andert werden. 


\hskip0.9cm
\begin{minipage}[t]{5cm}
\footnotesize
\begin{struktogramm}{5cm}{0.5cm}
    \struktohskip=1em
    \IF* {$B < 0$}
    THEN {\BLOCK {$B = B + 1$}}
    ELSE {\BLOCK {$B = B - 1$}}
\end{struktogramm}
\end{minipage}%
%
%\hskip1cm
%
\begin{minipage}[t]{8cm}
\footnotesize
\begin{verbatim}

    \struktohskip=1em
    \IF* {$B < 0$}
    THEN {\BLOCK {$B = B + 1$}}
    ELSE {\BLOCK {$B = B - 1$}}
\end{verbatim}
\end{minipage}
\bigskip

\end{itemize}

Zum Abschluss noch ein gro"se Struktogramm, das den ber"uhmten 
Backtracking-Al\-go\-rith\-mus zur Suche eines Pfades in einem Graphen 
darstellt:

\def\variable#1{{\tt #1}}
\def\program#1{{\sl #1}}

\begin{figure}[htbp]
  \footnotesize
  \centering
  \begin{struktogramm}{0.9\textwidth}{2em}
    \BLOCK{Initialisiere: \variable{ENDE} := `false', 
                          \variable{FAILURE} := `true'}
    \BLOCK{Ermittle die Liste \variable{NACHFOLGER}
           der direkten Nachfolger vom "ubergebenen
           Knoten \variable{K} und ordne sie entsprechend der Funktion
           \program{BEWERTUNG}}
    \WHILE{\variable{ENDE} = `false' und 
           \variable{NACHFOLGER} nicht leer} DO{%
      \BLOCK{\variable{N} sei der erste Knoten aus \variable{NACHFOLGER}}
      \IF*{\variable{N} ist ein terminaler Knoten}
       THEN{\BLOCK{\variable{ENDE} := `true'\\
                   \variable{FAILURE} := `false'}}
       ELSE{%
            \IF*{R"uckziehbedingung ist f"ur \variable{N} erf"ullt}
             THEN{\BLOCK{\variable{ENDE} := \variable{FAILURE} := `true'}}
             ELSE{%
                  \IF*{\program{RZ}(\variable{N}) = `false'}
                   THEN{\BLOCK{Streiche \variable{N} aus \variable{NACHFOLGER}}}
                   ELSE{\BLOCK{Erfolgreichen Pfad gefunden\\
                               \variable{ENDE} := `true',
                               \variable{FAILURE} := `false'}}}}}
    \BLOCK{Liefere \variable{FAILURE} als Ergebnis zur"uck}
  \end{struktogramm}
  \caption[Ein allgemeiner R"uckziehungs-Algorithmus]
          {\parbox[t]{10cm}{Ein allgemeiner R"uckziehungs-Algorithmus 
           \program{RZ}(\variable{K}) als rekursive boolesche 
           Funktion mit "ubergebenem Knoten \variable{K}}}\label{k3:back}
\end{figure}

\end{document}

