📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / presentations / Programmieren-Tutorium / Tutorium-04 / tutorium-04.tex
132930 viewsLicense: OTHER
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}12% use KIT-Theme3% see http://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen4%\usetheme{Frankfurt} % see http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html as fallback5\InputIfFileExists{../templates/beamerthemekit.sty}{\usepackage{../templates/beamerthemekit}}{\usetheme{Frankfurt}}6\usefonttheme{professionalfonts}78\usepackage{hyperref}9\usepackage{lmodern}10\usepackage{listings}11\usepackage{wrapfig} % see http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions12\usepackage[utf8]{inputenc} % this is needed for german umlauts13\usepackage[ngerman]{babel} % this is needed for german umlauts14\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf15\usepackage{verbatim}16\usepackage{relsize}17\usepackage{subfigure}18\usepackage{algorithm,algpseudocode}19\usepackage{minted} % needed for the inclusion of source code20\usepackage{xcolor}21\usepackage{menukeys}22\usepackage{wasysym}23\usepackage{braket} % needed for \Set24\usepackage{tikz}25% w/o following space!26\newcommand{\quem}{\tikz[baseline=(wi.base)]{\node[fill=black,rotate=45,inner sep=1.5mm] {};%27\node[ font=\color{white}] (wi) {?};}}28\usepackage{../templates/myStyle}2930\newcommand\tutor{Martin Thoma}31\newcommand\tutNR{10}32\newcommand\titleText{Programmieren-Tutorium Nr. \tutNR{} bei \tutor}33\institute{Fakultät für Informatik}3435\hypersetup{pdftitle={\titleText}}36\beamertemplatenavigationsymbolsempty3738\newcommand\InsertToC[1][]{39\begin{frame}{Outline}40\tableofcontents[subsectionstyle=show/show/show, subsubsectionstyle=show/show/show, #1]41\end{frame}42}4344\begin{document}45\title{\titleText}46\subtitle{Javadoc, Bytecode}47\author{\tutor}48\date{\today}49\subject{Programmieren}5051\frame{\titlepage}5253\frame{54\frametitle{Inhaltsverzeichnis}55\setcounter{tocdepth}{1}56\tableofcontents57\setcounter{tocdepth}{2}58}5960\section{Einleitung}61\subsection{Quiz: Teil 1}62\begin{frame}{Quiz: Teil 1}63\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Quiz.java, frame=lines]{java}{Quiz-float-1.java}64\begin{itemize}65\item Gibt es einen Compiler-Fehler?66\item Gibt es einen Laufzeit-Fehler?67\item Gibt es eine Ausgabe? Welche?68\end{itemize}69\end{frame}7071\subsection{Quiz: Teil 2}72\begin{frame}{Quiz: Teil 2}73\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Quiz.java, frame=lines]{java}{Quiz-float-2.java}74\begin{itemize}75\item Gibt es einen Compiler-Fehler?76\item Gibt es einen Laufzeit-Fehler?77\item Gibt es eine Ausgabe? Welche?78\end{itemize}79\end{frame}8081\subsection{Quiz: Teil 3}82\begin{frame}{Quiz: Teil 3}83\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Quiz.java, frame=lines]{java}{Quiz-float-3.java}84\begin{itemize}85\item Gibt es einen Compiler-Fehler?86\item Gibt es einen Laufzeit-Fehler?87\item Gibt es eine Ausgabe? Welche?88\end{itemize}89\end{frame}9091\section{Nachbesprechung: 1. ÜB}92\subsection{Gleitkomma vs. Ganzzahl}93\begin{frame}{Gleitkomma vs. Ganzzahl}94Welche Vorteile bieten Ganzzahl-Variablen im Vergleich zu95Gleitkomma-Variablen?96\begin{itemize}[<+->]97\item \textbf{Speicherplatz}? \onslide<4->{Nein, vgl. \myCode{long} und \myCode{float}}98\item \textbf{Geschwindigkeit}? \onslide<5->{Kommt drauf an: Wenn keine weitere Umrechnung nötig ist und die Gleitkommazahl nicht kleiner ist, eher ja.}99\item \textbf{Genauigkeit}? \onslide<6->{Ja.\\100Beispiel: $(0,1)_{10} = (0,0\overline{0011})_2$\\101vgl. Java-Puzzle}102\end{itemize}103\end{frame}104105\subsection{Variablennamen}106\begin{frame}{Variablennamen}107Bitte nur alphanumerische Zeichen für Namen (Pakete, Methoden, Variablen, \dots).\\108Soll heißen:109\begin{itemize}[<+->]110\item abcdefghijklmnopqrstuvwxyz sind erlaubt111\item ABCDEFGHIJKLMNOPQRSTUVWXYZ sind erlaubt112\item 0123456789 sind erlaubt113\item Unterstrich - also "`\_"' ist nur in Kostanten erlaubt114\item Der Rest ist verboten und gibt Punktabzug! Keine Umlaute!115\end{itemize}116\end{frame}117118\subsection{Kommentare}119\begin{frame}{Kommentare}120\begin{block}{Regel}121Kommentiert, was ihr macht. \\122Nicht wie ihr es macht.123\end{block}124125\begin{itemize}[<+->]126\item Gut zu kommentieren ist schwer127\item Viel (fremden) Code ansehen hilft128\item Eigenen Code nach Jahren ansehen hilft129\item JEDER Kommentar ist für Java-Entwickler gedacht130\item[$\Rightarrow$] Kommentare à la "`Methode"' oder131"`Methodensignatur"' sind nutzlos!\\132\item Javadoc-Kommentare sind für Entwickler, die nichts von133eurem Code sehen können, ihn aber dennoch nutzen wollen134\end{itemize}135\end{frame}136137\subsection{Kommentare: Beispiel 1}138\begin{frame}{Kommentare: Beispiel 1}139\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Kommentare-1.java}140141\only<2->{142\begin{itemize}143\item An sich gute Kommentare144\item Wäre besser als Javadoc direkt über der Methode145\end{itemize}146}147\end{frame}148149\subsection{Kommentare: Beispiel 2}150\begin{frame}{Kommentare: Beispiel 2}151\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Kommentare-2.java}152\end{frame}153154\begin{frame}{Kommentare: Beispiel 2}155\begin{itemize}156\item Zeile 1 \& 2 bieten einem Entwickler nicht mehr Informationen157$\Rightarrow$ nutzlos158\item Sonst okay159\item Bitte nicht \myCode{chainwheel0}, sondern \myCode{chainwheel}160und später \myCode{this}-Operator nutzen\\161Gibt in Zukunft -0,5 Punkte162\item Gute Zeilenlänge \smiley163\end{itemize}164\end{frame}165166\subsection{Kommentare: Beispiel 3}167\begin{frame}{Kommentare: Beispiel 3}168\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Kommentare-3.java}169\only<2->{170\begin{itemize}171\item Javadoc ist okay172\item "`Methodensignatur"'-Kommentar in Z. 5 ist nutzlos173\item Kommentare in Z. 7 - 9 sind nutzlos174\item Z. 8 ist arg lang $\rightarrow$ den Kommentar hätte175man einfach über die Zeile schreiben können.176\end{itemize}177}178\end{frame}179180\subsection{Namenskonventionen für booleans}181\begin{frame}{Namenskonventionen für booleans}182\begin{block}{Regel}183Der Präfix "`is"' sollte für boolesche Variablen und Methoden184mit dem Rückgabewert \myCode{boolean} genutzt werden.185\end{block}186187\onslide<2->{188\begin{exampleblock}{Beispiele}189isSet, isVisible, isFinished, isFound, isOpen190\end{exampleblock}191}192193\onslide<3->{194Auch okay sind "`has"', "`should"' oder ähnliche Präfixe.195}196197\onslide<4->{198\begin{exampleblock}{Beispiele}199\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=1, lastline=3]{java}{singleLines.java}200\end{exampleblock}201}202\end{frame}203204\subsection{booleans: Positiv- und Negativbeispiel}205\begin{frame}{booleans: Positiv- und Negativbeispiel}206\begin{exampleblock}{Negativbeispiel: So nicht!}207\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=5, lastline=6]{java}{singleLines.java}208\end{exampleblock}209210\onslide<2->{211\begin{exampleblock}{Positivbeispiel: Aber so}212\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=8, lastline=9]{java}{singleLines.java}213\end{exampleblock}214}215216\onslide<3->{217In Zukunft: -0,5 Punkte218}219\end{frame}220221\subsection{Boolean: Was ist mit Gettern/Settern?}222\begin{frame}{Boolean: Was ist mit Gettern/Settern?}223\inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=11, lastline=17]{java}{singleLines.java}224\begin{block}{Hinweis}225Es ist okay, wenn ein Attribut genauso heißt wie eine Methode226\end{block}227\end{frame}228229\subsection{Kombinatorik}230\begin{frame}{Kombinatorik}231Wenn man 3 Gänge vorne und 7 hinten hat, wie viele Gänge gibt es?232\vspace{1.0cm}233\onslide<2->{234\textbf{Antwort:} $3 \cdot 7 = 21$\\235}236\vspace{0.5cm}237\onslide<3->{\textbf{Erklärung}:238Sei $\Set{a, b, c}$ die Menge der vorderen Gänge und239$\Set{1, 2, 3, 4, 5, 6, 7}$ die Menge der hinteren Gänge.\\240}241\vspace{0.2cm}242\onslide<4->{243Dann gibt es folgende Kombinationen:\\244a1, a2, a3, a4, a5, a6, a7\\245b1, b2, b3, b4, b5, b6, b7\\246c1, c2, c3, c4, c5, c6, c7247}248249\end{frame}250251\subsection{Formatierung}252\begin{frame}{Formatierung}253Mit Eclipse:254\begin{itemize}255\item Alles markieren: \keys{\ctrl+A}256\item Formatieren: \keys{\ctrl+\shift+F}257\end{itemize}258Falsche Formatierung gibt in Zukunft pro Fehler -0,5 Punkte.\\259Auch Folgefehler geben Punktabzug!260\end{frame}261262\subsection{Aussagekräftige Variablen!}263\begin{frame}{Aussagekräftige Variablen!}264In Zukunft:265-1 P. bis -5 P. für Variablennamen wie "`Kr"' für Kettenräder oder266"`Pr"' für Preis!267\end{frame}268269\subsection{Quiz}270\begin{frame}{Quiz}271\begin{table}[ht]272\begin{tabular}{p{0.4\linewidth}l}273\begin{minipage}[b]{0.8\linewidth}\centering274\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Baby.java, frame=lines]{java}{Static-Quiz-Baby.java}275\end{minipage}276&277\begin{minipage}[b]{0.5\linewidth}278\centering279\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=World.java, frame=lines]{java}{Static-Quiz-World.java}280\end{minipage}281\end{tabular}282\end{table}283\begin{itemize}284\item Gibt es einen Compiler-Fehler?285\item Gibt es einen Laufzeit-Fehler?286\item Gibt es eine Ausgabe? Welche?287\end{itemize}288\end{frame}289290\subsection{Quiz: Antwort}291\begin{frame}{Quiz: Antwort}292Ausgabe:293\begin{itemize}294\item Alice: 56295\item Bob: 56296\end{itemize}297\vspace{0.5cm}298Warum?299\begin{itemize}[<+->]300\item \myCode{static} macht ein Attribut zu einem "`\textbf{Klassenattribut}"'301\item Das Attribut gehört dann nicht mehr den einzelnen Objekten302\item Und sollte auch nicht über Objecte aufgerufen werden!303\item Schlecht: \myCode{alice.size;}304\item Auch schlecht: \myCode{alice.getSize();}305\item Besser: \myCode{Baby.size;} oder \myCode{Baby.getSize();}306\item In Zukunft: min. -2 P. für falsche \myCode{static}-Verwendung307\end{itemize}308\end{frame}309310\section{Exkurs}311\subsection{Exkurs: Bytecode}312\begin{frame}{Exkurs: Bytecode}313\begin{alertblock}{Hinweis}314Das folgende ist nicht Prüfungsrelevant!\\315Also zurücklehnen und genießen :-)316\end{alertblock}317318\vspace{1cm}319Mit dem Befehl320\inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=1, lastline=1]{bash}{bash.sh}321könnt ihr euch den Java-Bytecode ansehen.322\end{frame}323324\begin{frame}{Exkurs: SimpleLoop Java Code}325\inputminted[linenos=true, numbersep=5pt, tabsize=4, label=SimpleLoop.java, frame=lines]{java}{SimpleLoop.java}326\end{frame}327328\begin{frame}{Bytecode von SimpleLoop.java}329\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Bytecode.txt}330\end{frame}331\begin{frame}{Bytecode von SimpleLoop.java: Anfang}332\inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=1, lastline=7, fontsize=\tiny]{java}{Bytecode.txt}333\begin{itemize}334\item \textbf{aload\_0}: Lade eine Objektreferenz aus dem Array der lokalen Variablen auf den Operandenstapel. (\href{http://www.javaseiten.de/jvmisa.html\#aload\_0}{Quelle})335\item \textbf{iload\_1}: Lade den int-Wert einer lokalen Variablen auf den Operandenstapel. (\href{http://www.javaseiten.de/jvmisi.html\#iload_1}{Quelle})336\item \textbf{invokespecial [method-spec]}: invoke method belonging to a specific class (\href{https://www.vmth.ucdavis.edu/incoming/Jasmin/ref--33.html}{Quelle})337\end{itemize}338\end{frame}339340\begin{frame}{Bytecode von SimpleLoop.java: Ende}341\inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=9, lastline=32, fontsize=\tiny]{java}{Bytecode.txt}342\end{frame}343344\begin{frame}{Interessanter Teil des Bytecodes}345\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Bytecode-interessant.txt}346\end{frame}347348\subsection{Javadoc}349\framedgraphic{Offizielle \href{http://docs.oracle.com/javase/6/docs/api/}{Java 6 API} Javadoc}{java-6-javadoc.png}350\framedgraphic{Offizielle \href{http://docs.oracle.com/javase/7/docs/api/}{Java 7 API} Javadoc}{java-7-javadoc.png}351352\subsection{Javadoc erzeugen}353\begin{frame}{Javadoc erzeugen}354\begin{itemize}355\item Order erstellen, in dem die Javadoc landen soll356\item In den Ordner mit euren Quelldateien wechseln357\item Befehl \myCode{javadoc -d ../pfad/zum/javadoc/ordner/ *}358\end{itemize}359\end{frame}360\begin{frame}{Javadoc erzeugen}361\inputminted[linenos=true, numbersep=5pt, tabsize=4, firstline=1, lastline=30, fontsize=\tiny]{console}{javadoc.sh-session}362\end{frame}363\begin{frame}{Javadoc erzeugen}364\inputminted[linenos=true, numbersep=5pt, tabsize=4, firstline=31, firstnumber=31, lastline=59, fontsize=\tiny]{console}{javadoc.sh-session}365\end{frame}366\begin{frame}{Javadoc erzeugen}367\inputminted[linenos=true, numbersep=5pt, tabsize=4, firstline=60, firstnumber=60, lastline=82, fontsize=\tiny]{console}{javadoc.sh-session}368\end{frame}369\begin{frame}{Javadoc: Codierung}370\begin{itemize}[<+->]371\item \quem{} ist ein sicheres Zeichen, dass was bei der372Zeichenkodierung schief ging.373\item Bitte verwendet \textbf{immer} UTF-8!374\item Eclipse: \menu{Window > Preferences > General > Workspace > Text file encoding > UTF-8}375\end{itemize}376\end{frame}377378\section{Dies und Das}379\subsection{Konvention: Leerzeichen}380\begin{frame}{Konvention: Leerzeichen}381Keine Whitespaces nach382\begin{itemize}383\item ~ (Bitweises Komplement)384\item ! (Logisches Komplement)385\item ++ (Präfix-Inkrementierung, z.B. ++i;)386\item -- (Präfix-Dekrementierung, z.B. --i;)387\item . (Punkt)388\item - (Unäres Minus, z.B. -5)389\item + (Unäres Plus, z.B. +4)390\end{itemize}391Und392\begin{itemize}393\item Exakt eines vor und nach "`="'394\item Um Operatoren herum:395\end{itemize}396397\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=20, lastline=24]{java}{singleLines.java}398\end{frame}399400\subsection{Mehrdimensionale Arrays}401\begin{frame}{Mehrdimensionale Arrays}402Vorstellung:403\begin{itemize}404\item 1D: Vektor, Liste405\item 2D: Matrix, Tabelle406\item 3D: Quader407\item 4D: Hyperwürfel (falls quadratisch)408\end{itemize}409410\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=26, lastline=33]{java}{singleLines.java}411\end{frame}412413\subsection{Wrap-Up: Was ihr können solltet}414\begin{frame}{Wrap-Up: Das Programmierer $1 \cdot 1$}415\textbf{Was ihr können solltet}:416\begin{itemize}417\item \textbf{Einfache Probleme modellieren}:\\418Welche Klassen / Methoden brauche ich?419\item \textbf{Konstrollstrukturen}:420\begin{itemize}421\item \myCode{if (<Bedingung>) \{ \dots \}}422\item \myCode{while (<Bedingung>) \{ \dots \}}423\item \myCode{for (<Initialisierung>, <Bedingung>, <Update>) \{\dots\}}424\item \myCode{switch (<Variable>) \{case <Wert>:\}}425\end{itemize}426\item \textbf{Arrays}: 1D- und 2D427\item \textbf{Kommentare}428\item \textbf{Koventionen}: Javadoc, Leerzeichen-Setzung429\item \textbf{Debuggen}: Einfache Fehler in eurem Code finden430\end{itemize}431432\textbf{Was ihr hier noch lernt}:433\begin{itemize}434\item Verwendung der Java Standardbibliothek435\item Eingabe von Daten436\end{itemize}437\end{frame}438439\subsection{Quiz: For-Schleifen}440\begin{frame}{Quiz: For-Schleifen (1/2)}441\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor.java}442\begin{itemize}443\item Gibt es einen Compiler-Fehler?444\item Gibt es einen Laufzeit-Fehler?445\item Gibt es eine Ausgabe? Welche?446\end{itemize}447\end{frame}448449\begin{frame}{Quiz: For-Schleifen (1/2) - Antwort}450\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor.java}451Ausgabe: \myCode{end}, da die Bedingung auch am Anfang überprüft wird452\end{frame}453454\begin{frame}{Quiz: For-Schleifen (2/2)}455\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor-2.java}456\begin{itemize}457\item Gibt es einen Compiler-Fehler?458\item Gibt es einen Laufzeit-Fehler?459\item Gibt es eine Ausgabe? Welche?460\end{itemize}461\end{frame}462463\begin{frame}{Quiz: For-Schleifen (2/2) - Antwort}464\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor-2.java}465Ausgabe: Endlosschleife\\466\myCode{0 bottles of beer}\\467\myCode{1 bottles of beer}\\468\myCode{2 bottles of beer}\\469\vdots470\end{frame}471472\section{Hinweise zum ÜB 2}473\subsection{Allgemeine Hinweise}474\begin{frame}{Allgemeine Hinweise}475\begin{alertblock}{Hinweise}476\begin{itemize}[<+->]477\item Auf \href{http://baldur.iti.kit.edu/programmieren/}{offizieller Lösung} aufbauen (Verpflichtend!)478\item Auf Leerzeichen, gute Variablennamen und Konventionen achten479\item Wird eine Bedinung von einem Setter-Parameter nicht eingehalten, schreibt ihr den Wert nicht480\begin{itemize}481\item Stattdessen: Fehlermeldung per \myCode{System.out.println("dies und das ist falsch");} ausgeben482\item Das ist nur eine Hilfslösung, weil ich noch keine Exceptions hattet483\item Später: (Fast) immer Exceptions!484\end{itemize}485\item Genauigkeit:486\begin{itemize}487\item Positiv bedeutet: $> 0$488\item Negativ bedeutet: $< 0$489\item nicht-negativ bedeutet: $\geq 0$490\end{itemize}491\end{itemize}492\end{alertblock}493\end{frame}494495\subsection{Wie werde ich besser?}496\begin{frame}{Wie werde ich besser?}497\begin{itemize}498\item \href{http://projecteuler.net/}{ProjectEuler.net}:499401 Aufgaben jeder Schwierigkeitsstufe500\item Anderen Code anschauen501\item Probleme am PC lösen502\end{itemize}503\end{frame}504505\section{Praxis}506\subsection{ProjectEuler 28: Aufgabe}507\framedgraphic{ProjectEuler 28: Aufgabe}{euler-28.png}508509\begin{frame}{ProjectEuler 28: Lösung mit Aufbau der Spirale}510\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Euler28.java, frame=lines]{java}{Euler28.java}511\end{frame}512513\begin{frame}{ProjectEuler 28: Lösung ohne Aufbau der Spirale}514\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Euler28.java, frame=lines]{java}{Euler28-fast.java}515\end{frame}516517\section{Abspann}518\subsection{Kommende Tutorien}519\begin{frame}{Kommende Tutorien}520\begin{itemize}521\item[10.] 12.11.2012522\item[9.] 19.11.2012523\item[8.] 26.11.2012524\item[7.] 03.12.2012525\item[6.] 10.12.2012526\item[5.] 17.12.2012: Video "`Library"' zeigen527\item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}528\item[-] 31.12.2012: Silvester - Kein Tutorium529\item[4.] 07.01.2013530\item[3.] 14.01.2013531\item[2.] 21.01.2013532\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung533\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung534\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})535\end{itemize}536\end{frame}537538\subsection{Comic}539\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/xkcd-good_code.png}540541\end{document}542543544