\documentclass[11pt,ngerman]{article}
\usepackage{fixltx2e}%% the official fixes for LaTeX2e
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{geometry}
\geometry{verbose,a4paper,tmargin=0.5cm,bmargin=1cm,lmargin=2cm,rmargin=2cm,headheight=1cm,headsep=0.5cm}
\usepackage{fancyhdr}
\pagestyle{fancy}
\usepackage{html}
\latex{\renewcommand{\htmladdnormallink}[2]{#1 (\url{#2})}}
\usepackage{url}
\newcommand{\boldsymbol}[1]{\mbox{\boldmath $#1$}}
\usepackage{dsfont}
\usepackage{listings}
\lstset{language=[LaTeX]TEX,basicstyle=\ttfamily\scriptsize,%
	extendedchars=true,numbers=left,numberstyle=\tiny,%
	xleftmargin=2em,breaklines=true}
\usepackage{nassi}
\fancyhead{}
\fancyfoot[CE,CO]{\small $\sim$voss/nassi.tex\hfill\thepage}
\usepackage{babel}
\usepackage{hyperref}
\begin{document}
\twocolumn[%
\title{Struktogramme (Nassi-Shneiderman-Diagrams) \\
und das Latexpaket \texttt{nassi.sty}}
\author{Herbert Voß}
\date{28.11.2000}
\maketitle
\begin{abstract}
Struktogramme sind \textbf{eine} mögliche Form zur Beschreibung eines
Algorithmus. Ein Aufsatz oder ein Programmablaufplan (PAP) andere
Möglichkeiten. Entwckelt von Nassi und Shneiderman sind Struktogramme
eine elegante Form der \textbf{strukturierten Programmierung} um Algorithmen
anschaulich darstellen zu können. 
\end{abstract}%
]
\vspace*{1cm}
\tableofcontents{}
\section{Darstellung}
Latex stellt mit dem Macro \texttt{nassflow}%
\footnote{\htmladdnormallink{}{ftp://ftp.dante.de/tex-archive/macros/latex/contrib/nassflow/}}
 eine mehr oder weniger elegante Methode zum Erstellen derartiger
Struktogramme zur Verfügung.

\begin{description}
\item [Achtung:]Die Bezeichnung Block steht für jede mögliche Kombination
aus allen im folgenden angegebenen Struktogrammblöcke. Diese können
beliebig kombiniert werden, müssen allerdings mit einem Schlüsselwort
beginnen.
\end{description}
\subsection{Sequenz}
\nassiwidth=0.9\columnwidth\setiftext{J}{N}
\STRUCT{Nassi-Shneiderman}{Sequenz-Symbol}{%
  \ACTION{ Block (Anweisung) }%
} 

Befehl: 

\begin{lstlisting}
\ACTION{ -Block- }
\end{lstlisting}
Jede Anweisung, die keine logische Bedingung darstellt oder mit einem
anderen Schlüsselwort beginnt, muss in einen Action-Block geklammert
werden. 


\subsection{If-Verzweigung}

\nassiwidth=0.9\columnwidth\setiftext{J}{N}

\STRUCT{Nassi-Shneiderman}{If-Verzweigung}{% 
  \IF{logische Bedingung}%
    \THEN{\ACTION{Then-Block}%
    }
    \ELSE{\ACTION{Else-Block}%
    }%
  \ENDIF%
}

Befehl: 
\begin{lstlisting}
  \IF{logische Bedingung}%
    \THEN{\ACTION{Then-Block}%
    }
    \ELSE{\ACTION{Else-Block}%
    }%
  \ENDIF%
\end{lstlisting}

\subsection{While (For)-Schleife}

\nassiwidth=0.9\columnwidth\setiftext{J}{N}

\STRUCT{Nassi-Shneiderman}{While(Do)-Schleife}{% 
  \WHILE{logische Bedingung}{%
    \ACTION{Schleifen-Block}
  }\ENDWHILE%
}

Befehlsfolge:  

\begin{lstlisting}
\STRUCT{Nassi-Shneiderman}{While(Do)-Schleife}{% 
  \WHILE{logische Bedingung}{%
    \ACTION{Schleifen-Block}
  }\ENDWHILE%
\end{lstlisting}

\subsection{Repeat (Do) - Until (While)}

\STRUCT{Nassi-Shneiderman}{Repeat (Do)-Until (While)-Schleife}{% 
 \REPEAT{%
    \ACTION{Schleifen-Block}
  }\UNTIL{\quad logische Bedingung}%
}

Befehlsfolge: 

\begin{lstlisting}
 \REPEAT{%
    \ACTION{Schleifen-Block}
  }\UNTIL{\quad logische Bedingung}%
\end{lstlisting}

\subsection{Case-Anweisung}

Aus praktischen Gründen weicht die Case-Anweisung erheblich von den
sonst allgemein üblichen Darstellungen in Treppenform ab.

\STRUCT{Nassi-Shneiderman}{Case-Anweisung}{% 
  \CASE{case item}{% 
    \WHEN{condition 1}{% 
      \ACTION{statement to do}% 
    }% 
    \WHEN{condition 2}{% 
      \ACTION{statement 1 to do}% 
      \ACTION{statement 2 to do}% 
    }% 
    \WHEN{condition 3}{% 
      \ACTION{statement to do}% 
    }% 
  }\ENDCASE%
}

Befehlsfolge: 

\begin{lstlisting}
  \CASE{case item}{% 
    \WHEN{condition 1}{% 
      \ACTION{statement to do}% 
    }% 
    \WHEN{condition 2}{% 
      \ACTION{statement 1 to do}% 
      \ACTION{statement 2 to do}% 
    }% 
    \WHEN{condition 3}{% 
      \ACTION{statement to do}% 
    }% 
  }\ENDCASE%
\end{lstlisting}

\section{Beispiele}


\subsection{Quadratische Gleichung}

Als einführendes Beispiel sei die Lösung einer quadratischen Gleichung
angegeben:

\nassiwidth=\columnwidth\setiftext{J}{N}

\STRUCT{Mathematische Algorithmen}{pq-Formel}{ 
  \ACTION{Einlesen der Koeffizienten $a,b,c$ der quadratischen Gleichung $ax^{2}+bx+c=0$}
  \ACTION{Diskriminate bestimmen: ${\displaystyle D=\left(\frac{b}{2a}\right)^{2}-\frac{c}{a}}$\qquad (entspricht dem Radikanden)}
  \IF{($D\geq0$) ?}
    \THEN{\ACTION{${\displaystyle x_{1/2}=-\frac{b}{2a}\pm\sqrt{D}}$}
    }
    \ELSE{\ACTION{keine Lösung in $\mathds{R}$
    }
   }\ENDIF
}

Befehlsfolge:

\begin{lstlisting}
\nassiwidth=\columnwidth\setiftext{J}{N}

\STRUCT{Mathematische Algorithmen}{pq-Formel}{ 
  \ACTION{Einlesen der Koeffizienten $a,b,c$ der quadratischen Gleichung $ax^{2}+bx+c=0$}
  \ACTION{Diskriminate bestimmen: ${\displaystyle D=\left(\frac{b}{2a}\right)^{2}-\frac{c}{a}}$\qquad (entspricht dem Radikanden)}
  \IF{($D\geq0$) ?}
    \THEN{\ACTION{${\displaystyle x_{1/2}=-\frac{b}{2a}\pm\sqrt{D}}$}
    }
    \ELSE{\ACTION{keine Lösung in $\mathds{R}$
    }
   }\ENDIF
}
\end{lstlisting}

\subsection{Bisektionsmethode}

Diese stellt eine elegante Methode zur numerischen Bestimmung von Nullstellen dar.
\end{document}
