Fixed programming chapter

This commit is contained in:
Jan Benda 2015-11-07 11:39:30 +01:00
parent 3417248f72
commit 4804946112
4 changed files with 100 additions and 108 deletions

View File

@ -1,7 +1,7 @@
BASENAME=scientificcomputing-script BASENAME=scientificcomputing-script
SUBDIRS=designpattern statistics bootstrap regression likelihood pointprocesses SUBDIRS=designpattern statistics bootstrap regression likelihood pointprocesses
#programming # programming
SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex) SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex)
pdf : chapters $(BASENAME).pdf pdf : chapters $(BASENAME).pdf

View File

@ -7,3 +7,8 @@ fprintf('number of dimensions (rank) of size_of_a: %i\n', length(size_of_a))
% get the value of the second element of size_of_a % get the value of the second element of size_of_a
fprintf('number of entries in the 2nd dimesion of a: %i\n', size_of_a(2)) fprintf('number of entries in the 2nd dimesion of a: %i\n', size_of_a(2))
%% Uebersichtliche Alternative?
s = size(a); % Speicher den Rueckgabewert von size() in einer Variablen
s(2) % Inhalt der zweiten Zahl, d.h. Laenge der 2. Dimension
size(a,2) % Kurze Alternative

View File

@ -24,6 +24,6 @@ ax.set_xlabel("time [s]")
ax.set_ylabel("intensity") ax.set_ylabel("intensity")
ax.legend(fontsize=8) ax.legend(fontsize=8)
fig.tight_layout() fig.tight_layout()
fig.savefig("images/logicalIndexingTime.pdf") fig.savefig("logicalIndexingTime.pdf")

View File

