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
SUBDIRS=designpattern statistics bootstrap regression likelihood pointprocesses
#programming
# programming
SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex)
pdf : chapters $(BASENAME).pdf

View File

@ -6,4 +6,9 @@ size_of_a = size(a); % get the size and store it in a new variable
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
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.legend(fontsize=8)
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
dem Namen y und weise ihr einen leeren Wert zu.'' Das
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
angegeben immer den ``double'' Datentypen benutzt, haben beide
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{complex} - Komplexe Zahlen.
\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
\end{itemize}
@ -166,16 +166,15 @@ ben\"otigen.
% \begin{definition}[Vektoren und Matrizen]
Vektoren und Matrizen sind die wichtigsten Datenstrukturen in
\matlab. In anderen Programmiersprachen spricht man von ein-
bzw. mehrdimensionalen Feldern. Felder sind Datenstrukturen, die
mehrere Werte des geleichen Datentyps in einer Variablen
vereinen. Da Matalb seinen Ursprung in der Verarbeitung von
mathematischen Vektoren und Matrizen hat, werden sie hier auch so
genannt.
\matlab. In anderen Programmiersprachen heissen sie ein-
bzw. mehrdimensionalen Felder. Felder sind Datenstrukturen, die
mehrere Werte des geleichen Datentyps in einer Variablen vereinen. Da
Matalb seinen Ursprung in der Verarbeitung von mathematischen Vektoren
und Matrizen hat, werden sie hier auch so genannt.
\matlab{} macht keinen Unterschied zwischen Vektoren und Matrizen.
Vektoren sind 2-dimsensionale Matrizen bei denen eine Dimension die Gr\"o{\ss}e 1
hat.
Vektoren sind 2-dimensionale Matrizen bei denen eine Dimension die
Gr\"o{\ss}e 1 hat.
% \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!}
Anders als viele andere Sprachen beginnt \matlab{} mit dem Index
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}]
>> 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
problemlos m\"oglich. Bei der Multiplikation (Zeile 10), der Division
(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
\matlab{} die Operatoren \code{.*}, \code{./} und \code{.\^}. Die
einfachen Operatoren \code{*}, \code{/} und \code{\^} sind mit den
@ -571,17 +570,17 @@ durchgef\"uhrt werden soll.
\section{Boolesche Operationen}
Boolesche Ausdr\"ucke sind Anweisungen, die zu \textit{wahr} oder
\textit{falsch} ausgewertet werden. Man kennt sie z.B. aus der
Boolesche Ausdr\"ucke sind Anweisungen, die zu \emph{wahr} oder
\emph{falsch} ausgewertet werden. Man kennt sie z.B. aus der
Mengenlehre. In der Programmierung werdens sie eingesetzt, um z.B. die
Beziehung zwischen Entit\"aten zu testen. Hierzu werden die
\textit{relationalen Operatoren} (\code{>, <, ==, !}, gr\"o{\ss}er
als, kleiner als, gleich und nicht) eingesetzt. Mehrere Ausdr\"ucke
werden mittels der \textit{logischen Operatoren} (\code{\&, |}, UND,
ODER ) verkn\"upft. Sie sind f\"ur uns nicht nur wichtig um
Codeabschnitte bedingt auszuf\"uhren (Verzweigungen,
\ref{controlstructsec}) sondern auch um aus Vektoren und Matrizen
bequem Elemente auszuw\"ahlen (logisches Indizieren,
\emph{relationalen Operatoren} (\code{>}, \code{<}, \code{==},
\code{!}, gr\"o{\ss}er als, kleiner als, gleich und nicht)
eingesetzt. Mehrere Ausdr\"ucke werden mittels der \textit{logischen
Operatoren} (\code{\&}, \code{|}}, UND, ODER ) verkn\"upft. Sie sind f\"ur
uns nicht nur wichtig um Codeabschnitte bedingt auszuf\"uhren
(Verzweigungen, \ref{controlstructsec}) sondern auch um aus Vektoren
und Matrizen bequem Elemente auszuw\"ahlen (logisches Indizieren,
\ref{logicalindexingsec}). Die folgenden Tabellen zeigen die
Wahrheitstabellen f\"ur das logische UND (\ref{logicalandor}, links)
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
wahr auswerten lassen.
\begin{table}[]
\begin{table}[tp]
\caption{Wahrheitstabellen logisches UND (links) und logisches ODER (rechts).}\label{logicalandor}
\begin{minipage}[t]{0.4\textwidth}
\begin{tabular}{llll}
@ -610,8 +608,8 @@ wahr auswerten lassen.
\end{minipage}
\end{table}
\noindent Anders ist das beim logischen ODER. Hier ist der gesamte
Ausdruck wahr, wenn sich der eine \textit{oder} der andere Ausdruck zu
Anders ist das beim logischen ODER. Hier ist der gesamte
Ausdruck wahr, wenn sich der eine \emph{oder} der andere Ausdruck zu
wahr auswerten l\"a{\ss}t. Tabelle \ref{logicaloperators} zeigt die
logischen Operatoren, die in \matlab{} definiert sind. Zu bemerken
sind hier noch die \code{\&\&} und \code{||} Operatoren. Man kann
@ -641,10 +639,10 @@ verf\"ugbar.
\end{center}
\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
auf Dinge wie Gleicheit (\code{==}) gr\"o{\ss}er oder kleiner als
(\code{>, <}) testen.
(\code{>}, \code{<}) testen.
\begin{table}[th]
\caption{\label{relationaloperators}
@ -664,7 +662,7 @@ auf Dinge wie Gleicheit (\code{==}) gr\"o{\ss}er oder kleiner als
\end{center}
\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
auswerten indem man in den Typ \textit{logical} umwandelt. Dabei
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}).
\begin{lstlisting}[caption={Beispiel Logischen Indizieren.}, label=logicalindexing1]
\begin{lstlisting}[caption={Beispiel logisches Indizieren.}, label=logicalindexing1]
>> x = randn(10, 1);
>> % in zwei Schritten
>> 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.
\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
jedoch, dass man die Auswahl aus einem Vektor auf den Inhalt eines
zweiten Vektors basiert. Ein Beispiel ist, dass man \"uber einen
@ -766,7 +764,7 @@ bestimmten Zeitraums ausw\"ahlen m\"ochte (Abbildung
\begin{figure}[h]
\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''
anhand logischen Indizierens auf dem Zeitvektor
ausgew\"ahlt.}\label{logicalindexingfig}
@ -821,7 +819,7 @@ x =
120
\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
Multiplikation mit einer ansteigenden Zahl \"andert sich nichts. Die
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
den entscheidenden Teil verpasst.
\end{enumerate}
\noindent Alle Programmiersprachen bieten zur L\"osung dieses Problems die
Alle Programmiersprachen bieten zur L\"osung dieses Problems die
Schleifen. Eine Schleife wird immer dann eingesetzt, wenn man
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
\textit{for-Schleife}. Sie besteht aus dem \textit{Schleifenkopf} und
dem \textit{Schleifenk\"orper}. Der Kopf regelt, wie h\"aufig der Code
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
eine for-Schleife immer(!) \"uber einen Vektor. Die
\textit{Laufvariable} nimmt mit jeder Iteration einen Wert dieses
Vektors an. Im Schleifenk\"orper k\"onnen beliebige Anweisungen
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.
\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
% ... etwas sinnvolles mit x ...
end
@ -876,20 +873,20 @@ end
\end{exercise}
\subsubsection{Die \textbf{while} --- Schleife}
\subsubsection{Die \code{while} -- Schleife}
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
auch hier der in der Schleife definierte Programmcode iterativ
ausgef\"uhrt. Der Schleifenkopf beginnt mit dem Schl\"usselwort
\textbf{while} gefolgt von einem \underline{Booleschen
Ausdruck}. Solange dieser zu \textit{true} ausgewertet werden kann,
\code{while} gefolgt von einem \underline{Booleschen
Ausdruck}. Solange dieser zu \code{true} ausgewertet werden kann,
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
% fuehre diesen sinnvollen code aus ...
end
@ -897,24 +894,24 @@ end
\begin{exercise}{facultyWhileLoop.m}{}
Implementiere die Fakult\"at mit einer \textbf{while}-Schleife.
Implementiere die Fakult\"at mit einer \code{while}-Schleife.
\end{exercise}
\begin{exercise}{neverendingWhile.m}{}
Implementiere eine \textbf{while}-Schleife, die unendlich
l\"auft. Tipp: wenn der Boolesche Ausdruck hinter dem \textbf{while}
Implementiere eine \code{while}-Schleife, die unendlich
l\"auft. Tipp: wenn der Boolesche Ausdruck hinter dem \code{while}
zu wahr ausgewertet wird, wird die Schleife weiter ausgef\"uhrt.
\end{exercise}
\subsubsection{Vergleich \textbf{for} und \textbf{while} Schleife}
\subsubsection{Vergleich \code{for} -- und \code{while}--Schleife}
\begin{itemize}
\item Beide f\"uhren den Code im Schleifenk\"orper iterativ aus.
\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,
wenn die Bedinung im Kopf \textbf{true} ist. \\$\rightarrow$ auch
wenn die Bedingung im Kopf \code{true} ist. \\$\rightarrow$ auch
``Oben-abweisende'' Schleife genannt.
\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.
@ -931,25 +928,25 @@ Bedingte Anweisungen und Verzweigungen sind Kontrollstrukturen, die
regeln, dass der in ihnen eingeschlossene Programmcode nur unter
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
Bedingungen auszuf\"uhren.
\begin{definition}
Der Kopf der if - Anweisung beginnt mit dem Schl\"usselwort
\textbf{if} welches von einem \underline{Booleschen Ausdruck}
gefolgt wird. Wenn dieser zu \textbf{true} ausgewertet werden kann,
\code{if} welches von einem \underline{Booleschen Ausdruck}
gefolgt wird. Wenn dieser zu \code{true} ausgewertet werden kann,
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
\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}
Anweisung wird mit \textbf{end} beendet. Listing \ref{ifelselisting}
Anweisung wird mit \code{end} beendet. Listing \ref{ifelselisting}
zeigt den Aufbau einer if-Anweisung.
\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
% fuehre diesen code aus
elseif x > y
@ -960,7 +957,7 @@ end
\end{lstlisting}
\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}
\item ... kleiner als 0.5 ist.
\item ... kleiner oder gr\"o{\ss}er-gleich 0.5 ist.
@ -969,27 +966,27 @@ end
\end{enumerate}
\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.
\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
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
\underline{Gleichheit} getestet wird. F\"ur jeden Fall wird der
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}
Anweisung wird mit \textbf{end} beendet (z.B. in Listing
Anweisung wird mit \code{end} beendet (z.B. in Listing
\ref{switchlisting}).
\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:');
switch mynumber
case -1
@ -1001,11 +998,11 @@ switch mynumber
end
\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.
\subsubsection{Vergleich if - Anweisung und switch Verzweigung}
\subsubsection{Vergleich \code{if} -- Anweisung und \code{switch} -- Verzweigung}
\begin{itemize}
\item Mit der \code{if} Anweisung k\"onnen beliebige F\"alle
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}}
Soll die Ausf\"uhrung einer Schleife abgebrochen oder \"ubersprungen
werden, werden die Schl\"usselworte \textbf{break} und
\textbf{continue} eingesetzt (Listing \ref{breakcontinuelisting}
werden, werden die Schl\"usselworte \code{break} und
\code{continue} eingesetzt (Listing \ref{breakcontinuelisting}
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]
@ -1087,8 +1084,7 @@ wird, dann wird es Zeile f\"r Zeile von oben nach unten ausgef\"uhrt.
\item Funktionen
\item Objekte (werden wir ignorieren)
\end{enumerate}
\noindent Alle Programme werden in den sogenannten \textit{m-files} gespeichert
Alle Programme werden in den sogenannten \textit{m-files} gespeichert
(z.B. \textit{meinProgramm.m}). Um sie zu benutzen werden sie von der
Kommandozeile aufgerufen oder in anderen Programmen
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
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
dieses Problem bieten die \textbf{Funktionen}.
dieses Problem bieten die \emph{Funktionen}.
\subsection{Funktionen}
Eine Funktion in \matlab{} wird \"ahnlich zu einer mathematischen
Funktion definiert:
\[ y = f(x) \]
\noindent Die Funktion hat einen Namen $f$, sie h\"angt von einem Argument $x$
Die Funktion hat einen Namen $f$, sie h\"angt von einem Argument $x$
ab und liefert ein Ergebnis $y$ zur\"uck. Listing
\ref{functiondefinitionlisting} zeigt wie das in \matlab{} umgesetzt
wird.
@ -1122,29 +1116,28 @@ function [y] = function_name(arg_1, arg_2)
% Rueckgabewert Argument_1, Argument_2
\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
Argumenten. Auf den Funktionskopf folgt der auszuf\"uhrende
Programmcode im Funktionsk\"orper. Die Funktionsdefinition wird
optional mit einem \textbf{end} abgeschlossen. Jede Funktion, die vom
Nutzer direkt verwendet werden soll ist in einer eigenen Datei
definiert. \"uber die Definition/Benutzung von Funktionen wird folgendes erreicht:
% optional %XXX es ist vielleicht optional, aber gute stil ware es immer hinzuschreiben, oder?
mit einem \code{end} abgeschlossen. Jede Funktion, die vom
Nutzer direkt verwendet werden soll, ist in einer eigenen Datei
definiert. \"Uber die Definition/Benutzung von Funktionen wird folgendes erreicht:
\begin{itemize}
\item Kapseln von Programmcode, der f\"ur sich eine Aufgabe l\"ost.
\item Definierte Schnittstelle.
\item Eigener G\"ultigkeitsbereich:
\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
\textbf{nicht} im Workspace.
\emph{nicht} im Workspace.
\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
\"ubersichtlicher werden.
\end{itemize}
\noindent Das Folgende Beispiel (Listing \ref{badsinewavelisting}) zeigt eine
Das Folgende Beispiel (Listing \ref{badsinewavelisting}) zeigt eine
Funktion, die eine Reihe von Sinusschwingungen unterschiedlicher
Frequenzen berechnet und graphisch darstellt.
@ -1160,25 +1153,23 @@ function meine_erste_funktion() % Funktionskopf
hold on;
end
\end{lstlisting}
\noindent Das obige Beispiel ist ein Paradebeispiel f\"ur eine schlechte
Das obige Beispiel ist ein Paradebeispiel f\"ur eine schlechte
Funktion. Sie hat folgende Probleme:
\begin{itemize}
\item Der Name ist nicht aussagekr\"aftig.
\item Die Funktion ist f\"ur genau einen Zweck geeignet.
\item Was sie tut, ist festgelegt und kann von au{\ss}en nicht
beeinflusst oder bestimmt werden.
\item Sie tut drei Dinge aus einmal: Sinus berechnen \textbf{und}
Amplituden \"andern \textbf{und} graphisch darstellen.
\item Sie tut drei Dinge aus einmal: Sinus berechnen \emph{und}
Amplituden \"andern \emph{und} graphisch darstellen.
\item Es ist nicht (einfach) m\"oglich an die berechneten Daten zu
kommen.
\item Keinerlei Dokumentation. Man muss den code lesen um zu
rekonstruieren, was sie tut.
\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:
\begin{enumerate}
\item Welches Problem soll gel\"ost werden?
\item Aufteilen in Teilprobleme.
@ -1187,9 +1178,8 @@ was das zu l\"osende Problem ist:
wissen? Was sollen sie zur\"uckliefern?
\item Daten zur\"uck geben (R\"uckgabewerte definieren).
\end{enumerate}
\noindent Das Beispielproblem aus Listing \ref{badsinewavelisting} kann in drei
Teilprobleme aufgetrennt werden. (i) Berechnen der \textbf{einzelnen}
Das Beispielproblem aus Listing \ref{badsinewavelisting} kann in drei
Teilprobleme aufgetrennt werden. (i) Berechnen der \emph{einzelnen}
Sinus. (ii) Plotten der jeweils berechneten Daten und (iii)
Koordination von Berechnung und Darstellung mit unterschiedlichen
Amplituden.
@ -1204,19 +1194,18 @@ welche Daten sie zur\"uckliefern soll.
\begin{enumerate}
\item \textbf{Name:} der Name sollte schon beschreiben, was die Funktion
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
ihre Frequenz und die Amplitude bestimmt. Des Weiteren soll noch
festgelegt werden, wie lang der Sinus sein soll und mit welcher
zeitlichen Aufl\"osung gerechnet werden soll. Es werden also vier
Argumente ben\"otigt, sie k\"onnten hei{\ss}en: \textit{amplitude,
frequency, t\_max, t\_step}.
Argumente ben\"otigt, sie k\"onnten hei{\ss}en: \code{amplitude},
\code{frequency}, \code{t\_max}, \code{t\_step}.
\item \textbf{R\"uckgabewerte:} Um den Sinus korrekt darstellen zu k\"onnen brauchen wir die
Zeitachse und die entsprechenden Werte. Es werden also zwei
Variablen zur\"uckgegeben: \textit{time, sine}
Variablen zur\"uckgegeben: \code{time, sine}
\end{enumerate}
\noindent Mit dieser Information ist es nun gut m\"oglich die Funktion zu
Mit dieser Information ist es nun gut m\"oglich die Funktion zu
implementieren (Listing \ref{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
Funktion hat keine andere Aufgabe, als die Daten zu plotten. Ihr Name
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
ben\"otigt. Da mehrere Sinus geplottet werden sollen ist es auch
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 ... Skripten fast immer vorzuziehen sind.
\end{enumerate}
\noindent Die vorangegangene Aussagen klingen, als ob Skripte zu
Die vorangegangene Aussagen klingen, als ob Skripte zu
verteufeln w\"aren und und vermieden werden sollten. Dem ist nicht
so. In Wahrheit sind sie daf\"ur gemacht, Hand in Hand mit den
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
\ref{programlayoutfig}).
\begin{figure}
\includegraphics[width=0.5\columnwidth]{./images/simple_program.pdf}
\caption{\textbf{Ein typisches Programmlayout.} Das Kontrollskript