\section{Verzweigungen und bedingte Schleifen} \subsection{if-Verzweigung (Befehl ausführen, wenn ...)} Beim Programmieren kommt es häufig vor, dass das Programm auf verschiedene Situationen unterschiedlich reagieren soll. Man denke an einfach die Steuerung einer Figur, deren Richtung von unterschiedlichen Tasten abhängt.\\ Dafür benötigt man die \textit{if}-Anweisung. Diese prüft, ob eine Bedingung erfüllt ist ("`if"' bedeutet im Englischen "`wenn"' oder "`falls"'). In Scratch steht hier der Block \begin{scratch}\ifopempty{~}{~}\end{scratch} zur Verfügung. \begin{bsp} Herr Drechsler hat den Computer so programmiert, dass er ihn erkennt und begrüßt, wenn er sich mit seinem Vornamen vorstellt. Jeder andere wird nicht begrüßt. Bei einer \textit{if}-Anweisung prüft der Computer die Bedingung, ob der Wert der Variable \textcolor{blue}{\textbf{Antwort}} gleich "`Fabian"' ist. Nur wenn dies der Fall ist, führt er den Code innerhalb der Anweisung aus und sagt die Begrüßung.\\ \begin{center} \begin{scratch} \start \blocksensing{frage \ovalnum{Whats your name?} und warte} \ifop{ \booloperator{\ovalsensing{Antwort} = \ovalnum{Fabian}},}{ \blocklook{sage \ovalnum{Hallo Fabian}} } \end{scratch} \end{center} \end{bsp} \begin{aufgabe} Schreibe einen Begrüßungsprogramm für dich selbst (Es darf gerne komplexer sein.) \end{aufgabe} Mit einer \textit{if}-Anweisung sagt man dem Computer, dass er den Block nur ausführen soll, wenn die Bedingung erfüllt ist. Wenn diese nicht erfüllt ist, dann wird der Block komplett übersprungen. \\ Man kann in einer if-Anweisung auch direkt angeben, was der Computer machen soll, wenn die Bedingung nicht erfüllt ist. Das ist eine \textit{if-else}-Anweisung ("`else"' bedeutet im Englischen "`andernfalls"').\\ Bei einer \textit{if-else}-Anweisung wählt der Computer eine von zwei Alternativen aus. Je nachdem, ob die Bedingung erfüllt ist führt er den ersten Codeblock aus, andernfalls den zweiten. \pagebreak \begin{bsp} Das folgende Programm ähnelt dem im vorherigen Beispiel. Hier wird direkt dem Computer mitgeteilt, was er tun soll, wenn die Bedingung \booloperator{\ovalsensing{Antwort} = \ovalnum{Fabian}} nicht erfüllt ist.\\ \begin{center} \begin{scratch} \centering \start \blocksensing{frage \ovalnum{Whats your name?} und warte} \ifelseop{ \booloperator{\ovalsensing{Antwort} = \ovalnum{Fabian}},} { \blocklook{sage \ovalnum{Hallo Fabian} für \ovalnum{2} Sekunden} \blocklook{sage \ovalnum{Schön, dass du da bist.}}} {\blocklook{sage \ovalnum{Leider kenne ich dich nicht.}} } \end{scratch} \end{center} \end{bsp} \subsection{EXKURS: Logische Operatoren} Mir der if-Anweisung (\begin{scratch}\ifopempty{~}{~}\end{scratch}) prüfst du, ob eine Bedingung erfüllt ist. Wenn sie erfüllt ist, führt der Computer die Anweisungen im Körper der if-Anweisung aus. In manchen Fällen, soll etwas ausgeführt werden, wenn die Bedingung nicht erfüllt ist. Oder der Computer soll die Anweisung nur ausführen, wenn zwei Bedingungen gleichzeitig erfüllt sind. Dies geschieht in einer Programmiersprache mit logischen Operatoren, die du in diesem Kapitel kennen lernst.\\ \subsubsection*{Negation} Das Gegenteil der Behauptung "`die Wand hat die Farbe blau"' lautet "`die hat nicht die Farbe blau"'.\\ Das Gegenteil der Behauptung "`x ist unterschiedlich von 5"' lautet "`x ist gleich 5"'.\\ Das Gegenteil von "`$x<5$"' lautet "`$x\geq5$"'. Statt dem Begriff "`Gegenteil" verwendet man das Wort "`Negation"'. Wir sagen also "`$x\geq5$"' ist die Negation von "`$x<5$"'.\\ \subsubsection*{Wahrheitstabellen} Mit "`und"' und "`oder"' kann man zwei Behauptungen A und B verknüpfen und so komplexe Aussagen treffen. Um alle möglichen Varianten der Verknüpfungen übersichtlich darzustellen, verwendet man sogenannte Wahrheitstabellen. Für zwei Behauptungen A und B gibt es in einer Wahrheitstabelle genau 4 Möglichkeiten: \begin{enumerate} \setlength\itemsep{0em} \item Beide Behauptungen A und B gelten. \item A gilt und B nicht. \item A gilt und B nicht. \item Beide Behauptungen A und B gelten nicht. \end{enumerate} Jede dieser vier Möglichkeiten entspricht einer Zeile in der Wahrheitstabelle: \begin{tabular}{ccc} \vspace{1cm} \begin{tabular}{|c|c|} \hline \textbf{Behauptung A} & \textbf{Behauptung B}\\ \hline \cellcolor{green}gilt & \cellcolor{green}gilt \\ \hline \cellcolor{green}gilt & \cellcolor{red}gilt nicht \\ \hline \cellcolor{red}gilt nicht & \cellcolor{green}gilt\\ \hline \cellcolor{red}gilt nicht & \cellcolor{red}gilt nicht \\ \hline \end{tabular} & \begin{tabular}{c} Verknüpfung\\ $\longrightarrow$\\ \end{tabular} & \begin{tabular}{|c|c|} \hline \textbf{A \underline{oder} B} & \textbf{A \underline{und} B} \\ \hline \cellcolor{green}gilt & \cellcolor{green}gilt \\ \hline \cellcolor{green}gilt & \cellcolor{red}gilt nicht \\ \hline \cellcolor{green}gilt & \cellcolor{red}gilt nicht \\ \hline \cellcolor{red}gilt nicht & \cellcolor{red}gilt nicht \\ \hline \end{tabular} \\ \end{tabular}\\ In der den ersten beiden Spalten sind alle möglichen Kombination von A und B aufgelistet. Die dritte Spalte gibt die Verknüpfung der ersten beiden durch den Operator "`A oder B"' wieder. Diese gilt immer dann, wenn mindestens eine der beiden Behauptungen A oder B gilt.Nur im letzten Fall, wenn beide Behauptungen nicht gelten gilt "`A oder B"' ebenfalls nicht.\\ Die letzte Spalte zeigt die Verknüpfung "`A und B"', Diese Verknüpfung gilt nur, wenn sowohl A als auch B gilt, d.h. beide Bedingungen müssen erfüllt sein. In allen anderen Fällen gilt "`A und B"' nicht. \subsubsection*{Bedingungen verknüpfen in Scratch} Bislang wurde in einer if-Anweisung genau eine Bedingung geprüft. In manchen Fällen ist es aber notwendig, dass mehrere Bedingungen mit einander verknüpft werden. Beispielsweise in einem Quiz mit einer Multiple-Choice-Frage die zwei richtige Antworten besitzt. Dort sollte die Antwort nur als richtig gewertet werden, wenn beide Antworten gegeben wurde. Dies lässt sich in Scratch über die Operatoren \booloperator{\boolempty und \boolempty} und \booloperator{\boolempty oder \boolempty} realisieren.\\ \subsection{while-Schleifen} Mit if-Schleifen lässt man den Computer nur Tätigkeiten ausführen, wenn eine definierte Bedingung erfüllt ist. Mit Wiederholungsschleifen kannst du den Computer einen Befehl eine bestimmte Anzahl oft wiederholen lassen. Manchmal ist es wünschenswert, dass der Computer einen Befehl ausführt bist eine gewisse Bedingung erfüllt ist. Dafür gibt es die sogenannten \textit{while}-Schleifen.\\ Die \textit{while}-Schleife wiederholt eine Tätigkeit, solange die Bedingung erfüllt ist. \textbf{Vorsicht:} Wenn die Bedingung immer gilt, läuft die Schleife einfach ewig weiter.\\ \textit{While}-Schleifen eignen sich besonders dann, wenn man vorher nicht weis, wie oft eine Schleife durchlaufen werden soll. \begin{bsp} Mit dieser \textit{while}-Schleife lassen wir die Figur solange nach rechts laufen, bis die Grenze für die X-Koordinate(Das Ende der Bühne) erreicht ist . \begin{center} \begin{scratch} \start \setxy{-100}{0} \while{\booloperator{\ovalmove{x-Position} $<$ \ovalnum{150}}}{\movex{1}} \end{scratch} \end{center} \end{bsp} \subsection{Neue Befehle} Beim Programmieren braucht man die Möglichkeit, je nach Situation verschiedene Tätigkeiten auszuführen. Die Situation wird durch die Werte einer Variablen beschrieben. Der Computer muss in Abhängigkeit des Wertes einer Variablen eine Entscheidung treffen. Das ermöglichen die Anweisungen \textit{if,else,while}.\\ In diesem Kapitel hast du folgende Befehle kennengelernt: \begin{center} \begin{tabular}{|m{5cm}|m{8cm}|c} \hline \tabbild[width=\linewidth]{"images_eps/if"} & Die Anweisungen im Körper zu \textit{if} werden nur dann ausgeführt, wenn die Bedingung erfüllt ist. Zwei Bedingungen können mit den "`und"' oder "`oder"' Operatoren verknüpft werden. \\ \hline \tabbild[width=\linewidth]{"images_eps/ifelse"} & Es wird entweder der Codeblock 1 oder Codeblock 2 ausgeführt. Wenn die Bedingung erfüllt ist Codeblock 1, ansonsten Codeblock 2. \\ \hline \tabbild[width=\linewidth]{"images_eps/while"} & Solange die Bedingung erfüllt ist, wird der Körper in der \textit{while}-Schleife wiederholt. Nach jedem Durchlauf der Schleife prüft der Computer, ob die Bedingung erfüllt ist. Falls ja, wird die Schleife nochmals wiederholt. \\ \hline \tabbild[width=\linewidth]{"images_eps/whileinfinity"} & Diese \textit{while}-Schleife läuft endlos. Bis das Programm über das Stop-Symbol beendet wird. Sehr wichtig bei der Steuerung von Figuren oder wenn Prozesse immer laufen sollen. \\ \hline \end{tabular} \end{center} \pagebreak \subsection{Teste dich selbst} \subsubsection*{Wissensfragen} \begin{enumerate} \item Wie kann man erreichen, dass ein Programm einen Befehl nur unter gewissen Bedingungen ausführt? \notes[10pt]{1}{\textwidth} \item Wie kann man einem Programm die Möglichkeit geben, sich für eine von zwei möglichen Alternativen zu entscheiden? \notes[10pt]{1}{\textwidth} \item Was passiert, wenn die Bedingung einer \textit{while}-Schleife erfüllt ist? Was passiert wenn sie nicht erfüllt ist? Was hat das mit der Bedeutung des englischen Wortes "`while"' zu tun? \notes[10pt]{3}{\textwidth} \item Ist die zusammengesetzte Bedingung \booloperator{\booloperator{\ovalvariable{x} $>$ \ovalnum{0}} oder \booloperator{\ovalvariable{x} $<$ \ovalnum{9}}} auch erfüllt, wenn der Wert von x gleich 4 ist. \notes[10pt]{1}{\textwidth} \end{enumerate} \subsubsection*{Programmieraufgaben} \begin{aufgabe} Das folgende Programm fordert auf eine Zahl einzugeben. Was macht das Programm mit dieser Zahl? Was gibt das Programm aus, wenn man $10$ eingibt. Stelle vor dem Programmieren zuerst eine Vermutung auf. \begin{center} \begin{multicols}{2} \begin{figure}[H] \centering \includegraphics[width=0.7\linewidth]{images_eps/ifaufgabe} \label{fig:ifaufgabe} \end{figure} \columnbreak \begin{tikzpicture} \draw[step=0.5cm,color=gray,thin,xshift=0.5cm,yshift=0.5cm] (0,0) grid +(85mm,75mm); \end{tikzpicture} \end{multicols} \end{center} \end{aufgabe} \begin{aufgabe} Entwickle ein kleines Quiz-Programm. Das Programm stellt zuerst eine Frage. Dann prüft es, ob die Antwort richtig oder falsch ist. Wenn die Antwort richtig ist, gibt das Programm "`richtig"' aus, ansonsten "`falsch"'.\\ Schreibe das Programm so, dass es nacheinander mehrere verschiedene Fragen stellt (mindestens drei). Nach jeder Frage prüft, das Programm mit einer \textit{if}-Anweisung, ob die Eingabe richtig ist. Erst danach kommt die nächste Frage.\\ Das Programm soll in einer Variablen mitzählen, wie viele richtige Antworten bisher gegeben wurden.\\ Optional: Gestalte drei Bühnenbilder für das Quiz, eines für die Fragen, eines für eine richtige und eines für eine falsche Antwort. Die Bühnenbilder können dann jeweils geändert werden. \end{aufgabe}