@ -53,7 +53,7 @@ Listing zeigt zwei M\"oglichkeiten:
Die Zeile 1 kann etwa so gelesen werden:''Erzeuge eine Variable mit Die Zeile 1 kann etwa so gelesen werden:''Erzeuge eine Variable mit
dem Namen y und weise ihr einen leeren Wert zu.'' Das dem Namen y und weise ihr einen leeren Wert zu.'' Das
Gleichheitszeichen ist der sogenannte Gleichheitszeichen ist der sogenannte
\textit{Zuweisungsoperator}. Zeile 5 definiert eine Variable x, der \emph{Zuweisungsoperator}. Zeile 5 definiert eine Variable x, der
nun der Zahlenwert 38 zugewiesen wird. Da \matlab{}, wenn nicht anders nun der Zahlenwert 38 zugewiesen wird. Da \matlab{}, wenn nicht anders
angegeben immer den ``double'' Datentypen benutzt, haben beide angegeben immer den ``double'' Datentypen benutzt, haben beide
Variablen diesen Datentyp. Variablen diesen Datentyp.
@ -125,7 +125,7 @@ interpretiert werden. Die wichtigsten Datentpyen sind folgende:
\item \textit{double} - Flie{\ss}kommazahlen. Im Gegensatz zu den reelen Zahlen, die durch diesen Datentyp dargestellt werden, sind sie abz\"ahlbar. \item \textit{double} - Flie{\ss}kommazahlen. Im Gegensatz zu den reelen Zahlen, die durch diesen Datentyp dargestellt werden, sind sie abz\"ahlbar.
\item \textit{complex} - Komplexe Zahlen. \item \textit{complex} - Komplexe Zahlen.
\item \textit{logical} - Boolesche Werte, die als wahr \item \textit{logical} - Boolesche Werte, die als wahr
(\textit{true}) oder falsch (\textit{false}) interpretiert werden. (\code{true}) oder falsch (\code{false}) interpretiert werden.
\item \textit{char} - ASCII Zeichen \item \textit{char} - ASCII Zeichen
\end{itemize} \end{itemize}
@ -166,16 +166,15 @@ ben\"otigen.
% \begin{definition}[Vektoren und Matrizen] % \begin{definition}[Vektoren und Matrizen]
Vektoren und Matrizen sind die wichtigsten Datenstrukturen in Vektoren und Matrizen sind die wichtigsten Datenstrukturen in
\matlab. In anderen Programmiersprachen spricht man von ein- \matlab. In anderen Programmiersprachen heissen sie ein-
bzw. mehrdimensionalen Feldern. Felder sind Datenstrukturen, die bzw. mehrdimensionalen Felder. Felder sind Datenstrukturen, die
mehrere Werte des geleichen Datentyps in einer Variablen mehrere Werte des geleichen Datentyps in einer Variablen vereinen. Da
vereinen. Da Matalb seinen Ursprung in der Verarbeitung von Matalb seinen Ursprung in der Verarbeitung von mathematischen Vektoren
mathematischen Vektoren und Matrizen hat, werden sie hier auch so und Matrizen hat, werden sie hier auch so genannt.
genannt.
\matlab{} macht keinen Unterschied zwischen Vektoren und Matrizen. \matlab{} macht keinen Unterschied zwischen Vektoren und Matrizen.
Vektoren sind 2-dimsensionale Matrizen bei denen eine Dimension die Gr\"o{\ss}e 1 Vektoren sind 2-dimensionale Matrizen bei denen eine Dimension die
hat. Gr\"o{\ss}e 1 hat.
% \end{definition} % \end{definition}
@ -268,7 +267,7 @@ Vektors zugegriffen werden kann. Dabei spielt es keine Rolle, ob es
sich um einen Zeilen- oder Spaltenvektor handelt. \textbf{Achtung!} sich um einen Zeilen- oder Spaltenvektor handelt. \textbf{Achtung!}
Anders als viele andere Sprachen beginnt \matlab{} mit dem Index Anders als viele andere Sprachen beginnt \matlab{} mit dem Index
1. Die Listings \ref{arrayListing4} und \ref{arrayListing5} zeigen wie 1. Die Listings \ref{arrayListing4} und \ref{arrayListing5} zeigen wie
man mit dem Index auf die Inhalte zugreifen kann. mit Indexen auf die Inhalte eines Vektors zugegriffen werden kann.
\begin{lstlisting}[label=arrayListing4, caption={Zugriff auf den Inhalt von Vektoren I}] \begin{lstlisting}[label=arrayListing4, caption={Zugriff auf den Inhalt von Vektoren I}]
>> a = (11:20); >> a = (11:20);
@ -340,7 +339,7 @@ Mit Vektoren kann sehr einfach gerechnet werden. Listing
Wird ein Vektor mit einem skalaren Wert verrechnet, dann ist das Wird ein Vektor mit einem skalaren Wert verrechnet, dann ist das
problemlos m\"oglich. Bei der Multiplikation (Zeile 10), der Division problemlos m\"oglich. Bei der Multiplikation (Zeile 10), der Division
(Zeile 14) und auch der Potenzierung mu{\ss} mit vorangestellem '.' (Zeile 14) und auch der Potenzierung mu{\ss} mit vorangestellem '.'
klar gemacht werden, dass es sich um eine \textit{elementweise} klar gemacht werden, dass es sich um eine \emph{elementweise}
Verarbeitung handeln soll. F\"ur diese elementweisen Operationen kennt Verarbeitung handeln soll. F\"ur diese elementweisen Operationen kennt
\matlab{} die Operatoren \code{.*}, \code{./} und \code{.\^}. Die \matlab{} die Operatoren \code{.*}, \code{./} und \code{.\^}. Die
einfachen Operatoren \code{*}, \code{/} und \code{\^} sind mit den einfachen Operatoren \code{*}, \code{/} und \code{\^} sind mit den
@ -571,17 +570,17 @@ durchgef\"uhrt werden soll.
\section{Boolesche Operationen} \section{Boolesche Operationen}
Boolesche Ausdr\"ucke sind Anweisungen, die zu \textit{wahr} oder Boolesche Ausdr\"ucke sind Anweisungen, die zu \emph{wahr} oder
\textit{falsch} ausgewertet werden. Man kennt sie z.B. aus der \emph{falsch} ausgewertet werden. Man kennt sie z.B. aus der
Mengenlehre. In der Programmierung werdens sie eingesetzt, um z.B. die Mengenlehre. In der Programmierung werdens sie eingesetzt, um z.B. die
Beziehung zwischen Entit\"aten zu testen. Hierzu werden die Beziehung zwischen Entit\"aten zu testen. Hierzu werden die
\textit{relationalen Operatoren} (\code{>, <, ==, !}, gr\"o{\ss}er \emph{relationalen Operatoren} (\code{>}, \code{<}, \code{==},
als, kleiner als, gleich und nicht) eingesetzt. Mehrere Ausdr\"ucke \code{!}, gr\"o{\ss}er als, kleiner als, gleich und nicht)
werden mittels der \textit{logischen Operatoren} (\code{\&, |}, UND, eingesetzt. Mehrere Ausdr\"ucke werden mittels der \textit{logischen
ODER ) verkn\"upft. Sie sind f\"ur uns nicht nur wichtig um Operatoren} (\code{\&}, \code{|}}, UND, ODER ) verkn\"upft. Sie sind f\"ur
Codeabschnitte bedingt auszuf\"uhren (Verzweigungen, uns nicht nur wichtig um Codeabschnitte bedingt auszuf\"uhren
\ref{controlstructsec}) sondern auch um aus Vektoren und Matrizen (Verzweigungen, \ref{controlstructsec}) sondern auch um aus Vektoren
bequem Elemente auszuw\"ahlen (logisches Indizieren, und Matrizen bequem Elemente auszuw\"ahlen (logisches Indizieren,
\ref{logicalindexingsec}). Die folgenden Tabellen zeigen die \ref{logicalindexingsec}). Die folgenden Tabellen zeigen die
Wahrheitstabellen f\"ur das logische UND (\ref{logicalandor}, links) Wahrheitstabellen f\"ur das logische UND (\ref{logicalandor}, links)
aund das logische ODER (\ref{logicalandor}, rechts). Es werden die aund das logische ODER (\ref{logicalandor}, rechts). Es werden die
@ -589,8 +588,7 @@ Aussagen A und B mit dem Operator verkn\"upft. Beim logischen UND ist
der gesamte Ausdruck nur dann wahr, wenn beide Ausdr\"ucke sich zu der gesamte Ausdruck nur dann wahr, wenn beide Ausdr\"ucke sich zu
wahr auswerten lassen. wahr auswerten lassen.
\begin{table}[tp]
\begin{table}[]
\caption{Wahrheitstabellen logisches UND (links) und logisches ODER (rechts).}\label{logicalandor} \caption{Wahrheitstabellen logisches UND (links) und logisches ODER (rechts).}\label{logicalandor}
\begin{minipage}[t]{0.4\textwidth} \begin{minipage}[t]{0.4\textwidth}
\begin{tabular}{llll} \begin{tabular}{llll}
@ -610,8 +608,8 @@ wahr auswerten lassen.
\end{minipage} \end{minipage}
\end{table} \end{table}
\noindent Anders ist das beim logischen ODER. Hier ist der gesamte Anders ist das beim logischen ODER. Hier ist der gesamte
Ausdruck wahr, wenn sich der eine \textit{oder} der andere Ausdruck zu Ausdruck wahr, wenn sich der eine \emph{oder} der andere Ausdruck zu
wahr auswerten l\"a{\ss}t. Tabelle \ref{logicaloperators} zeigt die wahr auswerten l\"a{\ss}t. Tabelle \ref{logicaloperators} zeigt die
logischen Operatoren, die in \matlab{} definiert sind. Zu bemerken logischen Operatoren, die in \matlab{} definiert sind. Zu bemerken
sind hier noch die \code{\&\&} und \code{||} Operatoren. Man kann sind hier noch die \code{\&\&} und \code{||} Operatoren. Man kann
@ -641,10 +639,10 @@ verf\"ugbar.
\end{center} \end{center}
\end{table} \end{table}
\noindent Um Werte miteinander zu vergleichen gibt es die \textit{relationalen Um Werte miteinander zu vergleichen gibt es die \textit{relationalen
Operatoren} (Tabelle \ref{relationaloperators}). Mit ihnen kann man Operatoren} (Tabelle \ref{relationaloperators}). Mit ihnen kann man
auf Dinge wie Gleicheit (\code{==}) gr\"o{\ss}er oder kleiner als auf Dinge wie Gleicheit (\code{==}) gr\"o{\ss}er oder kleiner als
(\code{>, <}) testen. (\code{>}, \code{<}) testen.
\begin{table}[th] \begin{table}[th]
\caption{\label{relationaloperators} \caption{\label{relationaloperators}
@ -664,7 +662,7 @@ auf Dinge wie Gleicheit (\code{==}) gr\"o{\ss}er oder kleiner als
\end{center} \end{center}
\end{table} \end{table}
\noindent Das Ergebnis eines Booleschen Ausdrucks ist immer vom Datentyp Das Ergebnis eines Booleschen Ausdrucks ist immer vom Datentyp
\textit{logical}. Man kann jede beliebige Variable zu wahr oder falsch \textit{logical}. Man kann jede beliebige Variable zu wahr oder falsch
auswerten indem man in den Typ \textit{logical} umwandelt. Dabei auswerten indem man in den Typ \textit{logical} umwandelt. Dabei
werden von \matlab{} alle Werte, die nicht 0 sind als wahr werden von \matlab{} alle Werte, die nicht 0 sind als wahr
@ -733,7 +731,7 @@ nun die Werte an den Stellen zur\"uck, an denen der logische Vektor
\textit{wahr} ist (Listing \ref{logicalindexing1}). \textit{wahr} ist (Listing \ref{logicalindexing1}).
\begin{lstlisting}[caption={Beispiel Logischen Indizieren.}, label=logicalindexing1] \begin{lstlisting}[caption={Beispiel logisches Indizieren.}, label=logicalindexing1]
>> x = randn(10, 1); >> x = randn(10, 1);
>> % in zwei Schritten >> % in zwei Schritten
>> x_smaller_zero = x < 0; % logischer vektor >> x_smaller_zero = x < 0; % logischer vektor
@ -755,7 +753,7 @@ nun die Werte an den Stellen zur\"uck, an denen der logische Vektor
von (\code{x}) an den Stellen, an denen \code{x < 5} wahr ist. von (\code{x}) an den Stellen, an denen \code{x < 5} wahr ist.
\end{exercise} \end{exercise}
\noindent Logisches Indizieren wurde oben so benutzt, dass die Auswahl Logisches Indizieren wurde oben so benutzt, dass die Auswahl
auf dem Inhalt desselben Vektors beruhte. Ein sehr h\"auiger Fall ist auf dem Inhalt desselben Vektors beruhte. Ein sehr h\"auiger Fall ist
jedoch, dass man die Auswahl aus einem Vektor auf den Inhalt eines jedoch, dass man die Auswahl aus einem Vektor auf den Inhalt eines
zweiten Vektors basiert. Ein Beispiel ist, dass man \"uber einen zweiten Vektors basiert. Ein Beispiel ist, dass man \"uber einen
@ -766,7 +764,7 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung
\begin{figure}[h] \begin{figure}[h]
\includegraphics[width= 0.9\columnwidth]{logicalIndexingTime} \includegraphics[width= 0.9\columnwidth]{logicalIndexingTime}
\caption{\texbf{Beispiel f\"ur ``indirektes'' logisches Indizieren.} \caption{\textbf{Beispiel f\"ur ``indirektes'' logisches Indizieren.}
Der rot markierte Abschnitt aus den Daten wurde ``indirekt'' Der rot markierte Abschnitt aus den Daten wurde ``indirekt''
anhand logischen Indizierens auf dem Zeitvektor anhand logischen Indizierens auf dem Zeitvektor
ausgew\"ahlt.}\label{logicalindexingfig} ausgew\"ahlt.}\label{logicalindexingfig}
@ -821,7 +819,7 @@ x =
120 120
\end{lstlisting} \end{lstlisting}
\noindent Im Prinzip ist das obige Programm v\"ollig in Ordnung. Es f\"allt Im Prinzip ist das obige Programm v\"ollig in Ordnung. Es f\"allt
jedoch auf, dass die Zeilen 2 bis 5 sehr \"ahnlich sind; bis auf die jedoch auf, dass die Zeilen 2 bis 5 sehr \"ahnlich sind; bis auf die
Multiplikation mit einer ansteigenden Zahl \"andert sich nichts. Die Multiplikation mit einer ansteigenden Zahl \"andert sich nichts. Die
Verwendung von mehr oder weniger exakten Klonen einzelner Zeilen oder Verwendung von mehr oder weniger exakten Klonen einzelner Zeilen oder
@ -842,27 +840,26 @@ einen \"asthetischen Aspekt sondern vielmehr darum, dass es schwerwiegende Nacht
wiederholende Zeilen zu springen (ist ja eh das gleiche...) und dann wiederholende Zeilen zu springen (ist ja eh das gleiche...) und dann
den entscheidenden Teil verpasst. den entscheidenden Teil verpasst.
\end{enumerate} \end{enumerate}
Alle Programmiersprachen bieten zur L\"osung dieses Problems die
\noindent Alle Programmiersprachen bieten zur L\"osung dieses Problems die
Schleifen. Eine Schleife wird immer dann eingesetzt, wenn man Schleifen. Eine Schleife wird immer dann eingesetzt, wenn man
Abschnitte wiederholt ausf\"uhren will. Abschnitte wiederholt ausf\"uhren will.
\subsubsection{Die \textbf{for} --- Schleife} \subsubsection{Die \code{for} -- Schleife}
Der am h\"aufigsten benutzte Vertreter der Schleifen ist die Der am h\"aufigsten benutzte Vertreter der Schleifen ist die
\textit{for-Schleife}. Sie besteht aus dem \textit{Schleifenkopf} und \textit{for-Schleife}. Sie besteht aus dem \textit{Schleifenkopf} und
dem \textit{Schleifenk\"orper}. Der Kopf regelt, wie h\"aufig der Code dem \textit{Schleifenk\"orper}. Der Kopf regelt, wie h\"aufig der Code
im K\"orper ausgef\"uhrt wird. Der Schleifenkopf beginnt mit dem im K\"orper ausgef\"uhrt wird. Der Schleifenkopf beginnt mit dem
Schl\"usselwort \textbf{for} auf welches folgend die Schl\"usselwort \code{for} auf welches folgend die
\textit{Laufvariable} definiert wird. In \matlab ``l\"auft''/iteriert \textit{Laufvariable} definiert wird. In \matlab ``l\"auft''/iteriert
eine for-Schleife immer(!) \"uber einen Vektor. Die eine for-Schleife immer(!) \"uber einen Vektor. Die
\textit{Laufvariable} nimmt mit jeder Iteration einen Wert dieses \textit{Laufvariable} nimmt mit jeder Iteration einen Wert dieses
Vektors an. Im Schleifenk\"orper k\"onnen beliebige Anweisungen Vektors an. Im Schleifenk\"orper k\"onnen beliebige Anweisungen
ausgef\"uhrt werden. Die Schleife wird durch das Schl\"usselwort ausgef\"uhrt werden. Die Schleife wird durch das Schl\"usselwort
\textbf{end} beendet. Listing \ref{looplisting} zeigt das \code{end} beendet. Listing \ref{looplisting} zeigt das
Grundger\"ust einer for-Schleife. Grundger\"ust einer for-Schleife.
\begin{lstlisting}[caption={Beispiel einer \textbf{for} Schleife. Die Laufvariable \code{x} nimmt mit jeder Iteration der Schleife einen Wert des Vektors \code{1:5} an.}, label=looplisting] \begin{lstlisting}[caption={Beispiel einer \code{for} Schleife. Die Laufvariable \code{x} nimmt mit jeder Iteration der Schleife einen Wert des Vektors \code{1:5} an.}, label=looplisting]
for x = 1:5 for x = 1:5
% ... etwas sinnvolles mit x ... % ... etwas sinnvolles mit x ...
end end
@ -876,20 +873,20 @@ end
\end{exercise} \end{exercise}
\subsubsection{Die \textbf{while} --- Schleife} \subsubsection{Die \code{while} -- Schleife}
Eine weiterer Schleifentyp, der weniger h\"aufig eingesetzt wird, ist Eine weiterer Schleifentyp, der weniger h\"aufig eingesetzt wird, ist
die \textot{while}-Schleife. Auch sie hat ihre Entsprechungen in fast die \code{while}-Schleife. Auch sie hat ihre Entsprechungen in fast
allen Programmiersprachen. \"Ahnlich zur \code{for} Schleife wird allen Programmiersprachen. \"Ahnlich zur \code{for} Schleife wird
auch hier der in der Schleife definierte Programmcode iterativ auch hier der in der Schleife definierte Programmcode iterativ
ausgef\"uhrt. Der Schleifenkopf beginnt mit dem Schl\"usselwort ausgef\"uhrt. Der Schleifenkopf beginnt mit dem Schl\"usselwort
\textbf{while} gefolgt von einem \underline{Booleschen \code{while} gefolgt von einem \underline{Booleschen
Ausdruck}. Solange dieser zu \textit{true} ausgewertet werden kann, Ausdruck}. Solange dieser zu \code{true} ausgewertet werden kann,
wird der Code im Schleifenk\"orper ausgef\"uhrt. Die Schleife wird wird der Code im Schleifenk\"orper ausgef\"uhrt. Die Schleife wird
mit dem Schl\"usselwort \textbf{end} beendet. mit dem Schl\"usselwort \code{end} beendet.
\begin{lstlisting}[caption={Grundstruktur einer \textbf{while} Schleife.}, label=whileloop] \begin{lstlisting}[caption={Grundstruktur einer \code{while} Schleife.}, label=whileloop]
while x == true while x == true
% fuehre diesen sinnvollen code aus ... % fuehre diesen sinnvollen code aus ...
end end
@ -897,24 +894,24 @@ end
\begin{exercise}{facultyWhileLoop.m}{} \begin{exercise}{facultyWhileLoop.m}{}
Implementiere die Fakult\"at mit einer \textbf{while}-Schleife. Implementiere die Fakult\"at mit einer \code{while}-Schleife.
\end{exercise} \end{exercise}
\begin{exercise}{neverendingWhile.m}{} \begin{exercise}{neverendingWhile.m}{}
Implementiere eine \textbf{while}-Schleife, die unendlich Implementiere eine \code{while}-Schleife, die unendlich
l\"auft. Tipp: wenn der Boolesche Ausdruck hinter dem \textbf{while} l\"auft. Tipp: wenn der Boolesche Ausdruck hinter dem \code{while}
zu wahr ausgewertet wird, wird die Schleife weiter ausgef\"uhrt. zu wahr ausgewertet wird, wird die Schleife weiter ausgef\"uhrt.
\end{exercise} \end{exercise}
\subsubsection{Vergleich \textbf{for} und \textbf{while} Schleife} \subsubsection{Vergleich \code{for} -- und \code{while}--Schleife}
\begin{itemize} \begin{itemize}
\item Beide f\"uhren den Code im Schleifenk\"orper iterativ aus. \item Beide f\"uhren den Code im Schleifenk\"orper iterativ aus.
\item Der K\"orper einer \code{for} Schleife wird mindestens 1 mal \item Der K\"orper einer \code{for} Schleife wird mindestens 1 mal
betreten. betreten. % XXX Nur wenn die Liste im Kopf nicht leer ist, oder ?
\item Der K\"orper einer \code{while} Schleife wird nur dann betreten, \item Der K\"orper einer \code{while} Schleife wird nur dann betreten,
wenn die Bedinung im Kopf \textbf{true} ist. \\$\rightarrow$ auch wenn die Bedingung im Kopf \code{true} ist. \\$\rightarrow$ auch
``Oben-abweisende'' Schleife genannt. ``Oben-abweisende'' Schleife genannt.
\item Die \code{for} Schleife eignet sich f\"ur F\"alle in denen f\"ur \item Die \code{for} Schleife eignet sich f\"ur F\"alle in denen f\"ur
jedes Element eines Vektors der Code ausgef\"uhrt werden soll. jedes Element eines Vektors der Code ausgef\"uhrt werden soll.
@ -931,25 +928,25 @@ Bedingte Anweisungen und Verzweigungen sind Kontrollstrukturen, die
regeln, dass der in ihnen eingeschlossene Programmcode nur unter regeln, dass der in ihnen eingeschlossene Programmcode nur unter
bestimmten Bedingungen ausgef\"uhrt wird. bestimmten Bedingungen ausgef\"uhrt wird.
\subsubsection{Die if --- Anweisung} \subsubsection{Die \code{if} -- Anweisung}
Am h\"aufigsten genutzter Vertreter ist die \textbf{if} - Am h\"aufigsten genutzter Vertreter ist die \code{if} -
Anweisung. Sie Wird genutzt um Programmcode nur unter bestimmten Anweisung. Sie Wird genutzt um Programmcode nur unter bestimmten
Bedingungen auszuf\"uhren. Bedingungen auszuf\"uhren.
\begin{definition} \begin{definition}
Der Kopf der if - Anweisung beginnt mit dem Schl\"usselwort Der Kopf der if - Anweisung beginnt mit dem Schl\"usselwort
\textbf{if} welches von einem \underline{Booleschen Ausdruck} \code{if} welches von einem \underline{Booleschen Ausdruck}
gefolgt wird. Wenn dieser zu \textbf{true} ausgewertet werden kann, gefolgt wird. Wenn dieser zu \code{true} ausgewertet werden kann,
wird der Code im K\"orper der Anweisung ausgef\"uhrt. Optional wird der Code im K\"orper der Anweisung ausgef\"uhrt. Optional
k\"onnen weitere Bedingungen mit dem Schl\"usselwort \textbf{elseif} k\"onnen weitere Bedingungen mit dem Schl\"usselwort \code{elseif}
folgen. Ebenfalls optional ist die Verwendung eines finalen folgen. Ebenfalls optional ist die Verwendung eines finalen
\textbf{else} Falls. Dieser wird immer dann ausgef\"uhrt wenn alle \code{else} Falls. Dieser wird immer dann ausgef\"uhrt wenn alle
vorherigen Bedingungen nicht erf\"ullt werden. Die \code{if} vorherigen Bedingungen nicht erf\"ullt werden. Die \code{if}
Anweisung wird mit \textbf{end} beendet. Listing \ref{ifelselisting} Anweisung wird mit \code{end} beendet. Listing \ref{ifelselisting}
zeigt den Aufbau einer if-Anweisung. zeigt den Aufbau einer if-Anweisung.
\end{definition} \end{definition}
\begin{lstlisting}[label=ifelselisting, caption={Grundger\"ust einer \textbf{if} Anweisung.}] \begin{lstlisting}[label=ifelselisting, caption={Grundger\"ust einer \code{if} Anweisung.}]
if x < y if x < y
% fuehre diesen code aus % fuehre diesen code aus
elseif x > y elseif x > y
@ -960,7 +957,7 @@ end
\end{lstlisting} \end{lstlisting}
\begin{exercise}{ifelse.m}{} \begin{exercise}{ifelse.m}{}
Ziehe eine Zufallszahl und \"uberpr\"ufe mit einer geegnet \textbf{if} Anweisung, ob sie: Ziehe eine Zufallszahl und \"uberpr\"ufe mit einer geegnet \ciode{if} Anweisung, ob sie:
\begin{enumerate} \begin{enumerate}
\item ... kleiner als 0.5 ist. \item ... kleiner als 0.5 ist.
\item ... kleiner oder gr\"o{\ss}er-gleich 0.5 ist. \item ... kleiner oder gr\"o{\ss}er-gleich 0.5 ist.
@ -969,27 +966,27 @@ end
\end{enumerate} \end{enumerate}
\end{execise} \end{execise}
\subsubsection{Die \code{switch} - Verzweigung} \subsubsection{Die \code{switch} -- Verzweigung}
Die \textbf{switch} Verzweigung Wird eingesetzt wenn mehrere F\"alle Die \code{switch} Verzweigung Wird eingesetzt wenn mehrere F\"alle
auftreten k\"onnen, die einer unterschiedlichen Behandlung bed\"urfen. auftreten k\"onnen, die einer unterschiedlichen Behandlung bed\"urfen.
\begin{definition} \begin{definition}
Wird mit dem Schl\"usselwort \textbf{switch} begonnen, gefolgt von Wird mit dem Schl\"usselwort \code{switch} begonnen, gefolgt von
der \textit{switch Anweisung} (Zahl oder String). Jeder Fall auf den der \textit{switch Anweisung} (Zahl oder String). Jeder Fall auf den
die Anweisung \"uberpr\"ft werden soll wird mit dem Schl\"usselwort die Anweisung \"uberpr\"ft werden soll wird mit dem Schl\"usselwort
\textbf{case} eingeleitet. Diese wird gefolgt von der \textit{case \code{case} eingeleitet. Diese wird gefolgt von der \textit{case
Anweisung} welche definiert gegen welchen Fall auf Anweisung} welche definiert gegen welchen Fall auf
\underline{Gleichheit} getestet wird. F\"ur jeden Fall wird der \underline{Gleichheit} getestet wird. F\"ur jeden Fall wird der
Programmcode angegeben, der ausgef\"uhrt werden soll Optional Programmcode angegeben, der ausgef\"uhrt werden soll Optional
k\"onnen mit dem Schl\"usselwort \textbf{otherwise} alle nicht k\"onnen mit dem Schl\"usselwort \code{otherwise} alle nicht
explizit genannten F\"alle behandelt werden. Die \code{switch} explizit genannten F\"alle behandelt werden. Die \code{switch}
Anweisung wird mit \textbf{end} beendet (z.B. in Listing Anweisung wird mit \code{end} beendet (z.B. in Listing
\ref{switchlisting}). \ref{switchlisting}).
\end{definition} \end{definition}
\begin{lstlisting}[label=switchlisting, caption={Grundger\"ust einer \textbf{switch} Anweisung.}] \begin{lstlisting}[label=switchlisting, caption={Grundger\"ust einer \code{switch} Anweisung.}]
mynumber = input('Enter a number:'); mynumber = input('Enter a number:');
switch mynumber switch mynumber
case -1 case -1
@ -1001,11 +998,11 @@ switch mynumber
end end
\end{lstlisting} \end{lstlisting}
Wichtig ist hier, dass in jedem \textbf{case} auf \underline{Gleichheit} der Wichtig ist hier, dass in jedem \code{case} auf \underline{Gleichheit} der
switch-Anweisung und der case-Anweisung getestet wird. switch-Anweisung und der case-Anweisung getestet wird.
\subsubsection{Vergleich if - Anweisung und switch Verzweigung} \subsubsection{Vergleich \code{if} -- Anweisung und \code{switch} -- Verzweigung}
\begin{itemize} \begin{itemize}
\item Mit der \code{if} Anweisung k\"onnen beliebige F\"alle \item Mit der \code{if} Anweisung k\"onnen beliebige F\"alle
unterschieden und entsprechender code ausgef\"uhrt werden. unterschieden und entsprechender code ausgef\"uhrt werden.
@ -1021,8 +1018,8 @@ switch-Anweisung und der case-Anweisung getestet wird.
\subsection{Die Schl\"usselworte \code{break} und \code{continue}} \subsection{Die Schl\"usselworte \code{break} und \code{continue}}
Soll die Ausf\"uhrung einer Schleife abgebrochen oder \"ubersprungen Soll die Ausf\"uhrung einer Schleife abgebrochen oder \"ubersprungen
werden, werden die Schl\"usselworte \textbf{break} und werden, werden die Schl\"usselworte \code{break} und
\textbf{continue} eingesetzt (Listing \ref{breakcontinuelisting} \code{continue} eingesetzt (Listing \ref{breakcontinuelisting}
zeigt, wie sie eingesetzt werden k\"onnen). zeigt, wie sie eingesetzt werden k\"onnen).
\begin{lstlisting}[caption={Ensatz der \code{continue} und \code{break} Schl\"usselworte um die Ausf\"uhrung von Abschnitte in Schleife zu \"uberspringen oder abzubrechen.}, label=breakcontinuelisting] \begin{lstlisting}[caption={Ensatz der \code{continue} und \code{break} Schl\"usselworte um die Ausf\"uhrung von Abschnitte in Schleife zu \"uberspringen oder abzubrechen.}, label=breakcontinuelisting]
@ -1087,8 +1084,7 @@ wird, dann wird es Zeile f\"r Zeile von oben nach unten ausgef\"uhrt.
\item Funktionen \item Funktionen
\item Objekte (werden wir ignorieren) \item Objekte (werden wir ignorieren)
\end{enumerate} \end{enumerate}
Alle Programme werden in den sogenannten \textit{m-files} gespeichert
\noindent Alle Programme werden in den sogenannten \textit{m-files} gespeichert
(z.B. \textit{meinProgramm.m}). Um sie zu benutzen werden sie von der (z.B. \textit{meinProgramm.m}). Um sie zu benutzen werden sie von der
Kommandozeile aufgerufen oder in anderen Programmen Kommandozeile aufgerufen oder in anderen Programmen
verwendet. Programme erh\"ohen die Wiederverwertbarkeit von verwendet. Programme erh\"ohen die Wiederverwertbarkeit von
@ -1102,16 +1098,14 @@ definierte Variable und weist ihr einen neuen Wert zu, dann kann das
erw\"unscht und praktisch sein. Wenn es aber unbeabsichtigt passiert erw\"unscht und praktisch sein. Wenn es aber unbeabsichtigt passiert
kann es zu Fehlern kommen, die nur sehr schwer erkennbar sind, da ja kann es zu Fehlern kommen, die nur sehr schwer erkennbar sind, da ja
jedes Skript f\"ur sich enwandtfrei arbeitet. Eine L\"osung f\"ur jedes Skript f\"ur sich enwandtfrei arbeitet. Eine L\"osung f\"ur
dieses Problem bieten die \textbf{Funktionen}. dieses Problem bieten die \emph{Funktionen}.
\subsection{Funktionen} \subsection{Funktionen}
Eine Funktion in \matlab{} wird \"ahnlich zu einer mathematischen Eine Funktion in \matlab{} wird \"ahnlich zu einer mathematischen
Funktion definiert: Funktion definiert:
\[ y = f(x) \] \[ y = f(x) \]
Die Funktion hat einen Namen $f$, sie h\"angt von einem Argument $x$
\noindent Die Funktion hat einen Namen $f$, sie h\"angt von einem Argument $x$
ab und liefert ein Ergebnis $y$ zur\"uck. Listing ab und liefert ein Ergebnis $y$ zur\"uck. Listing
\ref{functiondefinitionlisting} zeigt wie das in \matlab{} umgesetzt \ref{functiondefinitionlisting} zeigt wie das in \matlab{} umgesetzt
wird. wird.
@ -1122,29 +1116,28 @@ function [y] = function_name(arg_1, arg_2)
% Rueckgabewert Argument_1, Argument_2 % Rueckgabewert Argument_1, Argument_2
\end{lstlisting} \end{lstlisting}
\noindent Ein Funktion beginnt mit dem Schl\"usselwort \textbf{function} gefolgt Ein Funktion beginnt mit dem Schl\"usselwort \code{function} gefolgt
von den R\"uckgabewerte(n), dem Funktionsnamen und (in Klammern) den von den R\"uckgabewerte(n), dem Funktionsnamen und (in Klammern) den
Argumenten. Auf den Funktionskopf folgt der auszuf\"uhrende Argumenten. Auf den Funktionskopf folgt der auszuf\"uhrende
Programmcode im Funktionsk\"orper. Die Funktionsdefinition wird Programmcode im Funktionsk\"orper. Die Funktionsdefinition wird
optional mit einem \textbf{end} abgeschlossen. Jede Funktion, die vom % optional %XXX es ist vielleicht optional, aber gute stil ware es immer hinzuschreiben, oder?
Nutzer direkt verwendet werden soll ist in einer eigenen Datei mit einem \code{end} abgeschlossen. Jede Funktion, die vom
definiert. \"uber die Definition/Benutzung von Funktionen wird folgendes erreicht: Nutzer direkt verwendet werden soll, ist in einer eigenen Datei
definiert. \"Uber die Definition/Benutzung von Funktionen wird folgendes erreicht:
\begin{itemize} \begin{itemize}
\item Kapseln von Programmcode, der f\"ur sich eine Aufgabe l\"ost. \item Kapseln von Programmcode, der f\"ur sich eine Aufgabe l\"ost.
\item Definierte Schnittstelle. \item Definierte Schnittstelle.
\item Eigener G\"ultigkeitsbereich: \item Eigener G\"ultigkeitsbereich:
\begin{itemize} \begin{itemize}
\item Variablen im Workspace sind in der Funktion \textbf{nicht} sichtbar. \item Variablen im Workspace sind in der Funktion \emph{nicht} sichtbar.
\item Variablen, die in der Funktion definiert werden erscheinen \item Variablen, die in der Funktion definiert werden erscheinen
\textbf{nicht} im Workspace. \emph{nicht} im Workspace.
\end{itemize} \end{itemize}
\item Erhöht die Wiederverwendbarkeit von Programmcode. \item Erh\"oht die Wiederverwendbarkeit von Programmcode.
\item Erh\"oht die Lesbarkeit von Programmen, da sie \item Erh\"oht die Lesbarkeit von Programmen, da sie
\"ubersichtlicher werden. \"ubersichtlicher werden.
\end{itemize} \end{itemize}
Das Folgende Beispiel (Listing \ref{badsinewavelisting}) zeigt eine
\noindent Das Folgende Beispiel (Listing \ref{badsinewavelisting}) zeigt eine
Funktion, die eine Reihe von Sinusschwingungen unterschiedlicher Funktion, die eine Reihe von Sinusschwingungen unterschiedlicher
Frequenzen berechnet und graphisch darstellt. Frequenzen berechnet und graphisch darstellt.
@ -1160,25 +1153,23 @@ function meine_erste_funktion() % Funktionskopf
hold on; hold on;
end end
\end{lstlisting} \end{lstlisting}
Das obige Beispiel ist ein Paradebeispiel f\"ur eine schlechte
\noindent Das obige Beispiel ist ein Paradebeispiel f\"ur eine schlechte
Funktion. Sie hat folgende Probleme: Funktion. Sie hat folgende Probleme:
\begin{itemize} \begin{itemize}
\item Der Name ist nicht aussagekr\"aftig. \item Der Name ist nicht aussagekr\"aftig.
\item Die Funktion ist f\"ur genau einen Zweck geeignet. \item Die Funktion ist f\"ur genau einen Zweck geeignet.
\item Was sie tut, ist festgelegt und kann von au{\ss}en nicht \item Was sie tut, ist festgelegt und kann von au{\ss}en nicht
beeinflusst oder bestimmt werden. beeinflusst oder bestimmt werden.
\item Sie tut drei Dinge aus einmal: Sinus berechnen \textbf{und} \item Sie tut drei Dinge aus einmal: Sinus berechnen \emph{und}
Amplituden \"andern \textbf{und} graphisch darstellen. Amplituden \"andern \emph{und} graphisch darstellen.
\item Es ist nicht (einfach) m\"oglich an die berechneten Daten zu \item Es ist nicht (einfach) m\"oglich an die berechneten Daten zu
kommen. kommen.
\item Keinerlei Dokumentation. Man muss den code lesen um zu \item Keinerlei Dokumentation. Man muss den code lesen um zu
rekonstruieren, was sie tut. rekonstruieren, was sie tut.
\end{itemize} \end{itemize}
\noindent Bevor wir anfangen die Funktion zu verbessern mu{\ss} definiert werden Bevor wir anfangen die Funktion zu verbessern mu{\ss} definiert werden
was das zu l\"osende Problem ist: was das zu l\"osende Problem ist:
\begin{enumerate} \begin{enumerate}
\item Welches Problem soll gel\"ost werden? \item Welches Problem soll gel\"ost werden?
\item Aufteilen in Teilprobleme. \item Aufteilen in Teilprobleme.
@ -1187,9 +1178,8 @@ was das zu l\"osende Problem ist:
wissen? Was sollen sie zur\"uckliefern? wissen? Was sollen sie zur\"uckliefern?
\item Daten zur\"uck geben (R\"uckgabewerte definieren). \item Daten zur\"uck geben (R\"uckgabewerte definieren).
\end{enumerate} \end{enumerate}
Das Beispielproblem aus Listing \ref{badsinewavelisting} kann in drei
\noindent Das Beispielproblem aus Listing \ref{badsinewavelisting} kann in drei Teilprobleme aufgetrennt werden. (i) Berechnen der \emph{einzelnen}
Teilprobleme aufgetrennt werden. (i) Berechnen der \textbf{einzelnen}
Sinus. (ii) Plotten der jeweils berechneten Daten und (iii) Sinus. (ii) Plotten der jeweils berechneten Daten und (iii)
Koordination von Berechnung und Darstellung mit unterschiedlichen Koordination von Berechnung und Darstellung mit unterschiedlichen
Amplituden. Amplituden.
@ -1204,19 +1194,18 @@ welche Daten sie zur\"uckliefern soll.
\begin{enumerate} \begin{enumerate}
\item \textbf{Name:} der Name sollte schon beschreiben, was die Funktion \item \textbf{Name:} der Name sollte schon beschreiben, was die Funktion
tut. In diesem Fall berechnet sie einen Sinus. Ein geeigneter Name tut. In diesem Fall berechnet sie einen Sinus. Ein geeigneter Name
w\"are also \textit{calculate\_sinwave}. w\"are also \code{calculate\_sinwave}.
\item \textbf{Argumente:} die zu brechnende Sinusschwingung sei durch \item \textbf{Argumente:} die zu brechnende Sinusschwingung sei durch
ihre Frequenz und die Amplitude bestimmt. Des Weiteren soll noch ihre Frequenz und die Amplitude bestimmt. Des Weiteren soll noch
festgelegt werden, wie lang der Sinus sein soll und mit welcher festgelegt werden, wie lang der Sinus sein soll und mit welcher
zeitlichen Aufl\"osung gerechnet werden soll. Es werden also vier zeitlichen Aufl\"osung gerechnet werden soll. Es werden also vier
Argumente ben\"otigt, sie k\"onnten hei{\ss}en: \textit{amplitude, Argumente ben\"otigt, sie k\"onnten hei{\ss}en: \code{amplitude},
frequency, t\_max, t\_step}. \code{frequency}, \code{t\_max}, \code{t\_step}.
\item \textbf{R\"uckgabewerte:} Um den Sinus korrekt darstellen zu k\"onnen brauchen wir die \item \textbf{R\"uckgabewerte:} Um den Sinus korrekt darstellen zu k\"onnen brauchen wir die
Zeitachse und die entsprechenden Werte. Es werden also zwei Zeitachse und die entsprechenden Werte. Es werden also zwei
Variablen zur\"uckgegeben: \textit{time, sine} Variablen zur\"uckgegeben: \code{time, sine}
\end{enumerate} \end{enumerate}
Mit dieser Information ist es nun gut m\"oglich die Funktion zu
\noindent Mit dieser Information ist es nun gut m\"oglich die Funktion zu
implementieren (Listing \ref{sinefunctionlisting}). implementieren (Listing \ref{sinefunctionlisting}).
\begin{lstlisting}[caption={Funktion, die einen Sinus berechnet.}, label=sinefunctionlisting] \begin{lstlisting}[caption={Funktion, die einen Sinus berechnet.}, label=sinefunctionlisting]
@ -1238,7 +1227,7 @@ function [time, sine] = calculate_sinewave(frequency, amplitude, t_max, t_step)
Diese Aufage kann auch von einer Funktion \"ubernommen werden. Diese Diese Aufage kann auch von einer Funktion \"ubernommen werden. Diese
Funktion hat keine andere Aufgabe, als die Daten zu plotten. Ihr Name Funktion hat keine andere Aufgabe, als die Daten zu plotten. Ihr Name
sollte sich an dieser Aufgabe orientieren sollte sich an dieser Aufgabe orientieren
(z.B. \textit{plot\_sinewave}). Um einen einzelnen Sinus zu plotten (z.B. \code{plot\_sinewave}). Um einen einzelnen Sinus zu plotten
werden im Wesentlichen die x-Werte und die zugeh\"origen y-Werte werden im Wesentlichen die x-Werte und die zugeh\"origen y-Werte
ben\"otigt. Da mehrere Sinus geplottet werden sollen ist es auch ben\"otigt. Da mehrere Sinus geplottet werden sollen ist es auch
sinnvoll eine Zeichenkette f\"ur die Legende an die Funktion zu sinnvoll eine Zeichenkette f\"ur die Legende an die Funktion zu
@ -1301,8 +1290,7 @@ Funktionen sind kleine Code Fragmente, die
\item ... ihren eigenen G\"ultigkeitsbereich haben. \item ... ihren eigenen G\"ultigkeitsbereich haben.
\item ... Skripten fast immer vorzuziehen sind. \item ... Skripten fast immer vorzuziehen sind.
\end{enumerate} \end{enumerate}
Die vorangegangene Aussagen klingen, als ob Skripte zu
\noindent Die vorangegangene Aussagen klingen, als ob Skripte zu
verteufeln w\"aren und und vermieden werden sollten. Dem ist nicht verteufeln w\"aren und und vermieden werden sollten. Dem ist nicht
so. In Wahrheit sind sie daf\"ur gemacht, Hand in Hand mit den so. In Wahrheit sind sie daf\"ur gemacht, Hand in Hand mit den
Funktionen ein Probelm zu l\"osen. W\"ahrend die Funktionen relativ Funktionen ein Probelm zu l\"osen. W\"ahrend die Funktionen relativ
@ -1310,7 +1298,6 @@ kleine ``verdauliche'' Teilprobleme l\"osen. Sind die Skripte daf\"ur
gemacht den Rahmen zu bilden und den Ablauf zu koordinieren (Abbildung gemacht den Rahmen zu bilden und den Ablauf zu koordinieren (Abbildung
\ref{programlayoutfig}). \ref{programlayoutfig}).
\begin{figure} \begin{figure}
\includegraphics[width=0.5\columnwidth]{./images/simple_program.pdf} \includegraphics[width=0.5\columnwidth]{./images/simple_program.pdf}
\caption{\textbf{Ein typisches Programmlayout.} Das Kontrollskript \caption{\textbf{Ein typisches Programmlayout.} Das Kontrollskript