\begin{slide}{Wiederholungen}

\begin{itemize}
\item
  Maschine, Assembler: (un-)bedingter Sprung
\item
  strukturiert: Schleifen
\end{itemize}

Designfragen für Schleifen:
\begin{itemize}
\item
  wie wird Schleife gesteuert? (Bedingung, Zähler, Daten)
\item
  an welcher Stelle in der Schleife findet Steuerung statt
  (Anfang, Ende, dazwischen, evtl. mehreres)
\end{itemize}

\end{slide}

\begin{slide}{Schleifen steuern durch\dots}

\begin{itemize}
\item
  Bedingung
\begin{verbatim}
while ( x > 0 ) { if ( ... ) { x = ... } ... }
\end{verbatim}
\item
  Zähler
\begin{verbatim}
for p in 1 .. 10 loop .. end loop;
\end{verbatim}
\item
  Daten
\begin{verbatim}
Collection<String> c 
    = new LinkedList<String> ();
for (String s : c) { ... }
\end{verbatim}
\end{itemize}

\end{slide}

\begin{slide}{Zählschleifen}

\begin{itemize}
\item
Idee: vor Beginn steht Anzahl der Durchläufe fest.
\item
dann erhält man die Klasse der primitiv rekursiven Funktionen,
die terminieren immer!
\end{itemize}
richtig realisiert ist das nur in Ada:
\begin{verbatim}
for p in 1 .. 10 loop ... end loop;
\end{verbatim}
\begin{itemize}
\item
  Zähler \verb|p| wird implizit deklariert
\item
  Zähler ist im Schleifenkörper konstant
\end{itemize}

Vergleiche (beide Punkte) mit Java, C++, C
\end{slide}


\begin{slide}{Schleifen mit Bedingungen}

\begin{itemize}
\item
  das ist die allgemeinste Form, ergibt
  (partielle) rekursive Funktionen,
\item
  die terminieren nicht immer
\end{itemize}

Steuerung am Anfang oder Ende:
\begin{verbatim}
while Bedingung Anweisung;

do Anweisung while Bedingung;
\end{verbatim}
  
\end{slide}

\begin{slide}{Abarbeitung von Schleifen}

vorzeitiges Verlassen \dots
\begin{itemize}\itemsep 1pt\parskip 1pt
\item
  der Schleife
\begin{verbatim}
while ( B1 ) { 
   A1;
   if ( B2 ) break;
   A2;
}
\end{verbatim}
\item
  des Schleifenkörpers
\begin{verbatim}
while ( B1 ) { 
   A1;
   if ( B2 ) continue;
   A2;
}
\end{verbatim}
\end{itemize}

\end{slide}

\begin{slide}{Geschachtelte Schleifen}

manche Sprachen gestatten Markierungen
(Labels) an Schleifen,
auf die man sich in break beziehen kann:

\begin{verbatim}
foo : for (int i = ...) {
  bar : for (int j = ...) {

    if (...) break foo;

  }
}
\end{verbatim}

Wie könnte man das simulieren?
  
\end{slide}
