From 51afc62ff43ee012b5a456d0df5765a4c158a568 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Sat, 10 Oct 2015 13:39:44 +0200 Subject: [PATCH] [lecture] scripts and functions finished --- programming/lectures/scripts_functions.tex | 337 +++++++++++++++++---- 1 file changed, 286 insertions(+), 51 deletions(-) diff --git a/programming/lectures/scripts_functions.tex b/programming/lectures/scripts_functions.tex index bb32c09..2e230bb 100644 --- a/programming/lectures/scripts_functions.tex +++ b/programming/lectures/scripts_functions.tex @@ -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}