\documentclass[]{schuleab}
\usepackage[utf8]{inputenc}
\usepackage{schulinf}

% Dieses Dokument ist in der Zusammenarbeit von Informatikreferendaren und
% ehemaligen Informatikreferendaren der Studienseminare (heute ZfsL) Arnsberg,
% Hamm und Solingen entstanden.
%
% Das Dokument steht unter der Lizenz: Creative Commons by-nc-sa Version 4.0
% http://creativecommons.org/licenses/by-nc-sa/4.0/deed.de
%
% Nach dieser Lizenz darf das Dokument beliebig kopiert und bearbeitet werden,
% sofern das Folgeprodukt wiederum unter gleichen Lizenzbedingungen vertrieben
% und auf die ursprünglichen Urheber verwiesen wird.
% Eine kommerzielle Nutzung ist ausdrücklich ausgeschlossen.
%
% Die Namensnennung durch einen Verweis und die Lizenzangabe der ursprünglichen
% Urheber auf den Materialien für Schülerinnen und Schüler ist erforderlich.
%
% Die Sammlung der Dokumente steht unter
% http://ddi.uni-wuppertal.de/material/materialsammlung/
% zur Verfügung.
%
% Das LaTeX-Paket zum Setzen der Dokumente der Sammlung steht
% unter  http://www.ctan.org/pkg/schule
% zur Verfügung.

\usepackage[pdfauthor={Referendare der Informatikfachseminare Arnsberg, Hamm und Solingen}]{hyperref}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\tcbset{listing engine=listings}
\tcbuselibrary{breakable}
\tcbuselibrary{skins}
\includexmp{lizenz}
\cclizenz{byncsaeu}
\footerQRLink{materialsammlung_qr_url.pdf}

\svnid{$Id: ab_07_verzweigungen.tex 1579 2016-09-27 16:34:37Z humbert $}

\dokName{Verzweigungen in Python}
\jahrgang{EF}

\def\bodydir{./}

\begin{document}



\section*{Verzweigungen}

Algorithmen, wie die Methoden der Klasse \texttt{Spiel}, müssen nicht immer nur lineare Abfolgen von Anweisungen beinhalten, sondern können auch Wahlmöglichkeiten enthalten. Man spricht hier üblicherweise von \textbf{Verzweigungen}. Eine Verzweigung gibt abhängig von einer Bedingung an, welcher von zwei Algorithmenabschnitten im Folgenden durchlaufen werden soll. Durch eine Verschachtelung von Verzweigungen können auch mehr als zwei Möglichkeiten berücksichtigt werden. 

\subsection*{Darstellung in Struktogrammen}
Eine verschachtelte Verzweigung findet sich auch bei der Methode \texttt{gibSieger()} und könnte wie folgt aussehen. Ist die Bedingung \texttt{punkteA > punkteB} erfüllt, so wird der linke Abschnitt abgearbeitet, ansonsten der rechte. Im rechten Abschnitt wird dann erneut zwischen zwei Wahlmöglichkeiten unterschieden. 

\begin{center}
% \scalebox{0.8}{
	\begin{struktogramm}(130,30)[gibSieger()]
		\ifthenelse{3}{7}{punkteA > punkteB}{Ja}{Nein}
			\assign[20]{mannschaftA zurückgeben}
		\change
			\ifthenelse{6}{4}{punkteB > punkteA}{Ja}{Nein}
				\assign[11]{mannschaftB zurückgeben}
			\change
				\assign[11]{None zurückgeben}
			\ifend
		\ifend
	\end{struktogramm}
%	}
	 \newline
\end{center}

\vspace*{0.5cm}

\subsection*{Syntax in Python} 
In Python dienen die Schlüsselwörter \textbf{if} (wenn), und \textbf{else} (sonst) zur Beschreibung einer einfachen Verzweigung. Die Reihenfolge kann man im folgenden Syntaxdiagramm sehen: 

\vspace*{0.1cm}

\begin{tikzpicture}[syntaxdiagramm, node distance=5mm and 2mm]
	\node {};
	\node [terminal] {if};
	\node [nonterminal] {Bedingung};
	\node [terminal] {:};
	\node (start1) [point] {};
	\node (end1)[point,xshift=30mm] {};
	\node [terminal] {else};
	\node [terminal] {:};
	\node (start2) [point] {};
	\node (end2)[point,xshift=30mm] {};
 	\node [endpoint] {};

	{[start chain=1]
		\chainin (start1);
		\node [point, below=of start1] {};
		\node [nonterminal] {Anweisungen};
		\node [point, below=of end1] {};
 		\node [endpoint, on chain=going above] {};
	}
	{[start chain=2]
		\chainin (start2);
		\node [point, below=of start2] {};
		\node [nonterminal] {Anweisungen};
		\node [point, below=of end2] {};
 		\node [endpoint, on chain=going above] {};
	}
