[lecture] scripts and functions finished

This commit is contained in:
Jan Grewe 2015-10-10 13:39:44 +02:00
parent 1746143fa4
commit 51afc62ff4

View File

@ -52,10 +52,10 @@
Universit\"at T\"ubingen}
\institute[Wissenschaftliche Datenverarbeitung]{}
\date{03.10.2014 - 07.11.2014}
\date{12.10.2015 - 06.11.2015}
%\logo{\pgfuseimage{../../resources/UT_BM_Rot_RGB.pdf}}
\subject{Einf\"uhrung in wissenschaftliche Datenverarbeitung}
\subject{Einf\"uhrung in die wissenschaftliche Datenverarbeitung}
\vspace{1em}
\titlegraphic{
\includegraphics[width=0.5\linewidth]{../../resources/UT_WBMW_Rot_RGB}
@ -86,6 +86,8 @@
\end{flushright}
}
\newcommand{\code}[1]{\texttt{#1}}
\input{../../latex/environments.tex}
\makeatother
@ -116,7 +118,7 @@
\begin{enumerate}
\item Was ist ein Program?
\item Skripte und Funktionen
\item G\"ultigkeitsbereiche
\item Programmierstil
\item Vom Problem zum Algorithmus
\item \"Ubungen, \"Ubungen, \"Ubungen.
\end{enumerate}
@ -140,7 +142,7 @@
\end{itemize}\pause
Wenn es zum Leben erweckt wird...
\begin{itemize}
\item ... wird es Zeile fuer Zeile von oben nach unten ausgef\"uhrt.
\item ... wird es Zeile f\"r Zeile von oben nach unten ausgef\"uhrt.
\end{itemize}
\end{frame}
@ -154,7 +156,8 @@
\item Funktionen
\item Objekte (werden wir ignorieren)
\end{enumerate}\pause
\item Alle werden in sogenannte m-files gespeichert (z.B. \textit{meinProgramm.m}).
\item Alle werden in sogenannte m-files gespeichert
(z.B. \textit{meinProgramm.m}).
\item K\"onnen dann von der Kommandozeile aufgerufen werden.
\item Programme erh\"ohen die Wiederverwertbarkeit von Programmcode.\pause
\item Programme k\"onnen andere Programme aufrufen.
@ -190,14 +193,15 @@
\begin{enumerate}
\item \"Offnet den Editor und schreibt ein Skript, das vier Sinus
mit den Amplituden \code{amplitudes = [0.25, 0.5, 1.0, 2.0]} und
der Frequenz 2\,Hz in einen Graphen plottet. Benutzt eine \verb+for+
Schleife um die Amplituden abzuarbeiten (\verb+hold on+ um Linien
der Frequenz 2\,Hz in einen Graphen plottet (\code{sinus = sin(x *
frequency)* amplitude;}). Benutzt eine \verb+for+ Schleife um
die Amplituden abzuarbeiten (\verb+hold on+ um Linien
\"ubereinander zu plotten).
\item Speichert das Skript und f\"uhrt es von der Kommandozeile aus.
\item Erzeuge ein zweites Skript, das nun das erste aufruft aber bei
jedem Aufruf die Frequenz neu setzt. Benutzt eine \verb+for+
Schleife um folgende Frequenzen abzuarbeiten
\code{frequencies = [2.0, 4.0, 6.0] %Hz}.
jedem Aufruf die Frequenz (Variable \code{frequency}) neu
setzt. Benutzt eine \verb+for+ Schleife um folgende Frequenzen
abzuarbeiten \code{frequencies = [2.0, 4.0, 6.0]}.
\item Speichert und ruft dieses Skript \"uber die Kommandozeile
auf.
\item Was ist geplottet, passt es zu den Erwartungen?
@ -205,20 +209,76 @@
\end{frame}
\begin{frame}
\frametitle{Skripte und Funktionen} \framesubtitle{Funktionen}
Vorherige \"Ubung sollte gezeigt haben, dass die Verwendung von
globalen Variablen gef\"ahrlich sein kann.
Wie l\"ost man dieses Problem?\\
\frametitle{Skripte und Funktionen}
\framesubtitle{Skripte}
Vorherige \"Ubung sollte gezeigt haben, dass ...
\begin{enumerate}
\item die Verwendung von globalen Variablen gef\"ahrlich sein kann.
\item jede Variable, die in einem aufgerufenen Skript definiert wird
im globalen Workspace sichtbar wird.
\end{enumerate}
\large{Wie l\"ost man dieses Problem?}\\
\vspace{3em} \huge{Funktionen!}
\end{frame}
\begin{frame}[fragile]
\frametitle{Funktionen} \framesubtitle{Funktionen}
Funktionen haben ihren eingenen G\"ultigkeitsbereich. Variablen im
\textit{Workspace} sind ohne Konsequenzen f\"ur die Funktion.
\footnotesize
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
Definition:
\begin{itemize}
\item Eine Funktion in Matlab wird \"ahnlich zu einer mathematischen
Funktion definiert:\\
\begin{center}
\Large$y = f(x)$\normalsize\pause
\end{center}
\end{itemize}
\tiny
\begin{lstlisting}
function plot_sinus_mit_amplituden() % Funktionskopf
function y = function_name(arg_1, arg_2)
% ^ ^ ^
% Rueckgabewert Argument_1 Argument_2
end
\end{lstlisting}
\normalsize
\begin{itemize}
\item Ein Funktion beginnt mit dem Schl\"usselwort \textbf{function}
gefolgt von den R\"uckgabewerten, dem Funktionsnamen und (in
Klammern) den Argumenten.
\item Auf den Funktionskopf folgt der auszuf\"uhrende Programmcode
im Funktionsk\"orper.
\item Die Funktionsdefinition wird mit \textbf{end} abgeschlossen.
\item Eine Funktion ist in einer eigenen Datei definiert.
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
Was erreicht man damit?
\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, die in der Funktion definiert werden erscheinen
\textbf{nicht} im Workspace.
\end{itemize}
\item Erhöht die Wiederverwendbarkeit von Programmcode.
\item Erh\"oht die Lesbarkeit von Programmen, da sie
\"ubersichtlicher werden.
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
Eine Beispielfunktion, die eine Reihe Sinus plottet.
\footnotesize
\begin{lstlisting}
function meine_erste_funktion() % Funktionskopf
x = (0:0.01:2*pi); % hier faengt der Funktionskoerper an
frequenz = 1.0;
amplituden = [0.25 0.5 0.75 1.0 1.25];
@ -228,58 +288,221 @@ function plot_sinus_mit_amplituden() % Funktionskopf
plot(x, y)
hold on;
end
\end{lstlisting}\pause
Ist das eine gute Funktion?
\end{lstlisting}
\begin{center}
\large{\textbf{Ist das eine gute Funktion?}}
\end{center}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
\tiny
\begin{lstlisting}
function meine_erste_funktion()
x = (0:0.01:2*pi);
frequenz = 1.0;
amplituden = [0.25 0.5 0.75 1.0 1.25];
for i = 1:length(amplituden)
y = sin(frequenz * x) * amplituden(i);
plot(x, y)
hold on;
end
\end{lstlisting}
\normalsize
Probleme mit dieser Funktion:
\begin{itemize}
\item Der Name ist nicht aussagekr\"aftig.
\item Die Funktion ist f\"ur genau einen Zweck gut.
\item Was sie tut, ist festgelegt und kann von au{\ss}en nicht
beeinflusst werden.
\item Sie tut 2 Dinge: Sinus berechnen \textbf{und} graphisch darstellen.
\item Es ist nicht (einfach) m\"oglich an die berechneten Daten zu
kommen.
\item Keinerlei Dokumentation. Ich muss den code lesen um zu
rekonstruieren, was sie tut.
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen} \framesubtitle{Funktionen }
\huge{Wie kann die Funktion besser gemacht werden?}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
\begin{enumerate}
\item Identifizieren des Problems.
\item Aufteilen in Teilprobleme.
\item Gute Namen finden.
\item Definieren der Schnittstellen --- Was muss die Funktion
wissen? Was möchte ich von ihr haben?
\item Daten zur\"uck geben (R\"uckgabewerte definieren).
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{Funktionen}
\framesubtitle{Argumente und R\"uckgabewerte}
Grundlegende Idee ist $y = f(x)$.\\
\"Ahnlich dazu kann man den Funktionskopf mit Argumenten und R\"uckgabewerten definieren
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
\textbf{\large{Drei Teilprobleme:}}
\begin{enumerate}
\item Berechnen der \textbf{einzelnen} Sinus.
\item Plotten der Daten.
\item Koordinieren von Berechung und Darstellung.
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
\large{\textbf{1. Berechnen eines einzelnen Sinus:}}
\tiny
\begin{lstlisting}
function meine_erste_funktion()
x = (0:0.01:2*pi);
frequenz = 1.0;
amplituden = 1.0 1.25;
y = sin(frequenz * x) * amplitude;
end
\end{lstlisting}
\normalsize
\begin{enumerate}
\item Namen ersetzten
\item Schnittstelle definieren: Was will ich von der Funktion?
Welche Information muss ich ihr geben?\pause
\begin{itemize}
\item Funktion muss wissen: Wie weit soll gerechnet werden? Welche
Aufl\"osung auf der x-Achse? Welche Frequenz? Welche Amplitude?
\item F\"ur einen Plot brauche ich die x- und die y-Werte. Diese
muss die Funktion zur\"uckgeben.
\end{itemize}
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
Namens\"anderung:
\footnotesize
\begin{lstlisting}
function y = plot_sinus(frequenz, amplitude)
% ^ ^ ^
% Rueckgabewert Argument_1 Argument_2
\end{lstlisting}
function calculate_sinewave()
x = (0:0.01:2*pi);
frequenz = 1.0;
amplituden = [0.25 0.5 0.75 1.0 1.25];
y = sin(frequenz * x) * amplituden(i);
end
\end{lstlisting}
\normalsize
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
Argumente:
\footnotesize
\begin{lstlisting}
function calculate_sinewave(frequency, amplitude, x_max, x_step)
x = (0:x_step:x_max);
y = sin(frequency * x) * amplitude;
end
\end{lstlisting}
\normalsize
\end{frame}
\begin{frame}[fragile]
\frametitle{Funktionen}
\framesubtitle{Argumente und R\"uckgabewerte}
Eine Funktion kann auch mehrere R\"uckgabewerte haben.
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
R\"uckgabewerte:
\tiny
\begin{lstlisting}
function [y, z] = do_something(a, b)
y = a + b
z = a * b
\end{lstlisting}
\pause
\begin{itemize}
\item Alle R\"uckgabewerte m\"ussen in der Funktion definiert sein!\pause
\item Man kann auch mit variablen Anzahlen der Argumente und R\"uckgabewerte programmieren.\pause
\item Ist aber deutlich komplexer und fehleranf\"alliger.
\end{itemize}
function [x, y] = calculate_sinewave(frequency, amplitude, x_max, x_step)
x = (0:x_step:x_max);
y = sin(frequency * x) * amplitude;
end
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Programmierstil}
Programmierstil ist:
\framesubtitle{Funktionen}
\large{\textbf{2. Plotten einer einzelnen Schwingung:}}
\normalsize
\begin{enumerate}
\item Die Namensgebung fuer Variablen und Konstanten.
\item Die Namensgebung von Skripten und Funktionen.
\item Die Verwendung von Einr\"uckungen und Leerzeilen um Bl\"ocke im Code hervorzuheben.
\item Verwendung von Kommentaren und Hilfetexten.
\item Namen finden
\item Schnittstelle definieren: Was will ich von der Funktion?
Welche Information muss ich ihr geben?\pause
\begin{itemize}
\item Funktion muss wissen: Welche Daten soll sie plotten? X-Werte,
y-Werte, einen Namen f\"ur die Legende?
\item Muss nichts zur\"uckgeben.
\end{itemize}
\end{enumerate}
\footnotesize
\begin{lstlisting}
function plot_sinewave(x_data, y_data, name)
plot(x_data, y_data, 'displayname', name)
end
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
\large{\textbf{3. Erstellen eines \textbf{Skriptes} zur Koordinierung:}}
\normalsize
\begin{enumerate}
\item Namen finden
\item Definieren eins Vektors, f\"ur die Amplituden.
\item Definieren einer Variable f\"ur die Frequenz.
\item Definieren der Variablen f\"ur das Maximum und die
Schrittweite der x-Achse.
\item \"Offnen einer neuen Abbildung (\code{figure()}).
\item Setzen des \code{hold on}.
\item \code{for}-Schleife, die über die Amplituden iteriert, die
Sinus berechnen l\"asst und die Resultate an die Plot-Funktion
weiterreicht.
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{Funktionen}
\framesubtitle{Zusammenfassung}
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
Skript: \verb+plot_sinewaves.m+
\footnotesize
\begin{lstlisting}
amplitudes = 0.25:0.25:1.25;
frequency = 2;
x_max = 10 * pi;
x_step = 0.01;
figure()
hold on
for a = amplitudes
name = num2str(a);
[x_data, y_data] = calculate_sinewave(frequency, a, x_max, x_step);
plot_sinewave(x_data, y_data, name)
end
legend('show')
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Skripte und Funktionen}
\framesubtitle{Funktionen}
Aufaben:
\begin{enumerate}
\item Erweitert das Programm so, dass auch ein Satz von Frequenzen
benutzt wird.
\end{enumerate}
\end{frame}
\begin{frame}
\frametitle{Skripte undFunktionen}
\framesubtitle{Funktionen --- Zusammenfassung}
Funktionen sind kleine Code Fragmente, die
\begin{enumerate}
\item ... genau eine Aufgabe erledigen.
@ -294,6 +517,18 @@ function [y, z] = do_something(a, b)
\huge{3. Programmierstil}
\end{frame}
\begin{frame}
\frametitle{Skripte und Funktionen}
\framesubtitle{Programmierstil}
Programmierstil ist:
\begin{enumerate}
\item Die Namensgebung fuer Variablen und Konstanten.
\item Die Namensgebung von Skripten und Funktionen.
\item Die Verwendung von Einr\"uckungen und Leerzeilen um Bl\"ocke im Code hervorzuheben.
\item Verwendung von Kommentaren und Hilfetexten.
\end{enumerate}
\end{frame}
\begin{frame}[fragile]
\frametitle{Programmierstil}
\framesubtitle{Was soll das?}
@ -331,7 +566,7 @@ function [y, z] = do_something(a, b)
\item Hilfetexte: Ein Problem; sie m\"ussen aktuell sein sonst sind
sie sch\"adlicher als wenn sie gar nicht da w\"aren.
\item Einr\"uckung ist Pflicht.
\item Bl\"ocke im Code werden durch 1 Leerzeichen getrennt.
\item Bl\"ocke im Code werden durch 1 Leerzeile getrennt.
\end{enumerate}
\end{frame}