\end{tikzpicture} 

\vspace*{0.1cm}

Sollen mehr als zwei Möglichkeiten berücksichtigt werden, muss man eine verschachtelte Verzweigung verwenden. Dafür gibt es das Schlüsselwort \textbf{elif} (sonst, wenn). Im folgenden Syntaxdiagramm wird von drei Möglichkeiten ausgegangen. Durch weitere Verschachtelungen können allerdings auch noch mehr Möglichkeiten berücksichtigt werden. 

\vspace*{0.1cm}

\begin{tikzpicture}[syntaxdiagramm]
	\node [] {};
	\node [terminal] {if};
	\node [nonterminal] {Bedingung};
	\node [terminal] {:};
	\node [nonterminal] {Anweisungsblock};
	\node (ersteReiheEnde) [point] {};
	\node (ersteReiheEndeUnten) [point, below=of ersteReiheEnde] {};
	\node (zweiteReiheStartOben) [point, left=of ersteReiheEndeUnten, xshift=-75mm] {};
	\node (zweiteReiheStart) [point, below=of zweiteReiheStartOben] {};
	{
		[start chain=elif going right]
			\chainin (zweiteReiheStart);
			\node [terminal] {elif};
			\node [nonterminal] {Bedingung};
			\node [terminal] {:};
			\node [nonterminal] {Anweisungsblock};
			\node (elifEnde) [point] {};
			\node (elifEndeOben) [point, above=of elifEnde] {};
			\draw[->,left] (elifEndeOben) -- (ersteReiheEndeUnten);
	}
	\node (dritteReiheStart) [point, below=of zweiteReiheStart, yshift=-5mm] {};
	\node (vierteReiheStart) [point, below=of dritteReiheStart, yshift=-5mm] {};
	\node (vierteReiheEnde) [point, xshift=66mm] {};
	{
		[start chain=else going right]
			\chainin (dritteReiheStart);
			\node [terminal] {else};
			%\node [nonterminal] {Bedingung};
			\node [terminal] {:};
			\node (elseEnde) [nonterminal] {Anweisungsblock};
			\draw[->] (elseEnde) -| (vierteReiheEnde);
	}
	\node (ende) [endpoint] {};
\end{tikzpicture}

Das oben angegebene Struktogramm der Methode \texttt{gibSieger()} könnte in Python wie folgt implementiert werden: 

\begin{tcblisting}{colback=yellow!5,listing only, fonttitle=\bfseries,
listing options={language=Python,columns=fullflexible,numbers=left, numbersep=2mm,numberstyle=\tiny\color{green!50!black},keywordstyle=\color{green!50!black},basicstyle=\bfseries
}}
def gibSieger(self):
  if self.punkteA > self.punkteB:
    return self.mannschaftA
  elif self.punkteB > self.punkteA:
    return self.mannschaftB
  else:
    return None
\end{tcblisting}
\subsection*{Arbeitsaufträge}

\begin{enumerate}	
	\item \label{verA1}  Integrieren Sie die oben beschriebene Methode \texttt{gibSieger()} in ihre Klasse \texttt{Spiel}.

	\textbf{WICHTIG:} Die Attributbezeichner Ihrer Klasse \texttt{Spiel} können sich von den oben verwendeten (punkteA, punkteB, mannschaftA, mannschaftB) unterscheiden! Passen Sie die Methode bei der Implementierung entsprechend an.
	
\item \label{verA2}  Testen Sie die Methode, indem Sie sich von einer ausgewählten Spielbegegnung mit einer \texttt{print}-Anweisung den Sieger ausgeben lassen. 

\item \label{verA3}  Implementieren Sie analog zur Methode \texttt{gibSieger()} die Methode \texttt{gibVerlierer()}, die ebenfalls Teil der Klasse \texttt{Spiel} ist.

\item \label{verA4}  Implementieren Sie die Methoden \texttt{gibPunkteSieger()} und \texttt{gibPunkteVerlierer()} innerhalb Klasse \texttt{Spiel}. Im Gegensatz zu den beiden Methoden aus Aufgabe~\ref{verA1} und Aufgabe~\ref{verA3} sollen nicht die Mannschaften zurückgegeben werden, sondern die erzielte Punktzahl des Siegers bzw. des Verlierers. 

\item \label{verA5}  Testen Sie die nun alle Methoden auf einmal, indem Sie sich von einer ausgewählten Spielbegegnung mit \texttt{print}-Anweisungen den Sieger mit seinen erzielten Punkten und den Verlierer mit seinen erzielten Punkten ausgeben lassen. 
	
\end{enumerate}

\end{document}

