diff --git a/presentations/Programmieren-Tutorium/.gitignore b/presentations/Programmieren-Tutorium/.gitignore
new file mode 100644
index 0000000..7f7d9e9
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/.gitignore
@@ -0,0 +1,34 @@
+*.aux
+*.bbl
+*.blg
+*.dvi
+*.fdb_latexmk
+*.glg
+*.glo
+*.gls
+*.idx
+*.ilg
+*.ind
+*.ist
+*.lof
+*.log
+*.lot
+*.nav
+*.nlo
+*.out
+*.pdfsync
+*.ps
+*.snm
+*.synctex.gz
+*.toc
+*.vrb
+*.maf
+*.mtc
+*.mtc0
+*.pdf
+*.mp4
+*.mpg
+logos/kitlogo*
+templates/*kit*.sty
+templates/semirounded.sty
+templates/tikzuml.sty
diff --git a/presentations/Programmieren-Tutorium/Misc/Stilfragen.tex b/presentations/Programmieren-Tutorium/Misc/Stilfragen.tex
new file mode 100644
index 0000000..37ba3c4
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Misc/Stilfragen.tex
@@ -0,0 +1,25 @@
+\section{Stilfragen}
+\subsection{So nicht}
+\begin{frame}{So nicht}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=pi.c, fontsize=\tiny]{c}{pi.c}
+ Quelle: \href{http://www.cise.ufl.edu/~manuel/obfuscate/obfuscate.html}{Obfuscated C Code}
+\end{frame}
+
+\subsection{Aber so}
+\begin{frame}{Aber so}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=pi-good.c]{c}{pi-good.c}
+
+ Nur halt in Java (Ich will keine C Abgaben sehen! In dem
+ Modul "`Programmieren"' wird ausschließlich Java behandelt.)
+\end{frame}
+
+\subsection{Hinweise zu gutem Programmierstil}
+\begin{frame}{Hinweise zu gutem Programmierstil}
+ \begin{itemize}
+ \item Sinnvolle Modellierung ("`ist ein"' bzw. "`hat"')
+ \item Aussagekräftige Namen (Klassen, Methoden, Variablen)
+ \item JavaDoc
+ \item Hilfreiche Kommentare (für die Abschlussaufgabe: lieber zu viele)
+ \item Kurze Funktionseinheiten
+ \end{itemize}
+\end{frame}
diff --git a/presentations/Programmieren-Tutorium/Misc/tutoriumTermine.py b/presentations/Programmieren-Tutorium/Misc/tutoriumTermine.py
new file mode 100755
index 0000000..03c51aa
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Misc/tutoriumTermine.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+import datetime
+
+tmpDay = datetime.date.today() # von
+lastday = datetime.date(2014,2,10) # bis (Vorlesungsende?)
+
+while tmpDay < lastday:
+ if tmpDay.weekday() == 0:
+ print tmpDay.strftime('%d.%m.%Y')
+ tmpDay += datetime.timedelta(days=1)
diff --git a/presentations/Programmieren-Tutorium/README.md b/presentations/Programmieren-Tutorium/README.md
new file mode 100644
index 0000000..b942e7a
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/README.md
@@ -0,0 +1,18 @@
+programmieren-tutorium
+======================
+
+Folien für mein Programmieren-Tutorium am KIT
+
+Struktur der Tutorien
+---------------------
+* Quiz
+* Fehlerbesprechung (letztes Übungsblatt)
+* Kurzwiederholung des Vorlesungsstoffs
+* Praxis / Übungsaufgaben
+* Hinweise zum neuen Übungsblatt
+
+
+Hinweise
+--------
+Die Dateien in den Ordnern `logos` und `templates` darf ich nicht
+veröffentlichen!
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/Bash.sh b/presentations/Programmieren-Tutorium/Tutorium-01/Bash.sh
new file mode 100644
index 0000000..551bf3a
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/Bash.sh
@@ -0,0 +1,8 @@
+user@pc:~$ ls
+HelloWorld.java
+user@pc:~$ javac HelloWorld.java
+user@pc:~$ ls
+HelloWorld.class HelloWorld.java
+user@pc:~$ java HelloWorld
+Hallo Welt!
+user@pc:~$
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/Day.java b/presentations/Programmieren-Tutorium/Tutorium-01/Day.java
new file mode 100644
index 0000000..afb852d
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/Day.java
@@ -0,0 +1,4 @@
+public enum Day {
+ SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
+ THURSDAY, FRIDAY, SATURDAY
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/HelloWorld.java b/presentations/Programmieren-Tutorium/Tutorium-01/HelloWorld.java
new file mode 100644
index 0000000..bca3a5e
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/HelloWorld.java
@@ -0,0 +1,5 @@
+public class HelloWorld {
+ public static void main(String[] args) {
+ System.out.println("Hallo Welt!");
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/Makefile b/presentations/Programmieren-Tutorium/Tutorium-01/Makefile
new file mode 100644
index 0000000..e5bfe05
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/Makefile
@@ -0,0 +1,11 @@
+SOURCE = tutorium-01
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex email-liste.tex -output-format=pdf
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Leaf.java b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Leaf.java
new file mode 100644
index 0000000..748b7d1
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Leaf.java
@@ -0,0 +1,4 @@
+public class Leaf {
+ /** Is this leaf connected to the tree or is it fallen? */
+ boolean isAlive;
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Nature.java b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Nature.java
new file mode 100644
index 0000000..8691815
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Nature.java
@@ -0,0 +1,13 @@
+public class Nature {
+
+ /**
+ * Dies ist ein leerer Kommentar. Bitte so nicht!
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Root.java b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Root.java
new file mode 100644
index 0000000..6e328c2
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Root.java
@@ -0,0 +1,5 @@
+public class Root {
+ Root mainRoot;
+ Root leftRoot;
+ Root rightRoot;
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Tree.java b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Tree.java
new file mode 100644
index 0000000..fcb734d
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/Natur-Beispiel/Tree.java
@@ -0,0 +1,24 @@
+public class Tree {
+ /*
+ * Usually, you would use an array for this, but I wanted to keep it simple.
+ */
+
+ /** A leaf of this tree */
+ Leaf leaf1;
+
+ /** Theoretically, you should make those comments over every line */
+ Leaf leaf2;
+ Leaf leaf3;
+ Leaf leaf4;
+ Root mainRoot;
+
+ /** age in years */
+ int age;
+
+ /** name of this tree in English */
+ String name;
+
+ /** scientific name of this type of tree in Latin */
+ String scientificName;
+
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/SomeClass.java b/presentations/Programmieren-Tutorium/Tutorium-01/SomeClass.java
new file mode 100644
index 0000000..43d3222
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/SomeClass.java
@@ -0,0 +1,7 @@
+public class SomeClass {
+ public static void main(String[] args) {
+ Day currentDay;
+ currentDay = Day.MONDAY;
+ System.out.println(currentDay);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-choose-download.png b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-choose-download.png
new file mode 100755
index 0000000..e24f540
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-choose-download.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-download.png b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-download.png
new file mode 100755
index 0000000..85b9413
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-download.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-einrichten.png b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-einrichten.png
new file mode 100755
index 0000000..d94e51b
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-einrichten.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-projekt.png b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-projekt.png
new file mode 100755
index 0000000..be699cc
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/eclipse-projekt.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/email-liste.tex b/presentations/Programmieren-Tutorium/Tutorium-01/email-liste.tex
new file mode 100644
index 0000000..bc52d87
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/email-liste.tex
@@ -0,0 +1,104 @@
+\documentclass[a4paper,landscape,9pt]{scrartcl}
+\usepackage[ngerman]{babel}
+\usepackage[utf8]{inputenc}
+\usepackage{amssymb,amsmath,amsfonts}
+\usepackage{multicol}
+\usepackage{dsfont}
+\usepackage[landscape]{geometry}
+\usepackage{graphicx}
+\usepackage{underscore}
+\usepackage[parfill]{parskip} % No intendation for new paragraphs
+\usepackage{wasysym}
+\usepackage{booktabs}% http://ctan.org/pkg/booktabs
+\usepackage{array}% http://ctan.org/pkg/array
+\usepackage{tabularx}% http://ctan.org/pkg/tabularx
+\usepackage{calc}
+
+\geometry{a4paper,left=10mm,right=10mm, top=1cm, bottom=2cm}
+
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\lhead{Email-Liste}
+\rhead{Tutorium 10, Martin Thoma}
+
+\newcommand\lineHeight{0.7cm}
+
+\begin{document}
+ \title{Email-Liste}
+ \author{Martin Thoma}
+
+ \begin{tabularx}{\linewidth}{l|cc|X|X|X|X}
+ &\mars & \venus & Vorname Nachname & Matrikelnummer & Studiengang & E-Mail Adresse\\
+ \hline
+ \hline
+ 0 & \CheckedBox & \Square & Martin Thoma & 1633521 & Informatik (BA) & info@martin-thoma.de\\
+ \hline
+ 1 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 2 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 3 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 4 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 5 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 6 &\Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 7 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 8 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 9 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 10 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 11 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 12 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 13 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 14 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 15 & \Square & \Square & & & & \\[\lineHeight]
+ \end{tabularx}
+
+ \begin{tabularx}{\linewidth}{l|cc|X|X|X|X}
+ &\mars & \venus & Vorname Nachname & Matrikelnummer & Studiengang & E-Mail Adresse\\
+ \hline
+ \hline
+ 0 & \CheckedBox & \Square & Martin Thoma & 1633521 & Informatik (BA) & info@martin-thoma.de\\
+ \hline
+ 16 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 17 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 18 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 19 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 20 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 21 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 22 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 23 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 24 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 25 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 26 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 27 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 28 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 29 & \Square & \Square & & & & \\[\lineHeight]
+ \hline
+ 30 & \Square & \Square & & & & \\[\lineHeight]
+ \end{tabularx}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/java-download.png b/presentations/Programmieren-Tutorium/Tutorium-01/java-download.png
new file mode 100755
index 0000000..e01279d
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/java-download.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/pi-good.c b/presentations/Programmieren-Tutorium/Tutorium-01/pi-good.c
new file mode 100644
index 0000000..9c8bf5c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/pi-good.c
@@ -0,0 +1,7 @@
+#define PI 3.14159265359
+
+main(){
+ // Ausgabe der mathematischen Konstante "pi" auf 3
+ // Nachkommastellen
+ printf("%1.3f\n", PI);
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/pi.c b/presentations/Programmieren-Tutorium/Tutorium-01/pi.c
new file mode 100644
index 0000000..4f25288
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/pi.c
@@ -0,0 +1,22 @@
+
+#define _ F-->00 || F-OO--;
+long F=00,OO=00;
+main(){F_OO();printf("%1.3f\n", 4.*-F/OO/OO);}F_OO()
+{
+ _-_-_-_
+ _-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_-_-_-_
+ _-_-_-_-_-_-_-_-_
+ _-_-_-_
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/schaubild-java-workflow.png b/presentations/Programmieren-Tutorium/Tutorium-01/schaubild-java-workflow.png
new file mode 100644
index 0000000..d6da167
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/schaubild-java-workflow.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/schaubild-java-workflow.xcf b/presentations/Programmieren-Tutorium/Tutorium-01/schaubild-java-workflow.xcf
new file mode 100644
index 0000000..94e0d79
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/schaubild-java-workflow.xcf differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/start-systemsteuerung.png b/presentations/Programmieren-Tutorium/Tutorium-01/start-systemsteuerung.png
new file mode 100755
index 0000000..531eab4
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/start-systemsteuerung.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/tutorium-01.tex b/presentations/Programmieren-Tutorium/Tutorium-01/tutorium-01.tex
new file mode 100644
index 0000000..8427caa
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-01/tutorium-01.tex
@@ -0,0 +1,612 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+
+% use KIT-Theme
+% see http://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen
+%\usetheme{Frankfurt} % see http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html as fallback
+\InputIfFileExists{../templates/beamerthemekit.sty}{\usepackage{../templates/beamerthemekit}}{\usetheme{Frankfurt}}
+\usefonttheme{professionalfonts}
+
+\usepackage{hyperref}
+\usepackage{lmodern}
+\usepackage{listings}
+\usepackage{wrapfig} % see http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions
+\usepackage[utf8]{inputenc} % this is needed for german umlauts
+\usepackage[ngerman]{babel} % this is needed for german umlauts
+\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf
+\usepackage{verbatim}
+\usepackage{relsize}
+\usepackage{subfigure}
+\usepackage{algorithm,algpseudocode}
+\usepackage{minted} % needed for the inclusion of source code
+\usepackage{tikz}
+\usetikzlibrary{shapes,snakes,calc,patterns}
+\usepackage{xcolor}
+\usepackage{menukeys}
+\usepackage{braket}
+\usepackage{ulem}
+\usepackage{../templates/myStyle}
+
+\newcommand\tutor{Martin Thoma}
+\newcommand\tutNR{10}
+\newcommand\titleText{Programmieren-Tutorium Nr. \tutNR{}}
+\institute{Fakultät für Informatik}
+
+\hypersetup{pdftitle={\titleText}}
+\beamertemplatenavigationsymbolsempty
+
+\newcommand\InsertToC[1][]{
+ \begin{frame}{Outline}
+ \tableofcontents[subsectionstyle=show/show/show, subsubsectionstyle=show/show/show, #1]
+ \end{frame}
+}
+
+\begin{document}
+\title{\titleText}
+\subtitle{Einführung in Java, Eclipse}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+%\AtBeginSection[]{
+% \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection
+%}
+
+\section{Allgemeines}
+\subsection{Formalien}
+\begin{frame}{Formalien}
+ \begin{itemize}
+ \item Die Folien werden online gestellt $ \Rightarrow $
+ \textbf{Mitschreiben nicht nötig}
+ \item $\rightarrow$ \href{http://martin-thoma.com/programmieren-tutorium}{martin-thoma.com/programmieren-tutorium}
+ \item Fragen immer sofort stellen – und traut euch!\\
+ Wenn nicht hier, wo dann?
+ \end{itemize}
+\end{frame}
+
+\subsection{Vorstellung}
+\begin{frame}
+ \frametitle{Das bin ich}
+ \begin{itemize}
+ \item Martin Thoma (\href{mailto:info@martin-thoma.de}{info@martin-thoma.de}) $\rightarrow$ \href{http://www.martin-thoma.de/about.htm}{CV}
+ \item 22 Jahre alt
+ \item komme aus Augsburg
+ \item 3. Semester, Informatik
+ \item Programmieren
+ \begin{itemize}
+ \item \textbf{2005}: Angefangen mit PHP (\& HTML, CSS, JavaScript, (My)SQL)
+ \item \textbf{2009}: Liebe zu Python entdeckt \\
+ (\href{http://martin-thoma.com/challenge-websites/}{HackIts und Challenges} auf ProjectEuler, Brightshadows)
+ \item \textbf{Selten}: C, C++ (z.B. für ein größeres Forschungsprojekt)
+ \item \textbf{2011}: Java am KIT gelernt
+ \item BwInf, Online-Projekte wie z.B. \href{http://world-of-dungeons.net/}{world-of-dungeons}
+ \end{itemize}
+ \end{itemize}
+ \textbf{Und wer seid ihr?}
+\end{frame}
+
+\subsection{Websites}
+\begin{frame}
+ \frametitle{Websites und Links}
+ \begin{itemize}
+ \item \href{http://martin-thoma.com/programmieren-tutorium}{martin-thoma.com/programmieren-tutorium}:\\
+ Alle Links, Folien, Hinweise und viele weitere Inhalte
+ \item \href{https://praktomat.info.uni-karlsruhe.de/}{praktomat.info.uni-karlsruhe.de}:\\
+ Forum; Abgabe der Übungsaufgaben; Klausur
+ \item \href{https://webinscribe.ira.uka.de/}{webinscribe.de}: Anmeldung für das Tutorium
+ \item \href{http://verialg.iti.kit.edu/english/583.php}{tinyurl.com/prog2012}: Website von Prof. Dr. Sinz
+ \item \href{http://docs.oracle.com/javase/7/docs/}{docs.oracle.com}: Manual $\rightarrow$ \href{http://docs.oracle.com/javase/7/docs/api/}{API}
+ \item \href{http://stackoverflow.com/}{stackoverflow.com}: Weitergehende Fragen
+ \end{itemize}
+\end{frame}
+
+\subsection{Tutorium, Übung, Vorlesung}
+\begin{frame}
+ \frametitle{Tutorium, Übung, Vorlesung}
+\begin{tikzpicture}[%
+ auto,
+ example/.style={
+ rectangle,
+ draw=blue,
+ thick,
+ fill=blue!20,
+ text width=4.5em,
+ align=center,
+ rounded corners,
+ minimum height=2em
+ },
+ longName/.style={
+ text width=12em,
+ align=center,
+ minimum height=2em
+ },
+ algebraicName/.style={
+ text width=7em,
+ align=center,
+ minimum height=2em
+ },
+ explanation/.style={
+ text width=10em,
+ align=left,
+ minimum height=3em
+ }
+ ]
+\pgfdeclarepatternformonly{north east lines wide}%
+ {\pgfqpoint{-1pt}{-1pt}}%
+ {\pgfqpoint{10pt}{10pt}}%
+ {\pgfqpoint{9pt}{9pt}}%
+ {
+ \pgfsetlinewidth{3pt}
+ \pgfpathmoveto{\pgfqpoint{0pt}{0pt}}
+ \pgfpathlineto{\pgfqpoint{9.1pt}{9.1pt}}
+ \pgfusepath{stroke}
+ }
+
+
+ % Big background
+ \draw[fill=lime!20,lime!20, rounded corners] (-1.8, 0.60) rectangle (10,-5);
+
+ \draw[fill=purple!20,purple!20, rounded corners] (0.55, -3.1) rectangle (3.5,-3.9);
+ \draw[fill=purple!20,purple!20, rounded corners] (4.55, -3.1) rectangle (7.5,-3.9);
+
+ \draw[fill=blue!20,blue!20, rounded corners] (-1.45,-1.4) rectangle (1.5,-0.6);
+ \draw[fill=blue!20,blue!20, rounded corners] (2.55,-1.4) rectangle (5.5,-0.6);
+ \draw[fill=blue!20,blue!20, rounded corners] (6.55,-1.4) rectangle (9.5,-0.6);
+
+ \draw (2, 0) node[longName] (A) {Modul: Programmieren}
+ (6, 0) node[explanation] (X) {
+ \begin{minipage}{0.9\textwidth}
+ \tiny
+ \begin{itemize}
+ \item 5 ECTS
+ \end{itemize}
+ \end{minipage}
+ }
+ (0,-1) node[algebraicName] (B) {Tutorium}
+ (4,-1) node[algebraicName] (C) {Übung}
+ (8,-1) node[algebraicName] (D) {Vorlesung}
+ (0,-2) node[algebraicName] (E) {Student}
+ (4,-2) node[algebraicName] (F) {Mitarbeiter}
+ (8,-2) node[algebraicName] (G) {Dozent}
+ (2,-3.5) node[algebraicName, purple] (H) {Übungsschein}
+ (1.8,-4.35) node[explanation] (X) {
+ \begin{minipage}{\textwidth}
+ \tiny
+ \begin{itemize} \itemsep-0.2em
+ \item Muss bestanden werden
+ \item Keine Note
+ \item keine Bonuspunkte
+ \end{itemize}
+ \end{minipage}
+ }
+ (6,-3.5) node[algebraicName, purple] (I) {Klausur}
+ (5.8,-4.3) node[explanation] (X) {
+ \begin{minipage}{\textwidth}
+ \tiny
+ \begin{itemize} \itemsep-0.2em
+ \item Muss bestanden werden
+ \item Abschlussnote ergibt Modulnote
+ \end{itemize}
+ \end{minipage}
+ };
+
+ \draw[blue, thick, rounded corners] ($(B.north west)$) rectangle ($(B.south east)$);
+ \draw[blue, thick, rounded corners] ($(C.north west)$) rectangle ($(C.south east)$);
+ \draw[blue, thick, rounded corners] ($(D.north west)$) rectangle ($(D.south east)$);
+
+ \draw[purple, thick, rounded corners] ($(H.north west)$) rectangle ($(H.south east)$);
+ \draw[purple, thick, rounded corners] ($(I.north west)$) rectangle ($(I.south east)$);
+
+ \draw[lime, thick, rounded corners] ($(B.north west)+(-0.1,0.1)$) rectangle ($(E.south east)+(0.1,-0.1)$);
+ \draw[lime, thick, rounded corners] ($(C.north west)+(-0.1,0.1)$) rectangle ($(F.south east)+(0.1,-0.1)$);
+ \draw[lime, thick, rounded corners] ($(D.north west)+(-0.1,0.1)$) rectangle ($(G.south east)+(0.1,-0.1)$);
+\end{tikzpicture}
+\end{frame}
+
+\subsection{Was ist der Job eines Tutors?}
+\begin{frame}
+ \frametitle{Was ist der Job eines Tutors?}
+ \begin{itemize}
+ \item Fragen zum Stoff beantworten
+ \begin{itemize}
+ \item Gerne auch \emph{etwas} darüber hinaus
+ \end{itemize}
+ \item Fragen zur Vorlesung beantworten
+ \begin{itemize}
+ \item z.B. Klausurmodalitäten
+ \end{itemize}
+ \item Übungsblätter korrigieren
+ \end{itemize}
+\end{frame}
+
+\subsection{Was ist nicht der Job eines Tutors?}
+\begin{frame}
+ \frametitle{Was ist \underline{nicht} der Job eines Tutors?}
+ \begin{itemize}
+ \item Vorlesung wiederholen
+ \item Bespaßung im Tutorium
+ \item Jeden durch die Klausur bringen
+ \item \dots oder die Korrektur der Klausur
+ \end{itemize}
+\end{frame}
+
+\subsection{Für was ist der Student verantwortlich?}
+\begin{frame}
+ \frametitle{Für was ist der Student verantwortlich?}
+ Der Student ist für sich selbst verantwortlich, also \dots
+ \begin{itemize}
+ \item \dots die rechtzeitige Übungsblattabgabe
+ \item \dots die Vor- und Nachbereitung der Vorlesung
+ \item \dots das Lernen der Inhalte
+ \item \dots die rechtzeitige Klausuranmeldung
+ \item \dots das Finden relevanter Informationen
+ \end{itemize}
+\end{frame}
+
+\subsection{Warnung!}
+
+\subsection{Erinnerungen}
+\begin{frame}{Erinnerungen}
+
+\begin{block}{Praktomat-Anmeldung}
+\url{https://praktomat.info.uni-karlsruhe.de/praktomat\_2012\_WS/}
+\begin{itemize}
+\item Deadline: \textbf{Freitag, 02. November 2012}
+\end{itemize}
+\end{block}
+
+\begin{block}{Disclaimer: \href{http://tinyurl.com/prog-disclaimer}{tinyurl.com/prog-disclaimer}}
+\begin{itemize}
+\item PDF im VAB
+\item Abgabe in den Briefkasten der Vorlesung Programmieren\\(Gebäude 50.34, Keller)
+\item Deadline: \textbf{Freitag, 02. November 2012}
+\end{itemize}
+\end{block}
+
+\begin{block}{Übungsschein \href{studium.kit.edu}{http://studium.kit.edu}}
+\begin{itemize}
+\item Anmeldung für den Übungsschein
+\item Deadline: \textbf{Sonntag, 31. März 2013}
+\end{itemize}
+\end{block}
+\end{frame}
+
+\subsection{Nicht abschreiben!}
+\begin{frame}{Nicht abschreiben!}
+\begin{alertblock}{Warnung!}
+\begin{itemize}
+\item \emph{\textbf{Nicht abschreiben!}}
+\item Schon bei \textbf{einmaligem} Nachweis verwirkt man die Chance auf den \textbf{Übungsschein}
+\item Ohne Schein darf man die \textbf{Abschlussaufgabe} nicht schreiben
+\item Nur mit beidem besteht man das \textbf{Modul Programmieren}
+\item Programmieren ist Teil der \textbf{Orientierungsprüfung}
+\item Ohne bestandene Orientierungsprüfung bis zum 3. Semester \textbf{fällt man aus dem Studium} und darf bundesweit das Studienfach nicht mehr belegen!
+\end{itemize}
+\end{alertblock}
+\end{frame}
+
+\subsection{Praktomat}
+\begin{frame}{Praktomat}
+ \begin{itemize}
+ \item Ihr könnt beliebig häufig Lösungen hochladen!
+ \item Ladet Teillösungen hoch
+ \begin{itemize}
+ \item[$\Rightarrow$] Sicherungskopie für euch
+ \item[$\Rightarrow$] Eine vergessene Deadline ist nicht ganz so ärgerlich
+ \end{itemize}
+ \item Rechnet nicht mit der Erreichbarkeit des Praktomaten
+ kurz vor der Deadline
+ \item \textbf{Disclaimer nicht vergessen!}
+ \end{itemize}
+\end{frame}
+
+\section{Was ist Programmieren?}
+\subsection{Algorithmen}
+\begin{frame}
+ \frametitle{Algorithmen}
+ \begin{block}{Allgemeines}
+ \begin{itemize}
+ \item Modul des 2. Semesters
+ \item 6 ECTS
+ \end{itemize}
+ \end{block}
+ \begin{block}{Themen}
+ \begin{itemize}
+ \item Sortieralgorithmen
+ \item Suchalgorithmen
+ \item Speicherplatz- und Laufzeitkomplexität
+ \item Weiterführende Datenstrukturen (Stack, Heap, B-Bäume, \dots)
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\subsection{SWT - Softwaretechnik}
+\begin{frame}
+ \frametitle{SWT - Softwaretechnik}
+ oder auch "`Programmieren im Großen"'
+ \begin{block}{Allgemeines}
+ \begin{itemize}
+ \item Modul des 2. Semesters
+ \item 6 ECTS
+ \end{itemize}
+ \end{block}
+ \begin{block}{Themen}
+ \begin{itemize}
+ \item Wie gehe ich die Entwicklung von Software an?
+ \item Wie strukturiere ich Programme?
+ \item Wie entwickle ich \emph{leicht} wartbare Software?
+ \item Entwurfsmuster
+ \item Wasserfallmodell, Scrum, V-Modell
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\subsection{Programmieren}
+\begin{frame}
+ \frametitle{Programmieren}
+ oder auch "`Programmieren im Kleinen"'
+ \begin{block}{Allgemeines}
+ \begin{itemize}
+ \item Modul des 1. Semesters
+ \item 5 ECTS
+ \item Teil der Orientierungsprüfung
+ \end{itemize}
+ \end{block}
+ \begin{block}{Themen}
+ \begin{itemize}
+ \item \textbf{Allgemeines}: Was ist eine if-Abfrage, was eine for- bzw. while-Schleife?
+ \item Wie mache ich meinen Code wartbar?
+ \item \textbf{Objektorientierung}: Was ist eine Klasse, was ein Objekt?
+ \item Modellierung von Problemen
+ \item \textbf{Elementare Datenstrukturen und -typen}: int, String, Array
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\section{Java}
+\subsection{Begriffe}
+\begin{frame}{Begriffe}
+ \begin{block}{JDK}
+ Das Java Development Kit (JDK) ist eines der von
+ Java-Entwicklern meistgenutzten Java-SDKs.\\
+ $[\dots]$ Nun wird eine angepasste freie Version als ihr nunmehr
+ offizieller Nachfolger unter dem Namen OpenJDK weitergeführt.
+ \end{block}
+
+ \begin{block}{JRE}
+ Die Java-Laufzeitumgebung (englisch: Java Runtime Environment, kurz JRE)
+ ist die Laufzeitumgebung der Java-Technik. Mit ihr werden
+ Programme (Java-Anwendungen) weitgehend unabhängig vom
+ darunter liegenden Betriebssystem ausgeführt.
+ \end{block}
+
+ Quelle: Wikipedia
+\end{frame}
+
+\subsection{Workflow}
+\framedgraphic{Workflow}{schaubild-java-workflow.png}
+
+\section{System einrichten}
+\subsection{Linux}
+\begin{frame}{Java unter Linux}
+ \begin{itemize}
+ \item Ubuntu: \href{http://wiki.ubuntuusers.de/Java/Installation}{UbuntuUsers.de}\\
+ \myCode{\$ sudo apt-get install openjdk-7-jre openjdk-7-jdk}
+ \item Arch: \href{https://wiki.archlinux.de/title/Java}{archlinux.de}\\
+ \myCode{\$ pacman -S jre7-openjdk}
+ \end{itemize}
+\end{frame}
+
+\subsection{Windows}
+\begin{frame}{Windows}
+ \begin{itemize}
+ \item \href{http://java.com/de/download/index.jsp}{java.com/download}
+ \end{itemize}
+ \includegraphics[width=100mm]{java-download.png}
+\end{frame}
+
+\begin{frame}{Windows - 32 oder 64 Bit Version?}
+ \menu{Start > Systemsteuerung} oder \keys{Windows + Pause}
+ \includegraphics{windows-systemsteuerung.png}
+\end{frame}
+
+\begin{frame}{Windows - cmd}
+ \begin{itemize}
+ \item Ausführen: \myCode{cmd}
+ \item \myCode{> javac -version}
+ \item \myCode{javac 1.7.0\_09} $\rightarrow$ hat geklappt
+ \item Sonst: javac zu PATH hinzufügen
+ \begin{enumerate}
+ \item Wo liegt "`javac.exe"'?\\(z.B. \directory{C:/Program Files/Java/jdk1.7.0\_09/bin/javac.exe})
+ \item Systemsteuerung (\keys{Windows + Pause})\\
+ \menu{Systemsteuerung > Erweiterte Systemeinstellungen > Umgebungsvariablen}
+ \item Zu "`Path"' durch \myCode{;} getrennt hinzufügen
+ \end{enumerate}
+ \end{itemize}
+\end{frame}
+
+\subsection{Java testen}
+\begin{frame}{Java testen}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=HelloWorld.java]{java}{HelloWorld.java}
+ \inputminted[linenos=false]{console}{Bash.sh}
+\end{frame}
+
+\subsection{Eclipse: Allgemeines}
+\begin{frame}{Eclipse: Allgemeines}
+ \begin{itemize}
+ \item Sehr komfortable Java-IDE:
+ \begin{itemize}
+ \item Syntaxhighlighting und Code-Vervollständigung
+ \item Automatisch korrektes Einrücken mit \keys{\ctrl + \shift + F})
+ \end{itemize}
+ \item Sehr groß (RAM \& HDD)
+ \item Startet Langsam
+ \item Müsst ihr in SWT verwenden
+ \item Download: \href{http://www.eclipse.org/}{eclipse.org}
+ \end{itemize}
+\end{frame}
+
+\subsection{Eclipse: Einrichten}
+\begin{frame}{Eclipse: Einrichten}
+ \begin{itemize}
+ \item \menu{Window > Open Perspective > Java}
+ \item \menu{Window > Show Toolbar}
+ \item \menu{Window > Preferences > General > Editors > Text Editors}
+ \begin{itemize}
+ \item Show line numbers
+ \item Print margin column: 120
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Zwischenstand}{eclipse-einrichten.png}
+
+\subsection{Eclipse: Erstes Projekt}
+\begin{frame}{Eclipse: Erstes Projekt}
+ \begin{itemize}
+ \item \menu{File > New > Java}: Projektname: HelloWorld
+ \item \menu{File > New > Class}: Name: HelloWorld
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Zwischenstand}{eclipse-projekt.png}
+
+\section{Wiederholung}
+\subsection{Begriffe}
+\begin{frame}{Begriffe}
+ Welche Begriffe habt ihr in der Vorlesung kennen gelernt?
+\end{frame}
+
+\begin{frame}{Begriffe}
+ \begin{itemize}
+ \item \textbf{Objekt}: Exemplar eines bestimmten Datentyps
+ \item \textbf{Klasse}: abstraktes Modell für eine Reihe von ähnlichen Objekten
+ \item \textbf{Variable}: Behälter für Werte
+ \item \textbf{Konstante}: Wert, der sich während der Laufzeit des Programms nicht ändern kann
+ \item \textbf{Attribut}: Eigenschaft eines konkreten Objekts
+ \item \textbf{Funktion}: Programmkonstrukt mit Parametern und Rückgabewert
+ \item \textbf{Methode}: Funktion in einem Objekt
+ \item \textbf{Datentyp}: Zusammenfassung von Objektmengen mit den darauf definierten Operationen
+ \item int, Integer
+ \item String
+ \item \dots
+ \end{itemize}
+\end{frame}
+
+\subsection{Beispiel für eine Klasse}
+\begin{frame}{Beispiel für eine Klasse}
+ \begin{block}{Schal}
+ \begin{itemize}
+ \item hat eine Farbe
+ \item besteht aus einem Stoff
+ \item hat eine Länge
+ \item kann warm halten
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\subsection{Java: Primitive Datentypen}
+\begin{frame}{Java: Primitive Datentypen}
+ \begin{tabular}{l|l|l}
+ Datentyp & Werte & Länge\\
+ \hline
+ \hline
+ boolean & \texttt{true} oder \texttt{false} & 1 Byte\\
+ char & 16-Bit Unicode Zeichen & 2 Byte\\
+ \hline
+ byte & $-2^7 =-128 \dots 2^7-1$ & 1 Byte\\
+ short & $-2^{15}=-32\,768 \dots 2^{15}-1$ & 2 Byte\\
+ int & $-2^{31}\approx-2 \cdot 10^9 \dots 2^{31}-1$ & 4 Byte\\
+ long & $-2^{63}=-9\cdot 10^{18} \dots 2^{63}-1$ & 8 Byte\\
+ \hline
+ float & single-precision 32-bit IEEE 754 floating point & 4 Byte\\
+ double & double-precision 64-bit IEEE 754 floating point & 8 Byte\\
+ \end{tabular}
+ \\
+ Quelle: \href{http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html}{docs.oracle.com}
+\end{frame}
+
+\subsection{Java: Enum}
+\begin{frame}{Java: Enum}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Day.java]{java}{Day.java}
+ Quelle: \href{http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html}{docs.oracle.com}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=SomeClass.java]{java}{SomeClass.java}
+\end{frame}
+
+\subsection{Java: String}
+\begin{frame}{Java: String}
+ \begin{itemize}
+ \item \textbf{Klasse} für Zeichenketten
+ \item UTF-16
+ \item max. $2^{31}-1 = 2\,147\,483\,647$ Zeichen (siehe \href{http://stackoverflow.com/a/816152/562769}{stackoverflow.com})
+ \begin{itemize}
+ \item King James Bible: $4\,397\,206$ Zeichen\\
+ (\href{http://printkjv.ifbweb.com/\#downloads}{Quelle} \& \myCode{wc -w file.txt})
+ \end{itemize}
+ \item weitere Informationen: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/String.html}{docs.oracle.com}
+ \end{itemize}
+\end{frame}
+
+\subsection{Java: Naming Conventions}
+\begin{frame}{Java: Naming Conventions}
+ \begin{itemize}
+ \item \myCode{camelCase} für Variablen und Attribute
+ \item \myCode{BIG\_AND\_FAT} für Konstanten
+ \item Typische Variablen- und Methodennamen:
+ \begin{itemize}
+ \item isSomething: Meist für \texttt{boolean}
+ \item hasSomething: Meist Methode mit Rückgabewert \texttt{boolean}
+ \item getValue: Getter, Wrapper für Attribut "`value"'
+ \item setValue: Setter, Wrapper für Attribut "`value"'
+ \end{itemize}
+ \item Genauer: \href{http://www.oracle.com/technetwork/java/codeconventions-150003.pdf}{orcacle.com}, ab S. 15
+ \end{itemize}
+\end{frame}
+
+\subsection{Aufgabenstellung}
+\begin{frame}{Aufgabenstellung}
+ \begin{alertblock}{Bitte achtet auf folgendes:}
+ \begin{itemize}
+ \item Einsatz sinnvoller Datentypen
+ \item aussagekräftige Attributnamen
+ \item Einrückungen, Namenskonventionen, Dokumentation
+ \end{itemize}
+ \end{alertblock}
+\end{frame}
+
+\section{Abspann}
+\subsection{Hinweise zum Übungsblatt}
+ \begin{frame}{Hinweise zum Übungsblatt}
+ \begin{itemize}
+ \item Aufgaben online im \textbf{Praktomaten} oder im \textbf{VAB}
+ \item Abgabetermin: Montag, der \textbf{5. November 2012, 13 Uhr}
+ \item Abgabe online im Praktomaten\\
+ Uni-Netz oder VPN erforderlich!
+ \item min. \textbf{50 \% der Gesamtpunktzahl} zum Bestehen des Scheins\\
+ (ca. 60 Punkte)
+ \item \textbf{keine Bibliotheken} verwenden, die im Übungsblatt nicht explizit zugelassen wurden
+ \item keine ungewollte Funktionalität einbauen – es gilt die Devise:\\ \textbf{Einfache Fragen erfordern einfache Antworten!}
+ \end{itemize}
+\end{frame}
+
+\subsection{Dropbox Space Race}
+ \begin{frame}{Dropbox Space Race}
+ \begin{itemize}
+ \item Hat nichts mit Programmieren zu tun
+ \item Bei \href{https://www.dropbox.com/spacerace}{dropbox.com} anmelden
+ \item KIT ist auf Platz 3, RWTH Aachen und TU München vor uns
+ \end{itemize}
+\end{frame}
+
+\subsection{Comic}
+\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/Teach-yourself-C++-in-21-days.png}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/uTorrent.png b/presentations/Programmieren-Tutorium/Tutorium-01/uTorrent.png
new file mode 100755
index 0000000..c0ea66f
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/uTorrent.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-01/windows-systemsteuerung.png b/presentations/Programmieren-Tutorium/Tutorium-01/windows-systemsteuerung.png
new file mode 100755
index 0000000..66ad758
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-01/windows-systemsteuerung.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Baby-02.java b/presentations/Programmieren-Tutorium/Tutorium-02/Baby-02.java
new file mode 100644
index 0000000..1c24429
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Baby-02.java
@@ -0,0 +1,28 @@
+public class Baby {
+ /**
+ * Write something in the constructor
+ * @param weight set weight in gramm
+ * @param size the size in cm
+ * @param loudness the loudnes in dB
+ */
+ public Baby(int weight, int size, float loudness) {
+ super();
+ this.name = name;
+ this.weight = weight;
+ this.size = size;
+ this.loudness = loudness;
+ }
+
+ /** Der Vor- und Nachname des Babys */
+ public String name;
+
+ /** Gewicht in Gramm */
+ public int weight;
+
+ /** Größe in cm */
+ public int size;
+
+ /** Lautstärke in dB */
+ public float loudness;
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Baby.java b/presentations/Programmieren-Tutorium/Tutorium-02/Baby.java
new file mode 100644
index 0000000..d8cd01f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Baby.java
@@ -0,0 +1,14 @@
+public class Baby {
+ /** Der Vor- und Nachname des Babys */
+ public String name;
+
+ /** Gewicht in Gramm */
+ public int weight;
+
+ /** Größe in cm */
+ public int size;
+
+ /** Lautstärke in dB */
+ public float loudness;
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Bool-02.java b/presentations/Programmieren-Tutorium/Tutorium-02/Bool-02.java
new file mode 100644
index 0000000..254011f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Bool-02.java
@@ -0,0 +1,11 @@
+public class Bool {
+ public static void main(String[] v) {
+ int x = 42;
+
+ if (x = x + 42) {
+ System.out.println("Das Leben");
+ } else {
+ System.out.println("Das Universum");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Bool.java b/presentations/Programmieren-Tutorium/Tutorium-02/Bool.java
new file mode 100644
index 0000000..e87fcc1
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Bool.java
@@ -0,0 +1,21 @@
+public class Bool {
+ public static void main(String[] v) {
+ boolean a = true;
+ boolean b = false;
+ boolean c = true;
+ int d = 0;
+ boolean e = false;
+
+ if (a && b && c) {
+ System.out.println("Alpha");
+ }
+
+ if (d) {
+ System.out.println("Beta");
+ }
+
+ if (a||b && b||e) {
+ System.out.println("Gamma");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Makefile b/presentations/Programmieren-Tutorium/Tutorium-02/Makefile
new file mode 100644
index 0000000..61b58f8
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-02
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Math.java b/presentations/Programmieren-Tutorium/Tutorium-02/Math.java
new file mode 100644
index 0000000..8b96999
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Math.java
@@ -0,0 +1,9 @@
+public final class Math {
+ private Math() {}
+
+ public static final double E = 2.7182818284590452354;
+
+ public static final double PI = 3.14159265358979323846;
+
+ // [..]
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Shark-constructor.java b/presentations/Programmieren-Tutorium/Tutorium-02/Shark-constructor.java
new file mode 100644
index 0000000..5c27cdb
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Shark-constructor.java
@@ -0,0 +1,11 @@
+public class Shark {
+ private int size;
+
+ // constructor
+ public Shark(int size) {
+ this.size = size;
+ }
+}
+
+// initializes object
+Shark erik = new Shark(25);
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/Shark.java b/presentations/Programmieren-Tutorium/Tutorium-02/Shark.java
new file mode 100644
index 0000000..02bb49a
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/Shark.java
@@ -0,0 +1,17 @@
+public class Shark {
+ // attributes
+ private Laser laserAttachedToHead;
+
+ // methods
+ public void attack(Enemy e) {
+ this.laserAttachedToHead.fire(e);
+ }
+
+ private void eat() {
+ // rawr!
+ }
+}
+
+// invoke method
+Shark erik = new Shark();
+erik.attack(somalianPirate);
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/String-01.java b/presentations/Programmieren-Tutorium/Tutorium-02/String-01.java
new file mode 100644
index 0000000..98ae262
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/String-01.java
@@ -0,0 +1,3 @@
+String myVar = "Hallo"; // String mit Inhalt
+String myVar2 = new String(); // leerer String
+String myVar3 = ""; // auch ein leerer String
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/String-02.java b/presentations/Programmieren-Tutorium/Tutorium-02/String-02.java
new file mode 100644
index 0000000..39bda1f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/String-02.java
@@ -0,0 +1,6 @@
+String myVar = "Hallo";
+String myVar2 = "Welt";
+
+// Verknuepfen von Strings
+String result1 = myVar + " " + myVar2 ;
+String result2 = myVar2 + "+" + myVar2 ;
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/String-03.java b/presentations/Programmieren-Tutorium/Tutorium-02/String-03.java
new file mode 100644
index 0000000..75bdd3f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/String-03.java
@@ -0,0 +1 @@
+String = "Hallo \"Welt\"";
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/String-04.java b/presentations/Programmieren-Tutorium/Tutorium-02/String-04.java
new file mode 100644
index 0000000..e5c3ea8
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/String-04.java
@@ -0,0 +1 @@
+String = "Hallo \n Welt";
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/String-05.java b/presentations/Programmieren-Tutorium/Tutorium-02/String-05.java
new file mode 100644
index 0000000..ba8060f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/String-05.java
@@ -0,0 +1 @@
+String = "Hallo \\ Welt";
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/comparisons.js b/presentations/Programmieren-Tutorium/Tutorium-02/comparisons.js
new file mode 100644
index 0000000..c0827c0
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/comparisons.js
@@ -0,0 +1,12 @@
+'' == '0' // false
+0 == '' // true
+0 == '0' // true
+
+false == 'false' // false
+false == '0' // true
+
+false == undefined // false
+false == null // false
+null == undefined // true
+
+' \t\r\n ' == 0 // true
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/eclipse-icon.png b/presentations/Programmieren-Tutorium/Tutorium-02/eclipse-icon.png
new file mode 100644
index 0000000..a8cf04a
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-02/eclipse-icon.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/index.htm b/presentations/Programmieren-Tutorium/Tutorium-02/index.htm
new file mode 100644
index 0000000..58cb095
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/index.htm
@@ -0,0 +1,47 @@
+
+
+
+ Snake
+
+
+
+
+
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/static-01.java b/presentations/Programmieren-Tutorium/Tutorium-02/static-01.java
new file mode 100644
index 0000000..c531111
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/static-01.java
@@ -0,0 +1,7 @@
+int var = Jeep.ANZAHLRAEDER ; // Zugriff wie er sein sollte
+
+Jeep myJeep = new Jeep ( ) ; // Objekterzeugung
+
+int var2 = myJeep.ANZAHLRAEDER ; // Zugriff wie er nicht sein sollte
+// ... geth aber
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/syntax-error.png b/presentations/Programmieren-Tutorium/Tutorium-02/syntax-error.png
new file mode 100644
index 0000000..299c74a
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-02/syntax-error.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-02/tutorium-02.tex b/presentations/Programmieren-Tutorium/Tutorium-02/tutorium-02.tex
new file mode 100644
index 0000000..a7e7c4e
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-02/tutorium-02.tex
@@ -0,0 +1,276 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+
+% use KIT-Theme
+% see http://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen
+%\usetheme{Frankfurt} % see http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html as fallback
+\InputIfFileExists{../templates/beamerthemekit.sty}{\usepackage{../templates/beamerthemekit}}{\usetheme{Frankfurt}}
+\usefonttheme{professionalfonts}
+
+\usepackage{hyperref}
+\usepackage{lmodern}
+\usepackage{listings}
+\usepackage{wrapfig} % see http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions
+\usepackage[utf8]{inputenc} % this is needed for german umlauts
+\usepackage[ngerman]{babel} % this is needed for german umlauts
+\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf
+\usepackage{verbatim}
+\usepackage{relsize}
+\usepackage{subfigure}
+\usepackage{algorithm,algpseudocode}
+\usepackage{minted} % needed for the inclusion of source code
+\usepackage{xcolor}
+\usepackage{tabularx}
+\usepackage{wrapfig}
+\usepackage{../templates/myStyle}
+
+\newcommand\tutor{Martin Thoma}
+\newcommand\tutNR{10}
+\newcommand\titleText{Programmieren-Tutorium Nr. \tutNR{} bei \tutor}
+\institute{Fakultät für Informatik}
+
+\hypersetup{pdftitle={\titleText}}
+\beamertemplatenavigationsymbolsempty
+
+\newcommand\InsertToC[1][]{
+ \begin{frame}{Outline}
+ \tableofcontents[subsectionstyle=show/show/show, subsubsectionstyle=show/show/show, #1]
+ \end{frame}
+}
+
+\begin{document}
+\title{\titleText}
+\subtitle{TODO: Subtitle setzen!}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+%\AtBeginSection[]{
+% \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection
+%}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Bool.java, fontsize=\tiny]{java}{Bool.java}
+ \begin{itemize}
+ \item Was ist die Ausgabe?
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \end{itemize}
+\end{frame}
+
+\subsection{Compiler-Fehler}
+\begin{frame}{Compiler-Fehler}
+ \begin{itemize}[<+->]
+ \item Treten bei "`offensichtlichen"' Fehlern auf
+ \item Eclipse beschwert sich: \includegraphics{eclipse-icon.png}.\\
+ Häufige Fehler:
+ \begin{itemize}
+ \item \myCode{[foo] cannot be resolved to a type}: Klassenname nicht definiert? Falsch geschrieben?
+ \item \myCode{[foo] cannot be resolved}: Die Variable \myCode{foo} wurde nicht deklariert
+ \end{itemize}
+ \item Es kann kein gülter Java Byte-Code erstellt werden
+ \end{itemize}
+\end{frame}
+
+\subsection{Syntax-Fehler}
+\begin{frame}{Syntax-Fehler}
+ \begin{itemize}[<+->]
+ \item Eclipse beschwert sich: \includegraphics{syntax-error.png}
+ \item Eine Klasse von Compiler-Fehlern
+ \end{itemize}
+\end{frame}
+
+\subsection{Laufzeit-Fehler}
+\begin{frame}{Laufzeit-Fehler}
+ \begin{itemize}[<+->]
+ \item Schwer(er) zu finden
+ \item Gültiger Byte-Code kann erzeugt werden
+ \item Muss nicht immer auftreten
+ \item Eclipse beschwert sich nicht
+ \end{itemize}
+\end{frame}
+
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Bool.java, fontsize=\tiny]{java}{Bool-02.java}
+ \begin{itemize}
+ \item Was ist die Ausgabe?
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \end{itemize}
+\end{frame}
+
+\subsection{Java vs. JavaScript}
+\begin{frame}{Java vs. JavaScript}
+ \begin{tabularx}{\textwidth}{X|X}
+ Java & JavaScript \\
+ \hline
+ \hline
+ Keine Scriptsprache & Definitiv Scriptsprache\\
+ statisch typisiert & dynamisch typisiert\\
+ Klassen & Prototypen\\
+ Blockbasiertes Scoping & Funktionsbasiertes Scoping\\
+ \dots & \dots
+ \end{tabularx}
+\end{frame}
+
+\subsection{Java vs. JavaScript}
+\begin{frame}{Java vs. JavaScript}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=comparisons.js, fontsize=\tiny]{javascript}{comparisons.js}
+\end{frame}
+
+\subsection{Snake}
+\begin{frame}{Snake}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=comparisons.js, fontsize=\tiny,firstline=9,firstnumber=9]{javascript}{index.htm}
+\end{frame}
+
+\section{Wiederholung}
+\subsection{String erzeugen}
+\begin{frame}{String erzeugen}
+ \myCode{String} ist eine Java-Klasse, aber \dots:
+ \inputminted[linenos, numbersep=5pt, tabsize=4]{java}{String-01.java}
+\end{frame}
+
+\subsection{String konkatenieren}
+\begin{frame}{String konkatenieren}
+ String ist kein primitiver Datentyp! Trotzdem kann man "`rechnen"':
+ \inputminted[linenos, numbersep=5pt, tabsize=4]{java}{String-02.java}
+\end{frame}
+
+\subsection{String und Escape-Zeichen}
+\begin{frame}{String und Escape-Zeichen}
+ String mit Inhalt \myCode{Hallo "Welt"'}:
+ \inputminted[linenos, numbersep=5pt, tabsize=4]{java}{String-03.java}
+ \vspace{6 mm}
+ \visible<2->{
+ String mit Zeilenumbruch:
+ \inputminted[linenos, numbersep=5pt, tabsize=4]{java}{String-04.java}
+ }
+ \vspace{6 mm}
+ \visible<3->{
+ String mit Inhalt \myCode{Hallo \textbackslash{} Welt}:
+ \inputminted[linenos, numbersep=5pt, tabsize=4]{java}{String-05.java}
+ }
+\end{frame}
+
+\subsection{Methoden}
+\begin{frame}{Methoden}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Shark.java, fontsize=\tiny]{java}{Shark.java}
+ {\tiny Quelle: \href{http://kit.trvx.org/build/tutorial-02.html\#/7}{kit.trvx.org}}
+ \newline
+ \newline
+ Wie kann man Erik auffordern zu essen?
+\end{frame}
+
+\subsection{Konstruktoren}
+\begin{frame}{Konstruktoren}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Shark.java, fontsize=\tiny]{java}{Shark-constructor.java}
+ {\tiny Quelle: \href{http://kit.trvx.org/build/tutorial-02.html\#/8}{kit.trvx.org}}
+ \newline
+ \newline
+ \begin{itemize}
+ \item Was ist die Konstruktorsignatur?
+ \item Was ist shadowing und warum benutzt man 'this'?
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Konstruktoren}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Shark.java, fontsize=\tiny]{java}{Shark-constructor.java}
+ {\tiny Quelle: \href{http://kit.trvx.org/build/tutorial-02.html\#/8}{kit.trvx.org}}
+ \newline
+ \newline
+ \begin{itemize}
+ \item Konstruktorsignatur $\rightarrow$ \myCode{public Shark(int size)}
+ \item Shadowing und 'this' $\rightarrow$ Variable \myCode{size} verbirgt das Attribut \myCode{size}
+ $\Rightarrow$ das Attribut wird über \myCode{this.size aufgerufen}
+ \end{itemize}
+\end{frame}
+
+\subsection{static}
+\begin{frame}{static}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Math.java, fontsize=\tiny]{java}{Math.java}
+ {\tiny Quelle: \href{http://www.docjar.com/html/api/java/lang/Math.java.html}{docjar.com}}
+ \newline
+ \newline
+ \visible<2->{
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=leftline, fontsize=\tiny]{java}{static-01.java}
+ }
+\end{frame}
+
+\section{Werbeblock}
+\subsection{Bundeswettbewerb Informatik}
+\begin{frame}{Bundeswettbewerb Informatik}
+ \begin{itemize}[<+->]
+ \item Unbedingt Teilnehmen:
+ \begin{itemize}
+ \item Spielerische Einführung ins Lösen algorithmischer Probleme
+ \item Sehr lehrreich
+ \item Preise (Sachpreise, Fahrt zur Endrunde, Geld, Studienstiftung)
+ \item Kontakte
+ \end{itemize}
+ \item "`Insider-Hinweise"' auf \href{http://martin-thoma.com/bundeswettbewerb-informatik/}{martin-thoma.com}
+ \item Offizielles und Aufgaben unter \href{http://www.bundeswettbewerb-informatik.de/}{bundeswettbewerb-informatik.de}
+ \end{itemize}
+\end{frame}
+
+\section{Praxis}
+\subsection{Aufgabe 1a)}
+\begin{frame}{Aufgabe 1a)}
+ Entwerfen Sie eine Klasse Baby mit den Attributen Name, Gewicht,
+ Größe und Lautstärke (eventuell fallen Ihnen weitere sinnvolle
+ Attribute ein).
+\end{frame}
+
+\subsection{Aufgabe 1a) - Lösung}
+\begin{frame}{Aufgabe 1a) - Lösung}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Baby.java, fontsize=\tiny]{java}{Baby.java}
+\end{frame}
+
+\subsection{Aufgabe 1b)}
+\begin{frame}{Aufgabe 1b)}
+ Schreiben Sie einen Konstruktor für ihre Baby-Klasse. Der Name
+ soll nicht in den Konstruktur.
+\end{frame}
+
+\subsection{Aufgabe 1b) - Lösung}
+\begin{frame}{Aufgabe 1b) - Lösung}
+ \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=Baby.java, fontsize=\tiny]{java}{Baby-02.java}
+\end{frame}
+
+\subsection{Aufgabe 1c)}
+\begin{frame}{Aufgabe 1c)}
+ Schreiben Sie eine \texttt{main}-Methode und instanzieren Sie Babies.
+\end{frame}
+
+\subsection{Aufgabe 1d)}
+\begin{frame}{Aufgabe 1d)}
+ Erweitern Sie die Klasse \texttt{Baby} um ein Attribut "`Geschlecht"'.\\
+
+ Jedes Mädchen ohne Taufe ({\tiny also ohne weitere Namenszuweisung})
+ soll bei der Geburt ({\tiny also der Objekterstellung}) den Namen "`Anna"'
+ bekommen, jeder Junge den Namen "`Bob"'.
+\end{frame}
+
+\section{Abspann}
+\subsection{Kontrolle}
+\begin{frame}{Kontrolle}
+ Habt ihr \dots
+ \begin{itemize}
+ \item[\dots] den Disclaimer abgegeben? {\tiny Deadline: Freitag, 02. November 2012}
+ \item[\dots] euch für die Klausur angemeldet? {\tiny vernünftige Deadline: Noch dieses Jahr!}
+ \item[\dots] das Übungsblatt angefangen? {\tiny Deadline: Montag, 05. November 2012, 13 Uhr}
+ \end{itemize}
+\end{frame}
+\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/hello-world-cartoon.jpg}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/JavaDoc.java b/presentations/Programmieren-Tutorium/Tutorium-03/JavaDoc.java
new file mode 100644
index 0000000..889d1e4
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/JavaDoc.java
@@ -0,0 +1,22 @@
+/**
+ * Sets the tool tip text.
+ *
+ * @param text the text of the tool tip
+ */
+public void setToolTipText(String text) {
+}
+
+/**
+ * Registers the text to display in a tool tip. The text
+ * displays when the cursor lingers over the component.
+ *
+ * @param text the string to display. If the text is null,
+ * the tool tip is turned off for this component.
+ */
+public void setToolTipText(String text) {
+}
+
+int level, size;
+
+int level; // indentation level
+int size; // size of table
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/Kontrollstrukturen.java b/presentations/Programmieren-Tutorium/Tutorium-03/Kontrollstrukturen.java
new file mode 100644
index 0000000..a9e3416
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/Kontrollstrukturen.java
@@ -0,0 +1,49 @@
+if () {
+ // Anweisung für ' ist wahr'
+} else {
+ // Anweisung für ' ist falsch'
+}
+
+if () {
+ // Anweisung für ' ist wahr'
+} else if () {
+ // Anweisung für ' ist wahr'
+} else {
+ // Anweisung für ' ist falsch'
+}
+
+public class World {
+ public static void main(String[] a) {
+ int monat = 12;
+ switch (monat) {
+ case 1:
+ System.out.println("Es ist Januar!");
+ break;
+ case 2:
+ System.out.println("Es ist Februar!");
+ break;
+ case 3:
+ System.out.println("Es ist März!");
+ break;
+ default:
+ // Anweisung, wenn monat keinen angegebener Wert angenommen hat.
+ System.out.println("Es ist Weihnachten!");
+ }
+ }
+}
+
+while(true) {
+ System.out.println("It's true!");
+}
+
+for (int i = 0; i < 10; i++) {
+ System.out.println(i);
+}
+
+while (bedingung) {
+ // Anweisungen werden ausgeführt, solange bedingung == true
+}
+
+do {
+ // Anweisungen werden ausgeführt, solange bedingung == true
+} while (bedingung);
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/Makefile b/presentations/Programmieren-Tutorium/Tutorium-03/Makefile
new file mode 100644
index 0000000..33a86f5
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-03
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/Quiz-Answer.sh-session b/presentations/Programmieren-Tutorium/Tutorium-03/Quiz-Answer.sh-session
new file mode 100644
index 0000000..063ca0f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/Quiz-Answer.sh-session
@@ -0,0 +1,5 @@
+user@pc:~/Tutorium-03$ javac Quiz.java
+Quiz.java:5: variable b might not have been initialized
+ if (a == b) {
+ ^
+1 error
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/Quiz.java b/presentations/Programmieren-Tutorium/Tutorium-03/Quiz.java
new file mode 100644
index 0000000..8938fc8
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/Quiz.java
@@ -0,0 +1,11 @@
+public class Quiz {
+ public static void main(String[] args) {
+ String a = "";
+ String b;
+ if (a == b) {
+ System.out.println("Nyan Cat");
+ } else {
+ System.out.println("42");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/QuizIf.java b/presentations/Programmieren-Tutorium/Tutorium-03/QuizIf.java
new file mode 100644
index 0000000..c9b53f0
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/QuizIf.java
@@ -0,0 +1,13 @@
+public class QuizIf {
+ public static void main(String[] a) {
+ int monat = 12;
+
+ if (monat == 12) {
+ System.out.println("12");
+ } else if (monat / 2 == 6) {
+ System.out.println("6");
+ } else {
+ System.out.println("2");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/Visibility.java b/presentations/Programmieren-Tutorium/Tutorium-03/Visibility.java
new file mode 100644
index 0000000..4e65cd7
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/Visibility.java
@@ -0,0 +1,39 @@
+public class Student {
+ // die Attribute sind nun nach außen nicht mehr sichtbar
+ private String name;
+ private int semester;
+ private int matriculationNumber;
+
+ public Student(String name, int semester, int matriculationNumber) {
+ // hier wird wie gewohnt alles initialisiert
+ }
+}
+
+public class Main {
+ public static void main(String[] args) {
+ Student maxMustermann = new Student("Max Mustermann", 3, 1234567);
+ // hier bekommt man nun einen Compilerfehler
+ maxMustermann.matriculationNumber = 3141592;
+ // ...
+ }
+}
+
+public class Student {
+ // ... Attribute, Konstruktor usw. ...
+
+
+ // die getter-Methode für das Attribute 'name'
+ public String getName() {
+ return this.name;
+ }
+ // ... weitere getter-Methoden usw. ...
+}
+
+public class Main {
+ public static void main(String[] args) {
+ Student maxMustermann = new Student("Max Mustermann", 3, 1234567);
+ // liest den Namen und gibt ihn aus
+ System.out.println(maxMustermann.getName());
+ // ...
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/eclipse-getter-setter.png b/presentations/Programmieren-Tutorium/Tutorium-03/eclipse-getter-setter.png
new file mode 100644
index 0000000..8899bb7
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-03/eclipse-getter-setter.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/singleLines.java b/presentations/Programmieren-Tutorium/Tutorium-03/singleLines.java
new file mode 100644
index 0000000..09ff829
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/singleLines.java
@@ -0,0 +1,6 @@
+int[] myArray; // Integer-Array
+int[] myArray = new int[3]; // Array mit 3 int-Werten
+int[] myArray = {5, 3, 1}; // Definiere die Werte des Arrays
+// -> Größe ist implizit gegeben
+String[] myStringArray;
+String myStringArray[];
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/stringly-typed.jpg b/presentations/Programmieren-Tutorium/Tutorium-03/stringly-typed.jpg
new file mode 100644
index 0000000..6d9bcce
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-03/stringly-typed.jpg differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/tutorium-03.tex b/presentations/Programmieren-Tutorium/Tutorium-03/tutorium-03.tex
new file mode 100644
index 0000000..3667ea0
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-03/tutorium-03.tex
@@ -0,0 +1,462 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+
+% use KIT-Theme
+% see http://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen
+%\usetheme{Frankfurt} % see http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html as fallback
+\InputIfFileExists{../templates/beamerthemekit.sty}{\usepackage{../templates/beamerthemekit}}{\usetheme{Frankfurt}}
+\usefonttheme{professionalfonts}
+
+\usepackage{hyperref}
+\usepackage{lmodern}
+\usepackage{listings}
+\usepackage{wrapfig} % see http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions
+\usepackage[utf8]{inputenc} % this is needed for german umlauts
+\usepackage[ngerman]{babel} % this is needed for german umlauts
+\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf
+\usepackage{verbatim}
+\usepackage{relsize}
+\usepackage{subfigure}
+\usepackage{algorithm,algpseudocode}
+\usepackage{minted} % needed for the inclusion of source code
+\usepackage{xcolor}
+\usepackage{menukeys}
+\usepackage{../templates/myStyle}
+
+\newcommand\tutor{Martin Thoma}
+\newcommand\tutNR{10}
+\newcommand\titleText{Programmieren-Tutorium Nr. \tutNR{} bei \tutor}
+\institute{Fakultät für Informatik}
+
+\hypersetup{pdftitle={\titleText}}
+\beamertemplatenavigationsymbolsempty
+
+\newcommand\InsertToC[1][]{
+ \begin{frame}{Outline}
+ \tableofcontents[subsectionstyle=show/show/show, subsubsectionstyle=show/show/show, #1]
+ \end{frame}
+}
+
+\begin{document}
+\title{\titleText}
+\subtitle{Eclipse, Arrays, Kontrollstrukturen und Konventionen}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+%\AtBeginSection[]{
+% \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection
+%}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Quiz.java}
+ \begin{itemize}
+ \item Was ist die Ausgabe?
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \end{itemize}
+\end{frame}
+
+\subsection{Quiz: Antwort}
+\begin{frame}{Quiz: Antwort}
+ Ein Compiler-Fehler:
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{console}{Quiz-Answer.sh-session}
+\end{frame}
+
+
+
+\section{Eclipse}
+\subsection{Frühere Folien}
+\begin{frame}{Frühere Folien}
+ \begin{itemize}
+ \item Installation (für Windows): \href{http://www.eclipse.org/}{eclipse.org}
+ \item \menu{Window > Open Perspective > Java}
+ \item \menu{Window > Show Toolbar}
+ \item \menu{Window > Preferences > General > Editors > Text Editors}
+ \begin{itemize}
+ \item Show line numbers
+ \item Print margin column: 120
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\subsection{Checkstyle: Installation}
+\begin{frame}{Checkstyle: Installation}
+ \begin{itemize}
+ \item Internetverbindung wird benötigt!
+ \item \menu{Help > Install New Software}
+ \item Work with: \myCode{http://eclipse-cs.sf.net/update/}
+ \item Klick auf \menu{Add...}
+ \item Name: "`Checkstyle"'
+ \item Warten
+ \item Nun sollten zwei Einträge erscheinen
+ \item "`Checkstyle"' auswählen
+ \item auf \menu{Next} klicken (und dann nochmal)
+ \item "`I accept the terms of the licence agreement"'
+ \item auf \menu{Finish} klicken und dann herunterladen lassen
+ \item "`Warning: You are installing software [...]"' $\rightarrow$ klick auf \menu{OK}
+ \item Eclipse neustarten lassen (Klick auf \menu{Yes})
+ \end{itemize}
+\end{frame}
+
+\subsection{Checkstyle: Einrichten}
+\begin{frame}{Checkstyle: Einrichten}
+ \begin{itemize}
+ \item "`Checkstyle.xml"' herunterladen: \href{https://raw.github.com/MartinThoma/prog-ws1213/master/Dokumente/whitespace-checks.xml}{tinyurl.com/checkstyle-ws}
+ \end{itemize}
+ Bei jeden Java-Projekt wieder:
+ \begin{itemize}
+ \item \menu{Project > Properties > Checkstyle}
+ \item Check "`checkstyle active for this project"'
+ \item Reiter \menu{Local Check Configurations}
+ \item \menu{New\dots}
+ \begin{itemize}
+ \item Type: "`Internal Configuration"'
+ \item Name: "`KIT Checkstyle"'
+ \item \menu{Import} $\rightarrow$ "`checkstyle.xml"' auswählen
+ \item \menu{OK} klicken
+ \end{itemize}
+ \item Reiter \menu{Main} auswählen
+ \item "`KIT Checkstyle - (Local)"' auswählen
+ \item \menu{OK} klicken
+ \item "`The project needs to be rebuild [...]"' $\rightarrow$ \menu{Yes}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Checkstyle: Einrichten}
+ Nochmal mit Screenshots: \href{http://martin-thoma.com/checkstyle/}{martin-thoma.com/checkstyle}
+\end{frame}
+
+\section{Arrays}
+\subsection{Was sind Arrays ...}
+\begin{frame}{Was sind Arrays ...}
+ ... und wozu braucht man sie?
+ \begin{itemize}
+ \item viele Werte in einem Variablennamen
+ \item Elemente haben alle den selben Typ
+ \item[$\Rightarrow$] zu jeden Typen gibt es Arrays
+ \end{itemize}
+\end{frame}
+
+\subsection{Visualisierung}
+\begin{frame}{Visualisierung}
+ \includegraphics[height=30mm]{array.pdf}
+ \begin{itemize}
+ \item Indices: 0, 1, 2, 3, 4
+ \item Länge des Arrays: 5
+ \item Erstes Element: d
+ \end{itemize}
+\end{frame}
+
+\subsection{Minimalbeispiele}
+\begin{frame}{Minimalbeispiele}
+Deklarieren:
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4,firstline=1, lastline=1, fontsize=\small]{java}{singleLines.java}
+\vspace{5 mm}
+Deklarieren und instanziieren:
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4,firstline=2, lastline=2, fontsize=\small]{java}{singleLines.java}
+\vspace{5 mm}
+Deklarieren und initialisieren:
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4,firstline=3, lastline=4, fontsize=\small]{java}{singleLines.java}
+\end{frame}
+
+\subsection{Konvention}
+\begin{frame}{Konvention}
+ \begin{itemize}
+ \item[(A)] Geht, soll man aber nicht machen:
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4,firstline=6, lastline=6, fontsize=\small]{java}{singleLines.java}
+ \item[(B)] So ist es gut:
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4,firstline=5, lastline=5, fontsize=\small]{java}{singleLines.java}
+ \end{itemize}
+
+ \only<2->{
+ Warum ist Variante (B) besser?
+ \begin{itemize}
+ \item<3-> Der Entwicker kann sofort den Typen sehen
+ \item<4-> \href{http://stackoverflow.com/q/13175193/562769}{Konvention}
+ \end{itemize}
+ }
+\end{frame}
+
+\subsection{Ressourcen}
+\begin{frame}{Ressourcen}
+ \begin{itemize}
+ \item \href{http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf}{JLS 7}: Ab S. 291
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html}{Java 7 API}
+ \item \href{http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html}{Java Tutorial}
+ \end{itemize}
+\end{frame}
+
+\section{Random Style Guide}
+\subsection{Antipattern: Yoda-Conditions}
+\begin{frame}{Antipattern: Yoda-Conditions}
+ \includegraphics[width=60mm]{yoda-condition.png}\\
+ \begin{quote}
+ Using \myCode{if(constant == variable)} instead of
+ \myCode{if(variable == constant)}, like \myCode{if(4 == foo)}.
+ Because it's like saying ``if blue is the sky'' or ``if tall
+ is the man''.
+ \end{quote}
+ Source: \href{http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html}{codinghorror.com}\\
+
+ Bitte nicht machen!
+\end{frame}
+
+\subsection{Deklarationen}
+\begin{frame}{Deklarationen}
+ \begin{itemize}
+ \item 1 $\frac{\text{Deklaration}}{\text{Zeile}}$\\
+ \vspace{4mm}
+ Nicht so:
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=19, lastline=19]{java}{JavaDoc.java}
+ \vspace{4mm}
+ Sondern so:
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=21, lastline=22]{java}{JavaDoc.java}
+ \item Variablen immer dort initialisieren, wo sie deklariert werden\\
+ Ausnahme: Initialisierungswert ist von vorherigen Berechnungen abhängig
+ \end{itemize}
+\end{frame}
+
+\subsection{Antipattern: Stringly Typed}
+\begin{frame}{Antipattern: Stringly Typed}
+\begin{wrapfigure}{r}{3.1cm}
+ \includegraphics[width=3cm]{stringly-typed.jpg}
+\end{wrapfigure}
+
+Used to describe an implementation that \\
+needlessly relies on strings.\\
+\vspace{2cm}
+Excessively stringly typed code is usually\\
+a pain to understand and detonates at \\
+runtime with errors that the compiler would \\
+normally find.
+
+Source: \href{http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html}{codinghorror.com}
+\end{frame}
+
+\section{Getter/Setter}
+\subsection{Allgemeines}
+\begin{frame}{Allgemeines}
+ Getter und Setter sind \dots
+ \begin{itemize}[<+->]
+ \item \dots Methoden
+ \item \dots ein "`Interface"'
+ \item \dots \href{http://de.wikipedia.org/wiki/Zugriffsfunktion}{Zugriffsfunktionen} zur Abfrage und Änderung
+ \end{itemize}
+\end{frame}
+
+\subsection{Warum Getter/Setter?}
+\begin{frame}{Warum Getter/Setter?}
+ Vorteile von Getter und Setter-Methoden sind \dots
+ \begin{itemize}[<+->]
+ \item \dots (später auftretende) Nebenbedingungen beim get / set
+ \item \dots Validierung bei set
+ \item \dots Verbergen der Implementierung $\rightarrow$ Geheimnisprinzip
+ \end{itemize}
+\end{frame}
+
+\subsection{Modifikatoren}
+\begin{frame}{Modifikatoren}
+ \begin{block}{Zugriffsmodifikatoren}
+ Mit Hilfe von \textbf{Zugriffsmodifikatoren} (access modifiers) lassen sich die
+ \textbf{Sichtbarkeiten} von Programmteilen regeln:
+ \begin{itemize}
+ \item \textbf{public} Element: Element ist für alle Klassen sichtbar
+ \item<2-> \textbf{private} Element: Element ist nur innerhalb seiner Klasse sichtbar
+ \item<3-> \textbf{protected} Element: Element ist nur innerhalb seiner Klasse, deren
+ Subklassen und allen Klassen im selben Paket sichtbar
+ $\rightarrow$ später mehr dazu
+ \item<4-> \textbf{kein Modifier}: Element ist nur innerhalb seiner Klasse und der
+ Klassen im selben Paket sichtbar
+ $\rightarrow$ hier nicht so wichtig
+ \end{itemize}
+ \end{block}
+\only<5->{
+ Ab nun:
+ \begin{itemize}
+ \item Attribute sind (fast) immer private
+ \item Methoden können auch private sein
+ \end{itemize}
+}
+\end{frame}
+
+\subsection{Modifikatoren: Beispiel}
+\begin{frame}{Modifikatoren: Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, label=Student.java, firstline=1, lastline=10]{java}{Visibility.java}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, label=Main.java, firstline=12, lastline=19]{java}{Visibility.java}
+\end{frame}
+
+\subsection{Modifikatoren: Beispiel}
+\begin{frame}{Modifikatoren: Beispiel}
+ \begin{alertblock}{Neues Problem}
+ Jetzt können wir Namen, Semester und Matrikelnummer von außen gar nicht mehr
+ auslesen!
+ \end{alertblock}
+ \only<2->{
+ \begin{block}{Auch hierzu gibt es aber eine Lösung:}
+ Mit \textbf{getter-Methoden} kann man den Lesezugriff auf Attribute
+ wieder erlauben.
+ \end{block}
+ }
+\end{frame}
+
+\subsection{Modifikatoren: Beispiel}
+\begin{frame}{Modifikatoren: Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, label=Student.java, firstline=21, lastline=30]{java}{Visibility.java}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, label=Student.java, firstline=32, lastline=39]{java}{Visibility.java}
+\end{frame}
+
+\subsection{Eclipse-Tipp}
+\begin{frame}{Eclipse-Tipp}
+ \menu{Source > Generate Getters and Setters\dots}\\
+ \includegraphics[width=62mm]{eclipse-getter-setter.png}
+\end{frame}
+
+\section{Konventionen}
+\subsection{Kommentare}
+\begin{frame}{Kommentare}
+ Typen:
+ \begin{itemize}
+ \item Implementierungskommentare: \item \myCode{/* blah */} und \myCode{// blah}
+ \item Dokumentationskommentare: \myCode{/** blah */}
+ \end{itemize}
+
+ \begin{quote}
+ Comments should not be enclosed in large boxes drawn with asterisks or other characters.
+ Comments should never include special characters such as form-feed and backspace.
+ \end{quote}
+ Source: \href{http://www.oracle.com/technetwork/java/codeconventions-150003.pdf}{Java Code Conventions}, S. 7 - 9
+\end{frame}
+
+\subsection{JavaDoc: Verwendung}
+\begin{frame}{JavaDoc: Verwendung}
+ Soll fast überall benutzt werden:
+ \begin{itemize}
+ \item Über jeder Klasse
+ \item Über jedem Attribut
+ \item Über jeder Methode (mit Annotations)
+ \end{itemize}
+\end{frame}
+
+\subsection{JavaDoc: Annotations}
+\begin{frame}{JavaDoc: Annotations}
+ Es gibt folgende Annotations
+ \begin{itemize}
+ \item \myCode{@param}: Für die Parameter aller Methoden
+ \item \myCode{@return}: Für den Rückgabewert vom Methoden
+ \item \myCode{@author}: Nur für \myCode{class} und \myCode{interface}, erforderlich
+ \end{itemize}
+ \vspace{0.5cm}
+ Weitere Annotations:
+ \begin{itemize}
+ \item \myCode{@throws}: Angabe möglicher Fehlermeldungen
+ \end{itemize}
+\end{frame}
+
+\subsection{JavaDoc: Negativ-Beispiel}
+\begin{frame}{JavaDoc: Negativ-Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=1, lastline=6]{java}{JavaDoc.java}
+
+ \begin{itemize}
+ \item Was ist hier schlecht?
+ \item Wie könnte man es verbessern?
+ \end{itemize}
+\end{frame}
+
+\subsection{JavaDoc: Positiv-Beispiel}
+\begin{frame}{JavaDoc: Positiv-Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=9, lastline=16]{java}{JavaDoc.java}
+\end{frame}
+
+\section{Kontrollstrukturen}
+\subsection{if-Abfragen}
+\begin{frame}{if-Abfragen}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=1, lastline=5]{java}{Kontrollstrukturen.java}
+
+ KEINE Schleife! $\rightarrow$ \href{http://if-schleife.de/}{if-schleife.de}
+\end{frame}
+
+\subsection{if-Abfragen: else if}
+\begin{frame}{if-Abfragen: else if}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=7, lastline=13]{java}{Kontrollstrukturen.java}
+\end{frame}
+
+\subsection{if-Abfragen: Quiz}
+\begin{frame}{if-Abfragen: Quiz}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, frame=lines]{java}{QuizIf.java}
+\end{frame}
+
+\subsection{for-Schleifen}
+\begin{frame}{for-Schleifen}
+ \begin{itemize}
+ \item Syntax: \myCode{for ([INITIALISIERUNG; BEDINGUNG; UPDATE]) \{ \dots \}}
+ \end{itemize}
+
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=39, lastline=41]{java}{Kontrollstrukturen.java}
+\end{frame}
+
+\subsection{while-Schleifen}
+\begin{frame}{while-Schleifen}
+ \begin{itemize}
+ \item Syntax: \myCode{while ([BEDINGUNG]) \{ \dots \}}
+ \end{itemize}
+
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=35, lastline=37]{java}{Kontrollstrukturen.java}
+\end{frame}
+
+\subsection{do-while-Schleifen}
+\begin{frame}{do-while-Schleifen}
+ \begin{itemize}
+ \item Syntax: \myCode{do \{ \dots \} while ([BEDINGUNG]);}
+ \item Wo ist der Unterschied zu \myCode{while}?
+ \end{itemize}
+
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstline=43, lastline=49]{java}{Kontrollstrukturen.java}
+\end{frame}
+
+\subsection{Switch-Anweisung}
+\begin{frame}{Switch-Anweisung}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, firstline=15, lastline=33, label=World.java]{java}{Kontrollstrukturen.java}
+\end{frame}
+
+\section{Praxis}
+\subsection{Praxis}
+\begin{frame}{Praxis}
+ Falls noch Zeit bleibt \dots
+\end{frame}
+
+\section{Abspann}
+\subsection{Kommende Tutorien}
+\begin{frame}{Kommende Tutorien}
+ \begin{itemize}
+ \item[11.] 05.11.2012
+ \item[10.] 12.11.2012
+ \item[9.] 19.11.2012
+ \item[8.] 26.11.2012
+ \item[7.] 03.12.2012
+ \item[6.] 10.12.2012
+ \item[5.] 17.12.2012: Video "`Library"' zeigen
+ \item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
+ \item[-] 31.12.2012: Silvester - Kein Tutorium
+ \item[4.] 07.01.2013
+ \item[3.] 14.01.2013
+ \item[2.] 21.01.2013
+ \item[1.] 28.01.2013
+ \item[0.] 04.02.2013
+ \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-2010-10.jpg}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-03/yoda-condition.png b/presentations/Programmieren-Tutorium/Tutorium-03/yoda-condition.png
new file mode 100644
index 0000000..0a81240
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-03/yoda-condition.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Bytecode-interessant.txt b/presentations/Programmieren-Tutorium/Tutorium-04/Bytecode-interessant.txt
new file mode 100644
index 0000000..6d4e18b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Bytecode-interessant.txt
@@ -0,0 +1,27 @@
+Compiled from "SimpleLoop.java"
+public class SimpleLoop extends java.lang.Object{
+public SimpleLoop();
+ Code:
+ 0: aload_0
+ 1: invokespecial #1; //Method java/lang/Object."":()V
+ 4: return
+
+public static void main(java.lang.String[]);
+ Code:
+ 0: bipush -5
+ 2: istore_1 /* Speichere einen int-Wert in das Array der lokalen Variablen */
+ 3: iload_1 /* Lade den int-Wert einer lokalen Variablen auf den Operandenstapel */
+ 4: bipush 15 /* lege 15 auf den Operandenstapel */
+ 6: if_icmpge 46 /* if_icmpge pops the top two ints off the stack
+ and compares them. If value2 is greater than or equal to value1,
+ execution branches to the address (pc + branchoffset), where pc
+ is the address of the if_icmpge opcode in the bytecode and branchoffset
+ is a 16-bit signed integer parameter following the if_icmpge opcode in
+ the bytecode. If value2 is less than value1, execution continues at the
+ next instruction.*/
+ 9-37: /* String erstellen, i*i berechnen, String ausgeben */
+ 40: iinc 1, 1 /* iinc increments the int held in the local variable by */
+ 43: goto 3
+ 46: return
+
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Bytecode.txt b/presentations/Programmieren-Tutorium/Tutorium-04/Bytecode.txt
new file mode 100644
index 0000000..4a68784
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Bytecode.txt
@@ -0,0 +1,34 @@
+Compiled from "SimpleLoop.java"
+public class SimpleLoop extends java.lang.Object{
+public SimpleLoop();
+ Code:
+ 0: aload_0
+ 1: invokespecial #1; //Method java/lang/Object."":()V
+ 4: return
+
+public static void main(java.lang.String[]);
+ Code:
+ 0: bipush -5
+ 2: istore_1
+ 3: iload_1
+ 4: bipush 15
+ 6: if_icmpge 46
+ 9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
+ 12: new #3; //class java/lang/StringBuilder
+ 15: dup
+ 16: invokespecial #4; //Method java/lang/StringBuilder."":()V
+ 19: iload_1
+ 20: invokevirtual #5; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
+ 23: ldc #6; //String :
+ 25: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
+ 28: iload_1
+ 29: iload_1
+ 30: imul
+ 31: invokevirtual #5; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
+ 34: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
+ 37: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
+ 40: iinc 1, 1
+ 43: goto 3
+ 46: return
+
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Euler28-fast.java b/presentations/Programmieren-Tutorium/Tutorium-04/Euler28-fast.java
new file mode 100644
index 0000000..0c9e1d2
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Euler28-fast.java
@@ -0,0 +1,15 @@
+public class Euler28 {
+ public static void main(String[] args) {
+ int sum1 = 0, sum2 = 0;
+ int n = 3;
+ int m = 2;
+ for (int i = 0; i < 500; i++) {
+ sum1 += (n * n) + ((n * n) - (n - 1));
+ n += 2;
+
+ sum2 += (((m * m) + 1) + ((m * m) - (m - 1)));
+ m += 2;
+ }
+ System.out.println("result: " + (sum1 + sum2 + 1));
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Euler28.java b/presentations/Programmieren-Tutorium/Tutorium-04/Euler28.java
new file mode 100644
index 0000000..5b80162
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Euler28.java
@@ -0,0 +1,86 @@
+public class Euler28 {
+ private static void printArray(int[][] spiral, int N) {
+ for (int i = 0; i < N; i++) {
+ for (int j = 0; j < N; j++) {
+ System.out.print(spiral[i][j] + " ");
+ }
+ System.out.println("");
+ }
+ }
+
+ private static int getSum(int[][] array, int N) {
+ int sum = 0;
+ // Summe berechnen
+ for (int i = 0; i < N; i++) {
+ sum += array[i][i]; // Diagonale 1, links oben nach rechts unten
+ sum += array[N - 1 - i][i]; // Diagonale 2, rechts oben nach links
+ // unten
+ }
+ sum -= 1; // die 1 liegt auf beiden Diagonalen
+ return sum;
+ }
+
+ enum Direction {
+ RECHTS, UNTEN, OBEN, LINKS
+ }
+
+ public static void main(String[] args) {
+ final int N = 5;
+
+ // initialise variables
+ int[][] spiral = new int[N][N];
+ Direction direction = Direction.RECHTS;
+ int posX = N / 2;
+ int posY = N / 2;
+ int steps = 1;
+ int number = 1;
+
+ // fill array with spiral values
+ while (number <= N * N) {
+ for (int j = 0; j < steps; j++) {
+
+ spiral[posX][posY] = number;
+
+ switch (direction) {
+ case RECHTS:
+ posX++;
+ break;
+ case UNTEN:
+ posY++;
+ break;
+ case LINKS:
+ posX--;
+ break;
+ case OBEN:
+ posY--;
+ break;
+ }
+
+ number++;
+ if (number > N * N) {
+ break;
+ }
+ }
+
+ switch (direction) {
+ case RECHTS:
+ direction = Direction.UNTEN;
+ break;
+ case UNTEN:
+ direction = Direction.LINKS;
+ steps++;
+ break;
+ case LINKS:
+ direction = Direction.OBEN;
+ break;
+ case OBEN:
+ direction = Direction.RECHTS;
+ steps++;
+ break;
+ }
+ }
+
+ printArray(spiral, N);
+ System.out.println("Diagonal-Summe: " + getSum(spiral, N));
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-1.java b/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-1.java
new file mode 100644
index 0000000..a8a1543
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-1.java
@@ -0,0 +1,15 @@
+public boolean isStreetLegal() {
+ if(bell==true && light==true) { //Wenn das Fahrrad eine Klingel und ein Licht hat...
+ legal = true; //dann ist es auf der Straße zugelassen
+ }
+ else { //wenn es keine Beleuchtung und/oder Licht hat, ...
+ legal = false; // dann ist es nicht zugelassen
+ }
+ return legal; //Zurückgabe des Attributs ob es zugelassen ist
+}
+
+public int getPriceFull(){ //Methode zur Berechnung des Gesamtpreises des Fahrrades
+ int priceFull = shift.getPrice() + price + wheels.getPrice(); /*
+ Berechnung des Preises durch Addition der Einzelpreise*/
+ return priceFull; //Zurückgabe des Gesamtpreises
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-2.java b/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-2.java
new file mode 100644
index 0000000..f438b7b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-2.java
@@ -0,0 +1,16 @@
+//Konstuktor
+/** erzeugt ein neues Objekt und initialisiert die Attribute */
+Gears(byte chainwheel0, byte rearsprocket0, int price0) {
+ chainwheel = chainwheel0;
+ rearsprocket = rearsprocket0;
+ price = price0;
+}
+
+// Methode
+/** gibt die Anzahl der Gänge zurück */
+short getNumberOfGears() {
+ short numbergears;
+
+ numbergears = (short) (rearsprocket * chainwheel);
+ return numbergears;
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-3.java b/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-3.java
new file mode 100644
index 0000000..12d3b87
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Kommentare-3.java
@@ -0,0 +1,10 @@
+/**
+ * Methode, die ein neues Stadtrad erstellt.
+ * @return neues Stadtrad
+ */
+public Bike createCityBike() { //Methodensignatur der Methode createCityBike
+ Wheels cityWheels = new Wheels(559,50f,10000); //Räder des Stadtrads erstellen
+ Gears cityGears = new Gears(3,1,5000); //Gangschaltung des Stadtrads erstellen
+ Bike newCityBike = new Bike(cityGears, cityWheels, "Stahl", "CB105", true, true, 30000); //Stadtrad erstellen
+ return newCityBike; //Stadtrad zurückgeben
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Makefile b/presentations/Programmieren-Tutorium/Tutorium-04/Makefile
new file mode 100644
index 0000000..8e8c52e
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-04
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-1.java b/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-1.java
new file mode 100644
index 0000000..bd98c79
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-1.java
@@ -0,0 +1,11 @@
+public class QuizIf {
+ public static void main(String[] a) {
+ float a = 0.1;
+ float b = 0.1;
+ if (0.01 == a * b) {
+ System.out.println("Alpha");
+ } else {
+ System.out.println("Beta");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-2.java b/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-2.java
new file mode 100644
index 0000000..643f30e
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-2.java
@@ -0,0 +1,11 @@
+public class QuizIf {
+ public static void main(String[] a) {
+ float a = 0.1f;
+ float b = 0.1f;
+ if (0.01 == a * b) {
+ System.out.println("Alpha");
+ } else {
+ System.out.println("Beta");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-3.java b/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-3.java
new file mode 100644
index 0000000..c2573a0
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Quiz-float-3.java
@@ -0,0 +1,11 @@
+public class QuizIf {
+ public static void main(String[] args) {
+ float a = 0.1f;
+ float b = 0.1f;
+ if (0.01 == a * b) {
+ System.out.println("Alpha");
+ } else {
+ System.out.println("Beta");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/QuizFor-2.java b/presentations/Programmieren-Tutorium/Tutorium-04/QuizFor-2.java
new file mode 100644
index 0000000..4ca43c3
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/QuizFor-2.java
@@ -0,0 +1,9 @@
+public class QuizFor {
+ public static void main(String[] args) {
+ int i = 0;
+ for (;;) {
+ System.out.println(i + " bottles of beer");
+ i++;
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/QuizFor.java b/presentations/Programmieren-Tutorium/Tutorium-04/QuizFor.java
new file mode 100644
index 0000000..681c44c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/QuizFor.java
@@ -0,0 +1,9 @@
+public class QuizFor {
+ public static void main(String[] args) {
+ int i = 10;
+ for (; i < 10; i++) {
+ System.out.println(i);
+ }
+ System.out.println("end");
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/README.md b/presentations/Programmieren-Tutorium/Tutorium-04/README.md
new file mode 100644
index 0000000..9d03cfb
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/README.md
@@ -0,0 +1,6 @@
+Aufgaben
+========
+
+ * Tut04_Loops.pdf : For-Loops
+ * ProjectEuler : For-Loops + Arrays
+ * Matrix-Multiplikation
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/SimpleLoop.java b/presentations/Programmieren-Tutorium/Tutorium-04/SimpleLoop.java
new file mode 100755
index 0000000..d41e95c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/SimpleLoop.java
@@ -0,0 +1,8 @@
+public class SimpleLoop {
+ public static void main(String[] args) {
+ for (int i = -5; i < 15; ++i) {
+ System.out.println(i + ": " + i * i);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Static-Quiz-Baby.java b/presentations/Programmieren-Tutorium/Tutorium-04/Static-Quiz-Baby.java
new file mode 100644
index 0000000..5a2c06f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Static-Quiz-Baby.java
@@ -0,0 +1,9 @@
+public class Baby {
+ public String name;
+ public static int size;
+
+ public Baby(String name) {
+ this.name = name;
+ size = 46;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/Static-Quiz-World.java b/presentations/Programmieren-Tutorium/Tutorium-04/Static-Quiz-World.java
new file mode 100644
index 0000000..325157c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/Static-Quiz-World.java
@@ -0,0 +1,12 @@
+public class World {
+ public static void main(String[] args) {
+ Baby alice = new Baby("Alice");
+ alice.size = 42;
+
+ Baby bob = new Baby("Bob");
+ bob.size = 56;
+
+ System.out.println("Alice: " + alice.size);
+ System.out.println("Bob: " + bob.size);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/bash.sh b/presentations/Programmieren-Tutorium/Tutorium-04/bash.sh
new file mode 100644
index 0000000..8469157
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/bash.sh
@@ -0,0 +1 @@
+javap -c SimpleLoop
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/euler-28.png b/presentations/Programmieren-Tutorium/Tutorium-04/euler-28.png
new file mode 100644
index 0000000..c81ebb2
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-04/euler-28.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/euler28.py b/presentations/Programmieren-Tutorium/Tutorium-04/euler28.py
new file mode 100644
index 0000000..2643268
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/euler28.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+def printArr(a):
+ for line in a:
+ print(line)
+
+def initialise(n):
+ array = [[0 for j in xrange(0,n)] for i in xrange(0,n)]
+ return array
+
+def spiralFill(a):
+ n = len(a)
+ x = y = n/2
+ number = 1
+ # r u l o
+ order = [(1,0), (0,1), (-1,0), (0,-1)]
+ iOrder = 0
+ length = 1
+ a[y][x] = number
+ while not (x == (n-1) and y == 0):
+ for j in xrange(0, length):
+ xAdd, yAdd = order[iOrder]
+ x += xAdd
+ y += yAdd
+ number += 1
+ a[y][x] = number
+ if x == (n-1) and y==0:
+ break
+ if iOrder == 1 or iOrder == 3:
+ length += 1
+ iOrder = (iOrder+1) % 4
+ return a
+
+def diagonalSum(a):
+ n = len(a)
+ sum = -1 # you will have the element in the middle (1) twice
+ for i in xrange(0, n):
+ sum += a[i][i]
+ sum += a[n-i-1][i]
+ return sum
+
+if __name__ == "__main__":
+ import argparse
+
+ parser = argparse.ArgumentParser(description="ProjectEuler: 28")
+ parser.add_argument("-n", metavar='N', type=int,
+ help="length of the spiral", required=True)
+ parser.add_argument("-d", action="store_true",default=False,
+ help="display the spiral")
+ args = parser.parse_args()
+ array = initialise(args.n)
+ array = spiralFill(array)
+ if args.d:
+ printArr(array)
+ print diagonalSum(array)
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/java-6-javadoc.png b/presentations/Programmieren-Tutorium/Tutorium-04/java-6-javadoc.png
new file mode 100644
index 0000000..18ca376
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-04/java-6-javadoc.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/java-7-javadoc.png b/presentations/Programmieren-Tutorium/Tutorium-04/java-7-javadoc.png
new file mode 100644
index 0000000..7d5eb59
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-04/java-7-javadoc.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/javadoc.sh-session b/presentations/Programmieren-Tutorium/Tutorium-04/javadoc.sh-session
new file mode 100644
index 0000000..2c21415
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/javadoc.sh-session
@@ -0,0 +1,82 @@
+moose@pc07:~/Downloads/prog-ws1213/Blatt-01$ ls
+README.md student-solution
+moose@pc07:~/Downloads/prog-ws1213/Blatt-01$ mkdir javadoc
+moose@pc07:~/Downloads/prog-ws1213/Blatt-01$ ls
+javadoc README.md student-solution
+moose@pc07:~/Downloads/prog-ws1213/Blatt-01$ cd student-solution/
+moose@pc07:~/Downloads/prog-ws1213/Blatt-01/student-solution$ ls
+BikeFactory.java Bike.java doc Frame.java Gears.java test Wheels.java
+moose@pc07:~/Downloads/prog-ws1213/Blatt-01/student-solution$ javadoc -d ../javadoc/ *
+Loading source file BikeFactory.java...
+Loading source file Bike.java...
+Loading source file Frame.java...
+Loading source file Gears.java...
+Loading source file Wheels.java...
+Wheels.java:4: warning: unmappable character for encoding UTF8
+ * Der Felgendurchmesser und die ReifenstXrke modellieren
+ ^
+Wheels.java:5: warning: unmappable character for encoding UTF8
+ * die RXder eines Fahrrads.
+ ^
+Wheels.java:6: warning: unmappable character for encoding UTF8
+ * Der Felgendurchmesser betrXgt maximal 700mm
+ ^
+Wheels.java:7: warning: unmappable character for encoding UTF8
+ * und die ReifenstXrke betrXgt maximal 60mm.
+ ^
+Wheels.java:7: warning: unmappable character for encoding UTF8
+ * und die ReifenstXrke betrXgt maximal 60mm.
+ ^
+Wheels.java:18: warning: unmappable character for encoding UTF8
+ * Konstruktor fXr "Wheels".
+ ^
+Wheels.java:44: warning: unmappable character for encoding UTF8
+ + "als Wert ungXltig. Maximaler Feldendurschmeeser " +
+ ^
+Wheels.java:45: warning: unmappable character for encoding UTF8
+ "betrXgt 700mm. Bitte Wert Xndern.");
+ ^
+Wheels.java:45: warning: unmappable character for encoding UTF8
+ "betrXgt 700mm. Bitte Wert Xndern.");
+ ^
+Wheels.java:58: warning: unmappable character for encoding UTF8
+ + " als Wert ungXltig. Maximalee ReifenstXrke " +
+ ^
+Wheels.java:58: warning: unmappable character for encoding UTF8
+ + " als Wert ungXltig. Maximalee ReifenstXrke " +
+ ^
+Wheels.java:59: warning: unmappable character for encoding UTF8
+ "betrXgt 60mm. Bitte Wert Xndern.");
+ ^
+Wheels.java:59: warning: unmappable character for encoding UTF8
+ "betrXgt 60mm. Bitte Wert Xndern.");
+ ^
+Loading source files for package doc...
+javadoc: warning - No source files for package doc
+Loading source files for package test...
+Constructing Javadoc information...
+javadoc: warning - No source files for package doc
+javadoc: warning - No source files for package test
+Standard Doclet version 1.6.0_24
+Building tree for all the packages and classes...
+Generating ../javadoc/Velo/Bike.html...
+Generating ../javadoc/Velo/BikeFactory.html...
+Generating ../javadoc/Velo/Frame.html...
+Generating ../javadoc/Velo/Gears.html...
+Generating ../javadoc/Velo/Wheels.html...
+Generating ../javadoc/Velo/package-frame.html...
+Generating ../javadoc/Velo/package-summary.html...
+Generating ../javadoc/Velo/package-tree.html...
+Generating ../javadoc/constant-values.html...
+Building index for all the packages and classes...
+Generating ../javadoc/overview-tree.html...
+Generating ../javadoc/index-all.html...
+Generating ../javadoc/deprecated-list.html...
+Building index for all classes...
+Generating ../javadoc/allclasses-frame.html...
+Generating ../javadoc/allclasses-noframe.html...
+Generating ../javadoc/index.html...
+Generating ../javadoc/help-doc.html...
+Generating ../javadoc/stylesheet.css...
+16 warnings
+moose@pc07:~/Downloads/prog-ws1213$
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/singleLines.java b/presentations/Programmieren-Tutorium/Tutorium-04/singleLines.java
new file mode 100644
index 0000000..a06bb20
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/singleLines.java
@@ -0,0 +1,33 @@
+boolean hasLicense();
+boolean canEvaluate();
+boolean shouldAbort = false;
+
+boolean bell;
+boolean light;
+
+boolean hasBell;
+boolean hasLight;
+
+public class TestBoolean {
+ private boolean isActive;
+
+ public boolean isActive() {
+ return isActive;
+ }
+}
+
+
+int i = 42;
+int k = (i * i) / (42 % 3);
+for (int j = 12; j < i; i++) {
+
+}
+
+int[] liste = new int[7];
+liste[5] = 5;
+
+int[][] tabelle = new int[20][30];
+tabelle[1][2] = 1;
+
+int[][][] quader = new int[5][7][2];
+quader[0][0][0] = 0;
diff --git a/presentations/Programmieren-Tutorium/Tutorium-04/tutorium-04.tex b/presentations/Programmieren-Tutorium/Tutorium-04/tutorium-04.tex
new file mode 100644
index 0000000..49c8a95
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-04/tutorium-04.tex
@@ -0,0 +1,542 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+
+% use KIT-Theme
+% see http://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen
+%\usetheme{Frankfurt} % see http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html as fallback
+\InputIfFileExists{../templates/beamerthemekit.sty}{\usepackage{../templates/beamerthemekit}}{\usetheme{Frankfurt}}
+\usefonttheme{professionalfonts}
+
+\usepackage{hyperref}
+\usepackage{lmodern}
+\usepackage{listings}
+\usepackage{wrapfig} % see http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions
+\usepackage[utf8]{inputenc} % this is needed for german umlauts
+\usepackage[ngerman]{babel} % this is needed for german umlauts
+\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf
+\usepackage{verbatim}
+\usepackage{relsize}
+\usepackage{subfigure}
+\usepackage{algorithm,algpseudocode}
+\usepackage{minted} % needed for the inclusion of source code
+\usepackage{xcolor}
+\usepackage{menukeys}
+\usepackage{wasysym}
+\usepackage{braket} % needed for \Set
+\usepackage{tikz}
+% w/o following space!
+\newcommand{\quem}{\tikz[baseline=(wi.base)]{\node[fill=black,rotate=45,inner sep=1.5mm] {};%
+\node[ font=\color{white}] (wi) {?};}}
+\usepackage{../templates/myStyle}
+
+\newcommand\tutor{Martin Thoma}
+\newcommand\tutNR{10}
+\newcommand\titleText{Programmieren-Tutorium Nr. \tutNR{} bei \tutor}
+\institute{Fakultät für Informatik}
+
+\hypersetup{pdftitle={\titleText}}
+\beamertemplatenavigationsymbolsempty
+
+\newcommand\InsertToC[1][]{
+ \begin{frame}{Outline}
+ \tableofcontents[subsectionstyle=show/show/show, subsubsectionstyle=show/show/show, #1]
+ \end{frame}
+}
+
+\begin{document}
+\title{\titleText}
+\subtitle{Javadoc, Bytecode}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+\section{Einleitung}
+\subsection{Quiz: Teil 1}
+\begin{frame}{Quiz: Teil 1}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Quiz.java, frame=lines]{java}{Quiz-float-1.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\subsection{Quiz: Teil 2}
+\begin{frame}{Quiz: Teil 2}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Quiz.java, frame=lines]{java}{Quiz-float-2.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\subsection{Quiz: Teil 3}
+\begin{frame}{Quiz: Teil 3}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Quiz.java, frame=lines]{java}{Quiz-float-3.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\section{Nachbesprechung: 1. ÜB}
+\subsection{Gleitkomma vs. Ganzzahl}
+\begin{frame}{Gleitkomma vs. Ganzzahl}
+ Welche Vorteile bieten Ganzzahl-Variablen im Vergleich zu
+ Gleitkomma-Variablen?
+ \begin{itemize}[<+->]
+ \item \textbf{Speicherplatz}? \onslide<4->{Nein, vgl. \myCode{long} und \myCode{float}}
+ \item \textbf{Geschwindigkeit}? \onslide<5->{Kommt drauf an: Wenn keine weitere Umrechnung nötig ist und die Gleitkommazahl nicht kleiner ist, eher ja.}
+ \item \textbf{Genauigkeit}? \onslide<6->{Ja.\\
+ Beispiel: $(0,1)_{10} = (0,0\overline{0011})_2$\\
+ vgl. Java-Puzzle}
+ \end{itemize}
+\end{frame}
+
+\subsection{Variablennamen}
+\begin{frame}{Variablennamen}
+ Bitte nur alphanumerische Zeichen für Namen (Pakete, Methoden, Variablen, \dots).\\
+ Soll heißen:
+ \begin{itemize}[<+->]
+ \item abcdefghijklmnopqrstuvwxyz sind erlaubt
+ \item ABCDEFGHIJKLMNOPQRSTUVWXYZ sind erlaubt
+ \item 0123456789 sind erlaubt
+ \item Unterstrich - also "`\_"' ist nur in Kostanten erlaubt
+ \item Der Rest ist verboten und gibt Punktabzug! Keine Umlaute!
+ \end{itemize}
+\end{frame}
+
+\subsection{Kommentare}
+\begin{frame}{Kommentare}
+ \begin{block}{Regel}
+ Kommentiert, was ihr macht. \\
+ Nicht wie ihr es macht.
+ \end{block}
+
+ \begin{itemize}[<+->]
+ \item Gut zu kommentieren ist schwer
+ \item Viel (fremden) Code ansehen hilft
+ \item Eigenen Code nach Jahren ansehen hilft
+ \item JEDER Kommentar ist für Java-Entwickler gedacht
+ \item[$\Rightarrow$] Kommentare à la "`Methode"' oder
+ "`Methodensignatur"' sind nutzlos!\\
+ \item Javadoc-Kommentare sind für Entwickler, die nichts von
+ eurem Code sehen können, ihn aber dennoch nutzen wollen
+ \end{itemize}
+\end{frame}
+
+\subsection{Kommentare: Beispiel 1}
+\begin{frame}{Kommentare: Beispiel 1}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Kommentare-1.java}
+
+ \only<2->{
+ \begin{itemize}
+ \item An sich gute Kommentare
+ \item Wäre besser als Javadoc direkt über der Methode
+ \end{itemize}
+ }
+\end{frame}
+
+\subsection{Kommentare: Beispiel 2}
+\begin{frame}{Kommentare: Beispiel 2}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Kommentare-2.java}
+\end{frame}
+
+\begin{frame}{Kommentare: Beispiel 2}
+ \begin{itemize}
+ \item Zeile 1 \& 2 bieten einem Entwickler nicht mehr Informationen
+ $\Rightarrow$ nutzlos
+ \item Sonst okay
+ \item Bitte nicht \myCode{chainwheel0}, sondern \myCode{chainwheel}
+ und später \myCode{this}-Operator nutzen\\
+ Gibt in Zukunft -0,5 Punkte
+ \item Gute Zeilenlänge \smiley
+ \end{itemize}
+\end{frame}
+
+\subsection{Kommentare: Beispiel 3}
+\begin{frame}{Kommentare: Beispiel 3}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Kommentare-3.java}
+ \only<2->{
+ \begin{itemize}
+ \item Javadoc ist okay
+ \item "`Methodensignatur"'-Kommentar in Z. 5 ist nutzlos
+ \item Kommentare in Z. 7 - 9 sind nutzlos
+ \item Z. 8 ist arg lang $\rightarrow$ den Kommentar hätte
+ man einfach über die Zeile schreiben können.
+ \end{itemize}
+ }
+\end{frame}
+
+\subsection{Namenskonventionen für booleans}
+\begin{frame}{Namenskonventionen für booleans}
+ \begin{block}{Regel}
+ Der Präfix "`is"' sollte für boolesche Variablen und Methoden
+ mit dem Rückgabewert \myCode{boolean} genutzt werden.
+ \end{block}
+
+ \onslide<2->{
+ \begin{exampleblock}{Beispiele}
+ isSet, isVisible, isFinished, isFound, isOpen
+ \end{exampleblock}
+ }
+
+ \onslide<3->{
+ Auch okay sind "`has"', "`should"' oder ähnliche Präfixe.
+ }
+
+ \onslide<4->{
+ \begin{exampleblock}{Beispiele}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=1, lastline=3]{java}{singleLines.java}
+ \end{exampleblock}
+ }
+\end{frame}
+
+\subsection{booleans: Positiv- und Negativbeispiel}
+\begin{frame}{booleans: Positiv- und Negativbeispiel}
+ \begin{exampleblock}{Negativbeispiel: So nicht!}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=5, lastline=6]{java}{singleLines.java}
+ \end{exampleblock}
+
+ \onslide<2->{
+ \begin{exampleblock}{Positivbeispiel: Aber so}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=8, lastline=9]{java}{singleLines.java}
+ \end{exampleblock}
+ }
+
+ \onslide<3->{
+ In Zukunft: -0,5 Punkte
+ }
+\end{frame}
+
+\subsection{Boolean: Was ist mit Gettern/Settern?}
+\begin{frame}{Boolean: Was ist mit Gettern/Settern?}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=11, lastline=17]{java}{singleLines.java}
+ \begin{block}{Hinweis}
+ Es ist okay, wenn ein Attribut genauso heißt wie eine Methode
+ \end{block}
+\end{frame}
+
+\subsection{Kombinatorik}
+\begin{frame}{Kombinatorik}
+ Wenn man 3 Gänge vorne und 7 hinten hat, wie viele Gänge gibt es?
+ \vspace{1.0cm}
+ \onslide<2->{
+ \textbf{Antwort:} $3 \cdot 7 = 21$\\
+ }
+ \vspace{0.5cm}
+ \onslide<3->{\textbf{Erklärung}:
+ Sei $\Set{a, b, c}$ die Menge der vorderen Gänge und
+ $\Set{1, 2, 3, 4, 5, 6, 7}$ die Menge der hinteren Gänge.\\
+ }
+ \vspace{0.2cm}
+ \onslide<4->{
+ Dann gibt es folgende Kombinationen:\\
+ a1, a2, a3, a4, a5, a6, a7\\
+ b1, b2, b3, b4, b5, b6, b7\\
+ c1, c2, c3, c4, c5, c6, c7
+ }
+
+\end{frame}
+
+\subsection{Formatierung}
+\begin{frame}{Formatierung}
+ Mit Eclipse:
+ \begin{itemize}
+ \item Alles markieren: \keys{\ctrl+A}
+ \item Formatieren: \keys{\ctrl+\shift+F}
+ \end{itemize}
+ Falsche Formatierung gibt in Zukunft pro Fehler -0,5 Punkte.\\
+ Auch Folgefehler geben Punktabzug!
+\end{frame}
+
+\subsection{Aussagekräftige Variablen!}
+\begin{frame}{Aussagekräftige Variablen!}
+ In Zukunft:
+ -1 P. bis -5 P. für Variablennamen wie "`Kr"' für Kettenräder oder
+ "`Pr"' für Preis!
+\end{frame}
+
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \begin{table}[ht]
+ \begin{tabular}{p{0.4\linewidth}l}
+ \begin{minipage}[b]{0.8\linewidth}\centering
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Baby.java, frame=lines]{java}{Static-Quiz-Baby.java}
+ \end{minipage}
+ &
+ \begin{minipage}[b]{0.5\linewidth}
+ \centering
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=World.java, frame=lines]{java}{Static-Quiz-World.java}
+ \end{minipage}
+ \end{tabular}
+ \end{table}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\subsection{Quiz: Antwort}
+\begin{frame}{Quiz: Antwort}
+ Ausgabe:
+ \begin{itemize}
+ \item Alice: 56
+ \item Bob: 56
+ \end{itemize}
+ \vspace{0.5cm}
+ Warum?
+ \begin{itemize}[<+->]
+ \item \myCode{static} macht ein Attribut zu einem "`\textbf{Klassenattribut}"'
+ \item Das Attribut gehört dann nicht mehr den einzelnen Objekten
+ \item Und sollte auch nicht über Objecte aufgerufen werden!
+ \item Schlecht: \myCode{alice.size;}
+ \item Auch schlecht: \myCode{alice.getSize();}
+ \item Besser: \myCode{Baby.size;} oder \myCode{Baby.getSize();}
+ \item In Zukunft: min. -2 P. für falsche \myCode{static}-Verwendung
+ \end{itemize}
+\end{frame}
+
+\section{Exkurs}
+\subsection{Exkurs: Bytecode}
+\begin{frame}{Exkurs: Bytecode}
+ \begin{alertblock}{Hinweis}
+ Das folgende ist nicht Prüfungsrelevant!\\
+ Also zurücklehnen und genießen :-)
+ \end{alertblock}
+
+ \vspace{1cm}
+ Mit dem Befehl
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=1, lastline=1]{bash}{bash.sh}
+ könnt ihr euch den Java-Bytecode ansehen.
+\end{frame}
+
+\begin{frame}{Exkurs: SimpleLoop Java Code}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, label=SimpleLoop.java, frame=lines]{java}{SimpleLoop.java}
+\end{frame}
+
+\begin{frame}{Bytecode von SimpleLoop.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Bytecode.txt}
+\end{frame}
+\begin{frame}{Bytecode von SimpleLoop.java: Anfang}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=1, lastline=7, fontsize=\tiny]{java}{Bytecode.txt}
+ \begin{itemize}
+ \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})
+ \item \textbf{iload\_1}: Lade den int-Wert einer lokalen Variablen auf den Operandenstapel. (\href{http://www.javaseiten.de/jvmisi.html\#iload_1}{Quelle})
+ \item \textbf{invokespecial [method-spec]}: invoke method belonging to a specific class (\href{https://www.vmth.ucdavis.edu/incoming/Jasmin/ref--33.html}{Quelle})
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Bytecode von SimpleLoop.java: Ende}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, firstline=9, lastline=32, fontsize=\tiny]{java}{Bytecode.txt}
+\end{frame}
+
+\begin{frame}{Interessanter Teil des Bytecodes}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Bytecode-interessant.txt}
+\end{frame}
+
+\subsection{Javadoc}
+\framedgraphic{Offizielle \href{http://docs.oracle.com/javase/6/docs/api/}{Java 6 API} Javadoc}{java-6-javadoc.png}
+\framedgraphic{Offizielle \href{http://docs.oracle.com/javase/7/docs/api/}{Java 7 API} Javadoc}{java-7-javadoc.png}
+
+\subsection{Javadoc erzeugen}
+\begin{frame}{Javadoc erzeugen}
+ \begin{itemize}
+ \item Order erstellen, in dem die Javadoc landen soll
+ \item In den Ordner mit euren Quelldateien wechseln
+ \item Befehl \myCode{javadoc -d ../pfad/zum/javadoc/ordner/ *}
+ \end{itemize}
+\end{frame}
+\begin{frame}{Javadoc erzeugen}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, firstline=1, lastline=30, fontsize=\tiny]{console}{javadoc.sh-session}
+\end{frame}
+\begin{frame}{Javadoc erzeugen}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, firstline=31, firstnumber=31, lastline=59, fontsize=\tiny]{console}{javadoc.sh-session}
+\end{frame}
+\begin{frame}{Javadoc erzeugen}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, firstline=60, firstnumber=60, lastline=82, fontsize=\tiny]{console}{javadoc.sh-session}
+\end{frame}
+\begin{frame}{Javadoc: Codierung}
+ \begin{itemize}[<+->]
+ \item \quem{} ist ein sicheres Zeichen, dass was bei der
+ Zeichenkodierung schief ging.
+ \item Bitte verwendet \textbf{immer} UTF-8!
+ \item Eclipse: \menu{Window > Preferences > General > Workspace > Text file encoding > UTF-8}
+ \end{itemize}
+\end{frame}
+
+\section{Dies und Das}
+\subsection{Konvention: Leerzeichen}
+\begin{frame}{Konvention: Leerzeichen}
+Keine Whitespaces nach
+ \begin{itemize}
+ \item ~ (Bitweises Komplement)
+ \item ! (Logisches Komplement)
+ \item ++ (Präfix-Inkrementierung, z.B. ++i;)
+ \item -- (Präfix-Dekrementierung, z.B. --i;)
+ \item . (Punkt)
+ \item - (Unäres Minus, z.B. -5)
+ \item + (Unäres Plus, z.B. +4)
+ \end{itemize}
+ Und
+ \begin{itemize}
+ \item Exakt eines vor und nach "`="'
+ \item Um Operatoren herum:
+ \end{itemize}
+
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=20, lastline=24]{java}{singleLines.java}
+\end{frame}
+
+\subsection{Mehrdimensionale Arrays}
+\begin{frame}{Mehrdimensionale Arrays}
+ Vorstellung:
+ \begin{itemize}
+ \item 1D: Vektor, Liste
+ \item 2D: Matrix, Tabelle
+ \item 3D: Quader
+ \item 4D: Hyperwürfel (falls quadratisch)
+ \end{itemize}
+
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=26, lastline=33]{java}{singleLines.java}
+\end{frame}
+
+\subsection{Wrap-Up: Was ihr können solltet}
+\begin{frame}{Wrap-Up: Das Programmierer $1 \cdot 1$}
+ \textbf{Was ihr können solltet}:
+ \begin{itemize}
+ \item \textbf{Einfache Probleme modellieren}:\\
+ Welche Klassen / Methoden brauche ich?
+ \item \textbf{Konstrollstrukturen}:
+ \begin{itemize}
+ \item \myCode{if () \{ \dots \}}
+ \item \myCode{while () \{ \dots \}}
+ \item \myCode{for (, , ) \{\dots\}}
+ \item \myCode{switch () \{case :\}}
+ \end{itemize}
+ \item \textbf{Arrays}: 1D- und 2D
+ \item \textbf{Kommentare}
+ \item \textbf{Koventionen}: Javadoc, Leerzeichen-Setzung
+ \item \textbf{Debuggen}: Einfache Fehler in eurem Code finden
+ \end{itemize}
+
+ \textbf{Was ihr hier noch lernt}:
+ \begin{itemize}
+ \item Verwendung der Java Standardbibliothek
+ \item Eingabe von Daten
+ \end{itemize}
+\end{frame}
+
+\subsection{Quiz: For-Schleifen}
+\begin{frame}{Quiz: For-Schleifen (1/2)}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Quiz: For-Schleifen (1/2) - Antwort}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor.java}
+ Ausgabe: \myCode{end}, da die Bedingung auch am Anfang überprüft wird
+\end{frame}
+
+\begin{frame}{Quiz: For-Schleifen (2/2)}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor-2.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Quiz: For-Schleifen (2/2) - Antwort}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizFor.java, frame=lines]{java}{QuizFor-2.java}
+ Ausgabe: Endlosschleife\\
+ \myCode{0 bottles of beer}\\
+ \myCode{1 bottles of beer}\\
+ \myCode{2 bottles of beer}\\
+ \vdots
+\end{frame}
+
+\section{Hinweise zum ÜB 2}
+\subsection{Allgemeine Hinweise}
+\begin{frame}{Allgemeine Hinweise}
+ \begin{alertblock}{Hinweise}
+ \begin{itemize}[<+->]
+ \item Auf \href{http://baldur.iti.kit.edu/programmieren/}{offizieller Lösung} aufbauen (Verpflichtend!)
+ \item Auf Leerzeichen, gute Variablennamen und Konventionen achten
+ \item Wird eine Bedinung von einem Setter-Parameter nicht eingehalten, schreibt ihr den Wert nicht
+ \begin{itemize}
+ \item Stattdessen: Fehlermeldung per \myCode{System.out.println("dies und das ist falsch");} ausgeben
+ \item Das ist nur eine Hilfslösung, weil ich noch keine Exceptions hattet
+ \item Später: (Fast) immer Exceptions!
+ \end{itemize}
+ \item Genauigkeit:
+ \begin{itemize}
+ \item Positiv bedeutet: $> 0$
+ \item Negativ bedeutet: $< 0$
+ \item nicht-negativ bedeutet: $\geq 0$
+ \end{itemize}
+ \end{itemize}
+ \end{alertblock}
+\end{frame}
+
+\subsection{Wie werde ich besser?}
+\begin{frame}{Wie werde ich besser?}
+ \begin{itemize}
+ \item \href{http://projecteuler.net/}{ProjectEuler.net}:
+ 401 Aufgaben jeder Schwierigkeitsstufe
+ \item Anderen Code anschauen
+ \item Probleme am PC lösen
+ \end{itemize}
+\end{frame}
+
+\section{Praxis}
+\subsection{ProjectEuler 28: Aufgabe}
+\framedgraphic{ProjectEuler 28: Aufgabe}{euler-28.png}
+
+\begin{frame}{ProjectEuler 28: Lösung mit Aufbau der Spirale}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Euler28.java, frame=lines]{java}{Euler28.java}
+\end{frame}
+
+\begin{frame}{ProjectEuler 28: Lösung ohne Aufbau der Spirale}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Euler28.java, frame=lines]{java}{Euler28-fast.java}
+\end{frame}
+
+\section{Abspann}
+\subsection{Kommende Tutorien}
+\begin{frame}{Kommende Tutorien}
+ \begin{itemize}
+ \item[10.] 12.11.2012
+ \item[9.] 19.11.2012
+ \item[8.] 26.11.2012
+ \item[7.] 03.12.2012
+ \item[6.] 10.12.2012
+ \item[5.] 17.12.2012: Video "`Library"' zeigen
+ \item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
+ \item[-] 31.12.2012: Silvester - Kein Tutorium
+ \item[4.] 07.01.2013
+ \item[3.] 14.01.2013
+ \item[2.] 21.01.2013
+ \item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
+ \item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
+ \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
+ \end{itemize}
+\end{frame}
+
+\subsection{Comic}
+\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/xkcd-good_code.png}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/AverageCalculation.java b/presentations/Programmieren-Tutorium/Tutorium-05/AverageCalculation.java
new file mode 100644
index 0000000..b97be73
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/AverageCalculation.java
@@ -0,0 +1,14 @@
+public class AverageCalculation {
+ public static float getAverage(int[] numbers) {
+ float sum = 0.0f;
+ for (int i = 0; i < numbers.length; i++) {
+ sum += numbers[i];
+ }
+ return sum / numbers.length;
+ }
+
+ public static void main(String[] args) {
+ int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+ System.out.println(getAverage(numbers));
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/Bilder.java b/presentations/Programmieren-Tutorium/Tutorium-05/Bilder.java
new file mode 100644
index 0000000..2ceba0b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/Bilder.java
@@ -0,0 +1,9 @@
+public static int getAverageColor(int[][] image) {
+ int sum = 0;
+ for (int x = 0; x < image.length; x++) {
+ for (int y = 0; y < image[0].length; y++) {
+ sum += image[x][y];
+ }
+ }
+ return sum / (image.length * image[0].length);
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/ConnectFourGame-bad.java b/presentations/Programmieren-Tutorium/Tutorium-05/ConnectFourGame-bad.java
new file mode 100644
index 0000000..008a499
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/ConnectFourGame-bad.java
@@ -0,0 +1,28 @@
+public class ConnectFourGame implements Cloneable {
+ private Color[][] board = new Color[7][6];
+ private Color lastMove;
+ private Color winner;
+ private boolean isFinished = false;
+
+ //[...]
+
+ public void printBoard() {
+ for (byte y = 5; y >= 0; y--) {
+ System.out.print(y + " ");
+ for (byte x = 0; x < 7; x++) {
+ if (board[x][y] == null) {
+ System.out.print(" ");
+ } else if (board[x][y] == Color.RED) {
+ System.out.print("r");
+ } else {
+ System.out.print("w");
+ }
+ }
+ System.out.println("");
+ }
+ System.out.print(" ");
+ for (byte x = 0; x < 7; x++) {
+ System.out.print(x);
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/ConnectFourGame.java b/presentations/Programmieren-Tutorium/Tutorium-05/ConnectFourGame.java
new file mode 100644
index 0000000..79ba4cb
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/ConnectFourGame.java
@@ -0,0 +1,32 @@
+public class ConnectFourGame implements Cloneable {
+ public static final int BOARD_HEIGHT = 6;
+ public static final int BOARD_WIDTH = 7;
+ public static final int WINNING_NR = 4;
+
+ private Color[][] board = new Color[BOARD_WIDTH][BOARD_HEIGHT];
+ private Color lastMove;
+ private Color winner;
+ private boolean isFinished = false;
+
+ //[...]
+
+ public void printBoard() {
+ for (byte y = BOARD_HEIGHT - 1; y >= 0; y--) {
+ System.out.print(y + " ");
+ for (byte x = 0; x < BOARD_WIDTH; x++) {
+ if (board[x][y] == null) {
+ System.out.print(" ");
+ } else if (board[x][y] == Color.RED) {
+ System.out.print("r");
+ } else {
+ System.out.print("w");
+ }
+ }
+ System.out.println("");
+ }
+ System.out.print(" ");
+ for (byte x = 0; x < BOARD_WIDTH; x++) {
+ System.out.print(x);
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/IataCode-2.java b/presentations/Programmieren-Tutorium/Tutorium-05/IataCode-2.java
new file mode 100644
index 0000000..2fb062c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/IataCode-2.java
@@ -0,0 +1,15 @@
+public class IataCode {
+ public static void printIATACodes(String[] myArray) {
+ for (int i = 0; i < myArray.length; i++) {
+ System.out.println(myArray[myArray.length - i - 1]);
+ }
+ }
+
+ public static void main(String[] args) {
+ String[] iataCodes = new String[4];
+ iataCodes[0] = "MUC";
+ iataCodes[1] = "BER";
+ iataCodes[2] = "AGB";
+ printIATACodes(iataCodes);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/IataCode-3.java b/presentations/Programmieren-Tutorium/Tutorium-05/IataCode-3.java
new file mode 100644
index 0000000..93f0448
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/IataCode-3.java
@@ -0,0 +1,13 @@
+public class IataCode {
+ public static void printIATACodes(String[] myArray) {
+ for (int i = 0; i < myArray.length; i += 3) {
+ System.out.println(myArray[i]);
+ }
+ }
+
+ public static void main(String[] args) {
+ String[] iataCodes = { "MUC", "BER", "AGB", "ABC", "DEF",
+ "GIH", "JKL", "MNO", "PQR", "STU", "VWX", "YZ" };
+ printIATACodes(iataCodes);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/IataCode.java b/presentations/Programmieren-Tutorium/Tutorium-05/IataCode.java
new file mode 100644
index 0000000..06dfe9d
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/IataCode.java
@@ -0,0 +1,18 @@
+public class IataCode {
+ public static void printIATACodes(String[] myArray) {
+ for (int i = 0; i < myArray.length; i++) {
+ System.out.println(myArray[i]);
+ }
+ }
+
+ public static void main(String[] args) {
+ String[] iataCodes = new String[4];
+ // Flughafen München
+ iataCodes[0] = "MUC";
+ // Flughafen Berlin Brandenburg
+ iataCodes[1] = "BER";
+ // Flughafen Augsburg
+ iataCodes[2] = "AGB";
+ printIATACodes(iataCodes);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/Makefile b/presentations/Programmieren-Tutorium/Tutorium-05/Makefile
new file mode 100644
index 0000000..1d5df9b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-05
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/QuizArray-solution.java b/presentations/Programmieren-Tutorium/Tutorium-05/QuizArray-solution.java
new file mode 100644
index 0000000..d18a91c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/QuizArray-solution.java
@@ -0,0 +1,25 @@
+public class QuizArray {
+ private static String[] deepCopy(String[] original) {
+ String[] copy = new String[original.length];
+ for (int i = 0; i < original.length; i++) {
+ copy[i] = original[i];
+ }
+ return copy;
+ }
+
+ public static void main(String[] args) {
+ String[] myArray1 = { " geh ", "du", "alter", "esel" };
+ String[] myArray2 = deepCopy(myArray1);
+ myArray2[3] = "sack";
+
+ System.out.print("myArray1: ");
+ for (int i = 0; i < myArray1.length; i++) {
+ System.out.print(myArray1[i] + " ");
+ }
+
+ System.out.print("\nmyArray2: ");
+ for (int i = 0; i < myArray2.length; i++) {
+ System.out.print(myArray2[i] + " ");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/QuizArray.java b/presentations/Programmieren-Tutorium/Tutorium-05/QuizArray.java
new file mode 100644
index 0000000..69385eb
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/QuizArray.java
@@ -0,0 +1,17 @@
+public class QuizArray {
+ public static void main(String[] args) {
+ String[] myArray1 = { " geh ", "du", "alter", "esel" };
+ String[] myArray2 = myArray1;
+ myArray2[3] = "sack";
+
+ System.out.print("myArray1: ");
+ for (int i = 0; i < myArray1.length; i++) {
+ System.out.print(myArray1[i] + " ");
+ }
+
+ System.out.print("\nmyArray2: ");
+ for (int i = 0; i < myArray2.length; i++) {
+ System.out.print(myArray2[i] + " ");
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/Sieve_of_Eratosthenes_animation.gif b/presentations/Programmieren-Tutorium/Tutorium-05/Sieve_of_Eratosthenes_animation.gif
new file mode 100644
index 0000000..cd385ee
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/Sieve_of_Eratosthenes_animation.gif differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/SwitchContinue.java b/presentations/Programmieren-Tutorium/Tutorium-05/SwitchContinue.java
new file mode 100644
index 0000000..02975c3
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/SwitchContinue.java
@@ -0,0 +1,18 @@
+public class SwitchContinue {
+ enum Direction {
+ RECHTS, UNTEN, OBEN, LINKS
+ }
+
+ public static void main(String[] args) {
+ Direction direction = Direction.RECHTS;
+
+ switch (direction) {
+ case RECHTS:
+ direction = Direction.UNTEN;
+ continue;
+ case UNTEN:
+ direction = Direction.LINKS;
+ break;
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/eclipse-export-project.png b/presentations/Programmieren-Tutorium/Tutorium-05/eclipse-export-project.png
new file mode 100644
index 0000000..21327d0
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/eclipse-export-project.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-deep-copy.dia b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-deep-copy.dia
new file mode 100644
index 0000000..7b87f19
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-deep-copy.dia differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-deep-copy~ b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-deep-copy~
new file mode 100644
index 0000000..059512a
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-deep-copy~ differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-shallow-copy.dia b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-shallow-copy.dia
new file mode 100644
index 0000000..059512a
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-shallow-copy.dia differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-shallow-copy~ b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-shallow-copy~
new file mode 100644
index 0000000..cec2390
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1-shallow-copy~ differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1.dia b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1.dia
new file mode 100644
index 0000000..cec2390
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1.dia differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1~ b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1~
new file mode 100644
index 0000000..cec2390
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/so-obj1~ differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/tutorium-05.tex b/presentations/Programmieren-Tutorium/Tutorium-05/tutorium-05.tex
new file mode 100644
index 0000000..ce5fdf8
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-05/tutorium-05.tex
@@ -0,0 +1,280 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+
+% use KIT-Theme
+% see http://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen
+%\usetheme{Frankfurt} % see http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html as fallback
+\InputIfFileExists{../templates/beamerthemekit.sty}{\usepackage{../templates/beamerthemekit}}{\usetheme{Frankfurt}}
+\usefonttheme{professionalfonts}
+
+\usepackage{hyperref}
+\usepackage{lmodern}
+\usepackage{listings}
+\usepackage{wrapfig} % see http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions
+\usepackage[utf8]{inputenc} % this is needed for german umlauts
+\usepackage[ngerman]{babel} % this is needed for german umlauts
+\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf
+\usepackage{verbatim}
+\usepackage{relsize}
+\usepackage{subfigure}
+\usepackage{algorithm,algpseudocode}
+\usepackage{minted} % needed for the inclusion of source code
+\usepackage{menukeys}
+\usepackage{xcolor}
+\usepackage{graphicx}
+\usepackage{wrapfig}
+\usepackage{../templates/myStyle}
+
+\newcommand\tutor{Martin Thoma}
+\newcommand\tutNR{10}
+\newcommand\titleText{Programmieren-Tutorium Nr. \tutNR{} bei \tutor}
+\institute{Fakultät für Informatik}
+
+\hypersetup{pdftitle={\titleText}}
+\beamertemplatenavigationsymbolsempty
+
+\newcommand\InsertToC[1][]{
+ \begin{frame}{Outline}
+ \tableofcontents[subsectionstyle=show/show/show, subsubsectionstyle=show/show/show, #1]
+ \end{frame}
+}
+
+\begin{document}
+\title{\titleText}
+\subtitle{Coding Style, Arrays}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=QuizArray.java, frame=lines]{java}{QuizArray.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Quiz: Antwort}
+ \begin{block}{Quelltext}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{QuizArray.java}
+ \end{block}
+
+ \begin{block}{Ausgabe}
+ myArray1: geh du alter sack\\
+ myArray2: geh du alter sack
+ \end{block}
+\end{frame}
+
+\begin{frame}{Shallow copy und deep copy}
+ \includegraphics*[height=5cm,angle=-90]{so-obj1.pdf}
+
+ \begin{minipage}[b]{0.45\linewidth}
+ \begin{figure}[htb]
+ \includegraphics*[height=5cm,angle=-90]{so-obj1-shallow-copy.pdf}
+ \caption{shallow copy}
+ \label{UploadForm}
+ \end{figure}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \begin{figure}[htb]
+ \includegraphics*[height=5cm,angle=-90]{so-obj1-deep-copy.pdf}
+ \caption{deep copy}
+ \label{UploadForm}
+ \end{figure}
+ \end{minipage}
+
+ \tiny{Weitere infos auf \href{http://stackoverflow.com/a/9835954/562769}{stackoverflow.com}}
+\end{frame}
+
+\begin{frame}{Shallow copy und deep copy}
+ \begin{itemize}
+ \item Java macht standardmäßig eine "`shallow copy"'
+ \item Wenn ihr eine "`deep copy"' wollt, müsst ihr das selbst machen
+ \end{itemize}
+ \begin{alertblock}{Lehre aus dem Quiz}
+ Beim kopieren von Objekten (alles außer \myCode{boolean}, \myCode{byte},
+ \myCode{int}, \myCode{long}, \myCode{float}, \myCode{double} -
+ oder einfacher, alles was mit einem Großbuchstaben beginnt)
+ ist Vorsicht geboten.
+ \end{alertblock}
+\end{frame}
+
+\begin{frame}{Shallow copy und deep copy}
+ Deep copy sieht im Beispiel so aus:
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=QuizArray.java, frame=lines]{java}{QuizArray-solution.java}
+\end{frame}
+
+\section{Coding Style}
+\subsection{Magic Numbers}
+\begin{frame}{Magic Numbers}
+ \begin{alertblock}{Definition: Magic numbers}
+ Unique values with unexplained meaning or multiple occurrences
+ which could (preferably) be replaced with named constants.
+ \end{alertblock}
+
+ Warum sind Konstanten besser als magic numbers?
+ \begin{itemize}
+ \item Code wird lesbarer
+ \item Code wird leichter erweiterbar
+ \item Kein (nennenswerter) Geschwindigkeits- oder Speicherplatznachteil
+ \end{itemize}
+
+ \begin{block}{Faustregel}
+ Alle Zahlen, bis auf \myCode{0}, \myCode{1} und \myCode{-1}
+ sollten mittels Konstanten verwendet werden.
+ \end{block}
+\end{frame}
+
+\begin{frame}{Magic Numbers: Beispiel mit magic numbers}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ConnectFourGame-bad.java}
+\end{frame}
+
+\begin{frame}{Magic Numbers: Beispiel mit magic Konstanten}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ConnectFourGame.java}
+\end{frame}
+
+\section{Praxis}
+\subsection{Durchschnitt}
+\begin{frame}{Durchschnitt: Aufgabe}
+ Schreiben Sie eine Methode \myCode{float getAverage(int[] numbers) \{ \dots \}},
+ die den Durchschnitt der Zahlen im Array \myCode{numbers} berechnet.
+\end{frame}
+
+\begin{frame}{Durchschnitt: Lösung}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{AverageCalculation.java}
+\end{frame}
+
+\subsection{Flughafenkürzel}
+\begin{frame}{Flughafenkürzel: Aufgabe}
+ Wir haben ein Array mit IATA-Codes (Flughafenkürzel) gegeben und
+ möchten den Inhalt auf der Konsole ausgeben.
+\end{frame}
+
+\begin{frame}{Flughafenkürzel: Lösung}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{IataCode.java}
+\end{frame}
+
+\begin{frame}{Flughafenkürzel: Ausgabe}
+ Kein Compiler- oder Laufzeitfehler, obwohl \myCode{iataCodes[3]}
+ nicht initialisiert ist!
+
+ \begin{block}{Ausgabe}
+ MUC\\
+ BER\\
+ AGB\\
+ null
+ \end{block}
+\end{frame}
+
+\begin{frame}{Flughafenkürzel: Umgekehrte Reihenfolge}
+ Modifiziere das Programm so, dass die Kürzel in umgekehrter
+ Reihenfolge ausgegeben werden.
+ \begin{block}{Lösung von vorhin}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{IataCode.java}
+ \end{block}
+\end{frame}
+
+\begin{frame}{Flughafenkürzel: Umgekehrte Reihenfolge - Lösung}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{IataCode-2.java}
+\end{frame}
+
+\begin{frame}{Flughafenkürzel: Jumping}
+ Modifiziere das Programm so, dass nur jedes dritte Element
+ ausgegeben wird.
+ \begin{block}{Lösung von vorhin}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{IataCode.java}
+ \end{block}
+\end{frame}
+
+\begin{frame}{Flughafenkürzel: Jumping - Lösung}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{IataCode-3.java}
+\end{frame}
+
+\subsection{Praxis: Bilder}
+\begin{frame}{Praxis: Bilder}
+ Gegeben ist ein Schwarz-Weiß Bild \myCode{int[][] image}.
+ \begin{enumerate}
+ \item Was repräsentiert \myCode{image[2][42]}?
+ \item Schreiben Sie eine Methode, die die durchschnittliche
+ Farbe von \myCode{image} berechnet und zurückgibt.
+ \end{enumerate}
+\end{frame}
+
+\begin{frame}{Praxis: Bilder - Lösung}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Bilder.java}
+
+ Mögliche Probleme:
+ \begin{itemize}
+ \item Ein \myCode{int} für \myCode{sum} ist eventuell zu klein
+ \item 255 Grauwerte, \myCode{int} hat maximalwert von 2.147.483.64
+ \item[$\Rightarrow$] $\frac{2147483647}{255} \approx 8.4 \cdot 10^6$
+ \item[$\Rightarrow$] maximal 8.4 Millionen Pixel
+ \item[$\Rightarrow$] $\sqrt{8.4 \cdot 10^6} \approx 2900$
+ \item[$\Rightarrow$] maximale Auflösung von $2900 \times 2900$ Pixel
+ \item Eventuell \myCode{int[][] image = new int[0][0];}
+ \end{itemize}
+\end{frame}
+
+\subsection{Praxis: Sieb des Erasthostenes}
+\begin{frame}{Praxis: Sieb des Erasthostenes}
+ Implementieren Sie das Sieb des Erasthostenes.
+\end{frame}
+
+\section{Allgemeine Hinweise zu ÜB}
+\subsection{Praktomat}
+\begin{frame}{Praktomat}
+ \begin{itemize}
+ \item Fragen frühzeitig stellen!
+ \item Wenn ihr Pakete verwendet, am Anfang eurer Dateien
+ also \myCode{package AB\_2;} oder ähnliches steht,
+ müsst ihr die korrekte Ordnerstruktur in den Praktomat
+ hochladen
+ \item In Eclipse im Fenster "`Navigation"' den Ordner "`src"'
+ auswählen
+ \item \menu{File > Export\dots > File system}
+ \item Zip-Datei aus dem exportiertem src-Ordner erstellen
+ \item Zip-Datei hochladen
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Projekt mit Eclipse exportieren}{eclipse-export-project.png}
+
+\begin{frame}{Allgemeines}
+ \begin{itemize}
+ \item Eclipse-Warnungen beherzigen und die Ursache dafür beseitigen
+ \item Formattieren: \keys{Strg + A} und \keys{Strg + \shift + F}
+ \item Encoding: \menu{Project > Properties > Ressource > Text file encoding > UTF-8}
+ \end{itemize}
+\end{frame}
+
+\section{Hinweise zum ÜB 3}
+\subsection{ÜB 3}
+\begin{frame}{ÜB 3}
+ \begin{itemize}
+ \item A1:
+ \begin{itemize}
+ \item Pro Aufgabe jeweils eine Textdatei(\myCode{A1.txt}, \myCode{B1.txt})
+ \item Schaut euch meinen Artikel \href{http://martin-thoma.com/java-puzzle-1-pre-and-postincrement/}{Java Puzzle \#1: Pre- and Postincrement} an
+ \end{itemize}
+ \item A2: Buchstaben "`d"' und "`f"' nicht verwenden
+ \end{itemize}
+\end{frame}
+
+\section{Abspann}
+\subsection{Comic}
+\framedgraphic{Abgaben um 11:55 Uhr}{ub-2-abgabge.png}
+\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-2010-01-commenting.jpg}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-05/ub-2-abgabge.png b/presentations/Programmieren-Tutorium/Tutorium-05/ub-2-abgabge.png
new file mode 100644
index 0000000..89acdae
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-05/ub-2-abgabge.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/Camera.java b/presentations/Programmieren-Tutorium/Tutorium-06/Camera.java
new file mode 100644
index 0000000..a577eb7
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-06/Camera.java
@@ -0,0 +1,89 @@
+/**
+ * This class represents a digital camera with an autofocus feature.
+ *
+ * @author Markus Iser, Martin Thoma
+ *
+ */
+public class Camera {
+ /** This epsilon is used for internal float comparisons. */
+ private static final double EPSILON = 1E-6;
+
+ /** The objective that is currently used by the camera. */
+ private final Objective objective;
+
+ /**
+ * The constructor for objective.
+ *
+ * @param objective
+ * an objective
+ */
+ public Camera(final Objective objective) {
+ this.objective = objective;
+ }
+
+ /**
+ * Check two doubles for equality.
+ *
+ * @param fp1 first floating point number
+ * @param fp2 second floating point number
+ * @return {@code true} if both floats are equal, otherwise {@code false}
+ */
+ private boolean fpEquals(final double fp1, final double fp2) {
+ return Math.abs(fp1 - fp2) < EPSILON;
+ }
+
+ /**
+ * Determine if the contrast on the left is higher than on the current
+ * position.
+ *
+ * @param objective the objective you are manipulating
+ * @return {@code true} the contrast on the left of the current position is
+ * higher, otherwise {@code false}
+ */
+ private boolean isLeftContrastHigher(Objective objective) {
+ double contrast = objective.getContrast();
+ objective.stepLeft();
+ double contrastNew = objective.getContrast();
+ objective.stepRight();
+
+ // check if the contrast - according to our EPSILON - is the same
+ if (fpEquals(contrast, contrastNew)) {
+ return false;
+ }
+
+ return contrastNew > contrast;
+ }
+
+ /**
+ * Adjust objective to get the optimum focus. The optimum focus is
+ * determined by the highest contrast.
+ */
+ public void autofocus() {
+ boolean stepLeft;
+ double contrast = objective.getContrast();
+
+ // determine direction
+ stepLeft = isLeftContrastHigher(objective);
+
+ // loop until optimum passed
+ while (objective.getContrast() > contrast
+ && !fpEquals(contrast, objective.getContrast())) {
+ contrast = objective.getContrast();
+ if (stepLeft) {
+ objective.stepLeft();
+ } else {
+ objective.stepRight();
+ }
+ }
+
+ // optional correction-move back
+ if (!fpEquals(contrast, objective.getContrast())) {
+ if (stepLeft) {
+ objective.stepRight();
+ } else {
+ objective.stepLeft();
+ }
+ }
+ }
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/Gears.java b/presentations/Programmieren-Tutorium/Tutorium-06/Gears.java
new file mode 100644
index 0000000..1a57b8b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-06/Gears.java
@@ -0,0 +1,67 @@
+/**
+ * This class models the gears. It is restricted to derailleur gears.
+ *
+ * @author Markus Iser, Martin Thoma
+ * @version 1.0
+ */
+
+public class Gears {
+ public static final int MIN_FRONT_SPROCKETS = 1;
+ public static final int MAX_FRONT_SPROCKETS = 3;
+ public static final int MIN_REAR_SPROCKETS = 1;
+ public static final int MAX_REAR_SPROCKETS = 10;
+
+ private int frontSprockets;
+ private int rearSprockets;
+
+ /** Price in cents. */
+ private final int price;
+
+ Gears(int frontSprockets, int rearSprockets, int price) {
+ setSprockets(frontSprockets, rearSprockets);
+ this.price = price;
+ }
+
+ /**
+ * Sets the sprocket numbers.
+ * Uses default-values if consisteny criteria are not met.
+ * @param sprockets
+ * @param rearSprockets
+ */
+ void setSprockets(int sprockets, int rearSprockets) {
+ this.frontSprockets = sprockets;
+ this.rearSprockets = rearSprockets;
+
+ if (!(this.frontSprockets >= 1)) { // A.1
+ this.frontSprockets = 1;
+ } else if (!(this.frontSprockets < 4)) { // A.2
+ this.frontSprockets = 3;
+ }
+
+ // B.1, B.2
+ if (this.rearSprockets < 1 || this.rearSprockets > 9) {
+ this.rearSprockets = this.frontSprockets * 3;
+ }
+
+ if (this.rearSprockets < this.frontSprockets) { // C.1
+ this.rearSprockets = this.frontSprockets;
+ } else if (this.rearSprockets > 3 * this.frontSprockets) { // C.2
+ this.rearSprockets = 3 * this.frontSprockets;
+ }
+ }
+
+ /**
+ * @return the number of gears as the number of sprocket-combinations
+ */
+ int getNumberOfGears() {
+ return frontSprockets * rearSprockets;
+ }
+
+ /**
+ * @return the price of the gears
+ */
+ int getPrice() {
+ return price;
+ }
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/Gleitkommazahlen.png b/presentations/Programmieren-Tutorium/Tutorium-06/Gleitkommazahlen.png
new file mode 100644
index 0000000..b9f3272
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-06/Gleitkommazahlen.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/Makefile b/presentations/Programmieren-Tutorium/Tutorium-06/Makefile
new file mode 100644
index 0000000..3bf1b36
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-06/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-06
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/String.java b/presentations/Programmieren-Tutorium/Tutorium-06/String.java
new file mode 100644
index 0000000..b24d345
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-06/String.java
@@ -0,0 +1,8 @@
+public class String {
+
+ java.lang.String content;
+
+ public String(java.lang.String content) {
+ this.content = content;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/World.java b/presentations/Programmieren-Tutorium/Tutorium-06/World.java
new file mode 100644
index 0000000..963507e
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-06/World.java
@@ -0,0 +1,6 @@
+public class World {
+ public static void main(String[] args) {
+ String a = new String("Lorem ipsum");
+ System.out.println(a);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/foreach.java b/presentations/Programmieren-Tutorium/Tutorium-06/foreach.java
new file mode 100644
index 0000000..c73d973
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-06/foreach.java
@@ -0,0 +1,15 @@
+public class World {
+ public static void main(String[] args) {
+ int[] myArray = { 1, 5, 6, 23, 4, 2, -1, 4 };
+
+ // for-Schleife
+ for (int i = 0; i < myArray.length; i++) {
+ System.out.println(myArray[i]);
+ }
+
+ // foreach-Schleife
+ for (int element : myArray) {
+ System.out.println(element);
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/new-package.png b/presentations/Programmieren-Tutorium/Tutorium-06/new-package.png
new file mode 100644
index 0000000..f893ff9
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-06/new-package.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-06/tutorium-06.tex b/presentations/Programmieren-Tutorium/Tutorium-06/tutorium-06.tex
new file mode 100644
index 0000000..990c5ae
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-06/tutorium-06.tex
@@ -0,0 +1,375 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+
+% use KIT-Theme
+% see http://sdqweb.ipd.kit.edu/wiki/Dokumentvorlagen
+%\usetheme{Frankfurt} % see http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html as fallback
+\InputIfFileExists{../templates/beamerthemekit.sty}{\usepackage{../templates/beamerthemekit}}{\usetheme{Frankfurt}}
+\usefonttheme{professionalfonts}
+
+\usepackage{hyperref}
+\usepackage{lmodern}
+\usepackage{listings}
+\usepackage{wrapfig} % see http://en.wikibooks.org/wiki/LaTeX/Floats,_Figures_and_Captions
+\usepackage[utf8]{inputenc} % this is needed for german umlauts
+\usepackage[ngerman]{babel} % this is needed for german umlauts
+\usepackage[T1]{fontenc} % this is needed for correct output of umlauts in pdf
+\usepackage{verbatim}
+\usepackage{relsize}
+\usepackage{subfigure}
+\usepackage{algorithm,algpseudocode}
+\usepackage{minted} % needed for the inclusion of source code
+\usepackage{menukeys}
+\usepackage{xcolor}
+\usepackage{pifont}% http://ctan.org/pkg/pifont
+\newcommand{\cmark}{\ding{51}}%
+\newcommand{\xmark}{\ding{55}}%
+\usepackage{../templates/myStyle}
+
+\newcommand\tutor{Martin Thoma}
+\newcommand\tutNR{10}
+\newcommand\titleText{Programmieren-Tutorium Nr. \tutNR{} bei \tutor}
+\institute{Fakultät für Informatik}
+
+\hypersetup{pdftitle={\titleText}}
+\beamertemplatenavigationsymbolsempty
+
+\newcommand\InsertToC[1][]{
+ \begin{frame}{Outline}
+ \tableofcontents[subsectionstyle=show/show/show, subsubsectionstyle=show/show/show, #1]
+ \end{frame}
+}
+
+\begin{document}
+\title{\titleText}
+\subtitle{Pakete}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=String.java, frame=lines]{java}{String.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=World.java, frame=lines]{java}{World.java}
+ \end{minipage}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Ergebnis}
+ \myCode{Exception in thread "main" java.lang.NoSuchMethodError: main}\\
+ Es gibt nun keine \\
+ \myCode{public static void main(java.lang.String[] args) \{}\\
+ \begin{block}{Lehre}
+ Keine Java-internen Typen umschreiben.
+ \end{block}
+\end{frame}
+
+
+\section{ÜB 2}
+\subsection{Nachbesprechung ÜB 2}
+\begin{frame}{Allgmeines}
+ \begin{block}{Musterlösung}
+ Inoffizielle Musterlösung von Simon und mir ist unter
+ \href{http://goo.gl/BfA6i}{http://goo.gl/BfA6i} erhältlich.\\
+ Bitte dort anschauen.
+ \end{block}
+\end{frame}
+
+\begin{frame}{Allgmeines}
+ \begin{block}{Stil}
+ \begin{itemize}[<+->]
+ \item Niemals \myCode{if (variable == true)}, sondern \myCode{if (variable)}
+ \item "`Dead Code"' - also Code der niemals erreicht wird - wird bestraft
+ \item Große Probleme ($\rightarrow$ lange Methoden) aufsplitten
+ \end{itemize}
+ \end{block}
+
+ \begin{itemize}[<+->]
+ \item Die bereitgestellten Code-Vorlagen sind keine Musterlösungen!
+ \item Kein "`TODO"' in Abgaben
+ \item Aufgabe B1 (Histogramm) war fehlerhaft: Natürlich muss der Kontrast nur "`nicht-negativ"' sein und nicht "`positiv"'
+ \item Laufvariablen müssen nicht immer \myCode{i} und \myCode{j} heißen
+ \item Schaut euch die hochgeladeten Dateien im Praktomat an
+ \item Redundanter Code ist schlecht $\Rightarrow$ Besser: Neue Methode anlegen
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Allgemeines}
+ \begin{block}{Genau lesen}
+ \begin{itemize}[<+->]
+ \item \textbf{A.1.1 Konstruktor von Bike}: "`Modifizieren Sie
+ den Konstruktor der Klasse Bike, indem Sie aus der
+ Signatur das Argument, nach dem bisher der Preis
+ gesetzt wird, entfernen."'
+ \item \textbf{A.1.2 Setter für Gears} "`Schreiben Sie den
+ Konstruktor so um, dass er die Methode setSprockets
+ benutzt, um einen konsistenten Anfangszustand zu
+ garantieren."'
+ \item \textbf{A.2.1 Tribonacci-Folge}: "`Geben Sie \textbf{nur} die
+ siebenunddreißigste Tribonacci-Zahl auf der Konsole
+ aus."'
+ \item[$\Rightarrow$] Es werden automatische Tests durchgeführt.
+ Stimmt die Ausgabe nicht exakt - also jedes einzelne
+ (Leer)zeichen -, schlägt der Test fehl.
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\begin{frame}{Tipp für BikeShop}
+ \myCode{\href{http://docs.oracle.com/javase/7/docs/api/java/lang/System.html\#arraycopy(java.lang.Object, int, java.lang.Object, int, int)}{System.arraycopy(warehouse, 0, newStock, 0, warehouse.length);}}
+\end{frame}
+
+\begin{frame}{setSprockets}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Gears.java, frame=lines, firstline=25, lastline=51]{java}{Gears.java}
+\end{frame}
+
+\begin{frame}{Einheiten}
+ Einheiten \textbf{immer} angeben, da \dots
+ \begin{itemize}[<+->]
+ \item nie klar ist, welche Einheit gemeint ist
+ \item es ein richtig ärgerlicher Fehler ist
+ \item fehlende Einheiten viel Geld kosten können ($\rightarrow$ \href{http://www.youtube.com/watch?v=q2L5\_swAT5A}{Video: NASA Measuring Failure} - Mars Orbiter)
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Attribute}
+ \begin{alertblock}{Attribute}
+ \begin{itemize}
+ \item Attribute sind Eigenschaften eines Objekts oder einer Klasse
+ \item Attribute sind keine Hilfsvariablen
+ \end{itemize}
+ \end{alertblock}
+\end{frame}
+
+\begin{frame}{Vergleiche mit floats}
+ Nicht jede Zahl kann als Gleitkomma-Zahl dargestellt werden:
+ \includegraphics[height=50mm]{Gleitkommazahlen.png}\\
+ \tiny{Quelle: \href{http://de.wikipedia.org/wiki/Datei:Gleitkommazahlen.svg}{de.wikipedia.org/wiki/Datei:Gleitkommazahlen.svg}}\\
+
+
+\end{frame}
+
+\begin{frame}{Vergleiche mit floats}
+ Zusätzlich sollte man bei der Camera-Aufgabe von $\varepsilon = 10^6$ ausgehen.\\
+ Die Vergleiche müssen also etwa so aussehen:
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=24, firstline=24, lastline=33]{java}{Camera.java}
+\end{frame}
+
+\begin{frame}{Camera.java: isLeftContrastHigher}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=35, firstline=35, lastline=55]{java}{Camera.java}
+\end{frame}
+
+\begin{frame}{Camera.java: Eigentlicher Code}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=57, firstline=57, lastline=87]{java}{Camera.java}
+\end{frame}
+
+\begin{frame}{Gerüchteküche}
+ Bringt es einen Vorteil, eine schwere Aufgabe nicht zu bearbeiten?
+ \begin{itemize}[<+->]
+ \item Es gibt für jede Teilaufgabe ein Punktekontingent
+ \item Bearbeitet ihr eine Teilaufgabe nicht, ziehe ich alle Punkte ab
+ \item Bearbeitet ihr einen Teil einer Teilaufgabe nicht, ziehe
+ ich mindestens so viele Punkte ab, wie derjenige mit dem
+ höchstem Abzug abgezogen bekommen hat
+ \item Wenn der Code nicht das tut, was gefordert wird, kann ich
+ auch alles abziehen
+ \item[$\Rightarrow$] Nein, es bringt keinen Vorteil
+ \end{itemize}
+\end{frame}
+
+\section{Vorlesungsergänzungen}
+\subsection{Pakete}
+\begin{frame}{Pakete}
+ \begin{itemize}[<+->]
+ \item Dienen der Strukturierung des Quelltextes
+ \item Sollen Namenskonflikte vermeiden (z.B. Klasse \myCode{Person}
+ in einem Paket \myCode{uni} ist wohl anders als Klasse
+ \myCode{Person} im Paket \myCode{politik})
+ \item Können über \myCode{.jar}-Dateien eingebunden werden
+ \item Könnt ihr über \keys{\shift + Alt + N} und \menu{Package}
+ oder mit einem Rechtsklick in Eclipse erzeugen:
+ \includegraphics[height=30mm]{new-package.png}\\
+ \item Eine Klasse ist Teil eines Paketes, wenn sie \dots
+ \begin{itemize}
+ \item in dem Ordner mit dem Paketnamen liegt
+ \item sie \myCode{package ;} ganz am Anfang stehen hat
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Pakete}
+ \begin{block}{Namenskonventionen}
+ \begin{itemize}
+ \item Pakete werden klein geschrieben
+ \item Pakete können "`Unterpakete"' haben. Dies wird durch
+ einen Punkt angedeutet:
+ \begin{itemize}
+ \item \href{http://docs.oracle.com/javase/7/docs/api/overview-summary.html}{Offizielle Pakete}:
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/io/package-summary.html}{java.io}
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html}{java.lang} - hat z.B. \myCode{Byte}, \myCode{Integer}, \dots
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/package-summary.html}{java.lang.annotation}
+ \end{itemize}
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\begin{frame}{Pakete: protected}
+ \begin{tabular}{l||c|c|c|c}
+ Modifier & Class & Package & Subclass & World\\
+ \hline\hline
+ \myCode{public} & \cmark & \cmark & \cmark & \cmark \\
+ \myCode{protected} & \cmark & \cmark & \cmark & \xmark \\
+ no modifier & \cmark & \cmark & \xmark & \xmark \\
+ \myCode{private} & \cmark & \xmark & \xmark & \xmark
+ \end{tabular}
+
+ \small{Weitere Informationen: \href{http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html}{Controlling Access to Members of a Class}}
+ \pause
+ \begin{block}{Tipp}
+ \myCode{private} macht fast immer Sinn. Wenn ihr nicht wisst,
+ ob ihr \myCode{private} oder \myCode{protected} nehmen sollt,
+ nehmt protected. Kein modifier macht selten Sinn. Das sieht
+ so aus, als ob ihr es dem Zufall überlasst.
+ \end{block}
+\end{frame}
+
+\subsection{foreach-Schleife}
+\begin{frame}{foreach in Java: Allgemeines}
+ Foreach \dots
+ \begin{itemize}[<+->]
+ \item wird in Java-Kreisen manchmal auch "`Enhanced for loop"' genannt
+ \item geht alle Elemente einer
+ \href{http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html}{Collection}
+ durch zu gehen (genauer: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html}{Iterable})
+ \item sollte verwendet werden, wenn man es verwenden kann
+ \item ist auch in der \href{http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html}{Dokumentation} (Nur in 1.5?)
+ und im \href{http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html}{Tutorial}
+ \item ist in der \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html\#jls-14.14.2}{JLS SE7} spezifiziert
+ \item ist Teil des \href{http://docs.oracle.com/javase/tutorial/extra/certification/javase-7-programmer1.html}{Programmer Level I Exams}
+ für das "`Programmer Language Certification"'
+ \end{itemize}
+\end{frame}
+\begin{frame}{foreach in Java: Beispiel}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=3, lastline=13]{java}{foreach.java}
+\end{frame}
+
+\section{ÜB 3}
+\subsection{Hinweise zu ÜB 3}
+\begin{frame}{Hinweise zu ÜB 3}
+ \begin{itemize}[<+->]
+ \item Nur Klassen und Methoden aus \myCode{java.lang} sind erlaubt
+ \item \textbf{Keine} Textausgabe und keine Schreibzugriffe auf Dateien
+ \item JavaDoc und Datenkapselung ($\rightarrow$ \myCode{private}) sind nun Pflicht
+ \item Pakete sollten nun verwendet werden
+ \item[$\Rightarrow$] Achtung beim Upload in den Praktomaten! vgl. tutorium-05.pdf, Folien 23-24
+ \item[A.1.1] Nur die \myCode{statements.csv} als Abgabe!
+ \item[A.2] \myCode{StrangeClass.java} soll wirklich \textbf{nirgends} "`f"' und kein "`d"' haben
+ \item[A.3] Levenshtein-Distanz $\rightarrow$ nächste Folie
+ \item[A.4] Geometrie $\rightarrow$ übernächste Folie
+ \item[B.1] Der Kommentar, warum ihr die Modifier (\myCode{private, public, protected})
+ verwendet, soll natürlich direkt zum jeweiligen modifier und NICHT in
+ eine extra Textdatei!
+ \end{itemize}
+\end{frame}
+
+\subsection{Levenshtein-Distanz}
+\begin{frame}{A.3 Levenshtein-Distanz}
+ \begin{itemize}[<+->]
+ \item Wer hat sichs angeschaut?
+ \item Verstanden? Falls nicht sind folgende Seiten einen Versuch wert:
+ \begin{itemize}
+ \item \href{http://oldfashionedsoftware.com/tag/levenshtein-distance/}{Guter Artikel}, aber nur bis "`Some Code, Finally"' relevant
+ \item \href{http://de.wikipedia.org/wiki/Levenshtein-Distanz}{de-Wikipedia}
+ \item \href{http://en.wikipedia.org/wiki/Levenshtein_Distance\#Computing_Levenshtein_distance}{en-Wiki} mit Pseudocode
+ \item \href{http://www-igm.univ-mlv.fr/~lecroq/seqcomp/node2.html}{eine Visualisierung}
+ \end{itemize}
+ \begin{alertblock}{Achtung!}
+ Der Algorithmus muss modifiziert werden. Durch die Modifikationen entspricht
+ der Algorithmus nicht mehr den Varianten, die sich im Internet finden lassen.
+ Ohne diese Modifikationen kann ich euch keine Punkte geben!
+ \end{alertblock}
+ \end{itemize}
+\end{frame}
+
+\subsection{A.4 Geometrie}
+\begin{frame}{A.4 Geometrie}
+ \begin{itemize}[<+->]
+ \item Manhattan-Distanz:\\
+ \includegraphics[height=30mm]{ManhattanDistance.pdf}\\
+ \tiny{Quelle: \href{http://commons.wikimedia.org/wiki/File:Manhattan\_distance.svg}{commons.wikipedia.org/wiki/File:Manhattan\_distance.svg}}
+ \end{itemize}
+\end{frame}
+
+\section{Praxis}
+\subsection{Aufgaben}
+\begin{frame}{Aufgaben}
+ Siehe Blätter 5, 6 und 7 in \menu{prog-official > tut\_aufgaben\_ws1112}
+\end{frame}
+
+\section{Abspann}
+\subsection{Tutorium 7}
+\begin{frame}{Tutorium 7}
+ \begin{block}{ÜB 4: Achtung}
+ \begin{itemize}
+ \item Sehr große Aufgabe (viele Methoden / Klassen)
+ \item Die meisten Methoden benötigen nur ein bis vier Zeilen
+ \end{itemize}
+ \end{block}
+
+ \begin{block}{Themenvorschläge fürs nächste mal}
+ \begin{itemize}
+ \item \href{http://docs.oracle.com/javase/7/docs/technotes/guides/language/assert.html}{Assertions}
+ \item Verkettete Listen
+ \item Allgemeine Übungsaufgaben
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\subsection{Nachhilfe}
+\begin{frame}{Nachhilfe}
+ \begin{itemize}[<+->]
+ \item Falls ihr Nachhilfe braucht, meldet euch bei mir oder
+ dem Übungsleiter (Florian Merz)
+ \item Euch wird dann ein Nachhilfelehrer vermittelt
+ \item Die Kosten müsst ihr mit dem Nachhilfelehrer aushandeln
+ \end{itemize}
+\end{frame}
+
+\subsection{Kommende Tutorien}
+\begin{frame}{Kommende Tutorien}
+ \begin{itemize}
+ \item[8.] 26.11.2012
+ \item[7.] 03.12.2012
+ \item[6.] 10.12.2012
+ \item[5.] 17.12.2012: Video "`Library"' zeigen
+ \item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
+ \item[-] 31.12.2012: Silvester - Kein Tutorium
+ \item[4.] 07.01.2013
+ \item[3.] 14.01.2013
+ \item[2.] 21.01.2013
+ \item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
+ \item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
+ \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/programmers-users.jpg}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/Listenbeispiel.jpg b/presentations/Programmieren-Tutorium/Tutorium-07/Listenbeispiel.jpg
new file mode 100644
index 0000000..d4797d1
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-07/Listenbeispiel.jpg differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/Main.java b/presentations/Programmieren-Tutorium/Tutorium-07/Main.java
new file mode 100644
index 0000000..b1760fc
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/Main.java
@@ -0,0 +1,26 @@
+public class Main {
+ public static void main(String[] args) {
+ SinglyLinkedList list = new SinglyLinkedList();
+ list.printList();
+
+ // append new elements at the front of the list
+ list.append(12);
+ list.printList();
+ list.append(13);
+ list.printList();
+ list.append(14);
+ list.printList();
+ list.append(15);
+ list.printList();
+
+ // remove elements
+ list.remove(13);
+ list.printList();
+
+ // find elements
+ int numberA = list.find(14);
+ int numberB = list.find(13);
+ System.out.println(numberA + " " + numberB);
+ }
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/Makefile b/presentations/Programmieren-Tutorium/Tutorium-07/Makefile
new file mode 100644
index 0000000..50d42c1
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-07
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/Node.java b/presentations/Programmieren-Tutorium/Tutorium-07/Node.java
new file mode 100644
index 0000000..59f6c5b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/Node.java
@@ -0,0 +1,9 @@
+public class Node {
+ int container;
+ Node next;
+
+ public Node(int container) {
+ this.container = container;
+ }
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/ObjectDiagram.dia b/presentations/Programmieren-Tutorium/Tutorium-07/ObjectDiagram.dia
new file mode 100644
index 0000000..d5e748a
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-07/ObjectDiagram.dia differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/QuizString.java b/presentations/Programmieren-Tutorium/Tutorium-07/QuizString.java
new file mode 100644
index 0000000..1662459
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/QuizString.java
@@ -0,0 +1,20 @@
+public class QuizString {
+ public static void main(String[] args) {
+ String string1 = new String("Hallo");
+ String string2 = new String("Hallo");
+ if (string1 == string2) {
+ System.out.println("string1 und string2 sind das selbe Objekt.");
+ } else {
+ System.out.println("string1 und string2 sind verschiedene Objekte.");
+ }
+
+ String string3 = "Hallo";
+ String string4 = "Hallo";
+ if (string3 == string4) {
+ System.out.println("string3 und string4 sind das selbe Objekt.");
+ } else {
+ System.out.println("string3 und string4 sind verschiedene Objekte.");
+ }
+ }
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/Singly-linked-list.png b/presentations/Programmieren-Tutorium/Tutorium-07/Singly-linked-list.png
new file mode 100644
index 0000000..2fbc5dc
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-07/Singly-linked-list.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/SinglyLinkedList-structure.java b/presentations/Programmieren-Tutorium/Tutorium-07/SinglyLinkedList-structure.java
new file mode 100644
index 0000000..c047229
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/SinglyLinkedList-structure.java
@@ -0,0 +1,20 @@
+public class SinglyLinkedList {
+
+ Node head;
+
+ public void append(int number) {
+
+ }
+
+ public void remove(int number) {
+
+ }
+
+ public int find(int number) {
+
+ }
+
+ public void printList() {
+
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/SinglyLinkedList.java b/presentations/Programmieren-Tutorium/Tutorium-07/SinglyLinkedList.java
new file mode 100644
index 0000000..06ec723
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/SinglyLinkedList.java
@@ -0,0 +1,70 @@
+public class SinglyLinkedList {
+
+ Node head;
+
+ private boolean isEqual(Node node, int content) {
+ return node.container == content;
+ }
+
+ private Node findNode(int number) {
+ Node currentNode = head;
+
+ while (!isEqual(currentNode, number) && currentNode.next != null) {
+ currentNode = currentNode.next;
+ }
+
+ if (isEqual(currentNode, number)) {
+ return currentNode;
+ } else {
+ return null;
+ }
+ }
+
+ public void append(int number) {
+ Node toInsert = new Node(number);
+ toInsert.next = head;
+ head = toInsert;
+
+ /*
+ * schlecht: Node currentNode = head;
+ *
+ * while (currentNode.next != null) { currentNode = currentNode.next; }
+ * currentNode.next = n;
+ */
+ }
+
+ public void remove(int number) {
+ Node previous = head;
+ Node currentNode = head;
+
+ while (!isEqual(currentNode, number) && currentNode.next != null) {
+ previous = currentNode;
+ currentNode = currentNode.next;
+ }
+
+ if (currentNode.next != null) {
+ previous.next = currentNode.next;
+ }
+ }
+
+ public int find(int number) {
+ Node node = findNode(number);
+
+ if (node == null) {
+ return 0;
+ } else {
+ return node.container;
+ }
+ }
+
+ public void printList() {
+ Node currentNode = head;
+ System.out.print("head -> ");
+ while (currentNode != null) {
+ System.out.print(currentNode.container + " -> ");
+ currentNode = currentNode.next;
+ }
+ System.out.println("null");
+ }
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/singleLines.java b/presentations/Programmieren-Tutorium/Tutorium-07/singleLines.java
new file mode 100644
index 0000000..a80dc8e
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/singleLines.java
@@ -0,0 +1,6 @@
+for (int i = 0; i < image.length; i++) {
+ for (int j = 0; j < image[i].length; j++) {
+ assert(0 <= image[i][j] && image[i][j] <= 255);
+ histogram[image[i][j]]++;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-07/tutorium-07.tex b/presentations/Programmieren-Tutorium/Tutorium-07/tutorium-07.tex
new file mode 100644
index 0000000..2ab9749
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-07/tutorium-07.tex
@@ -0,0 +1,275 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+\usepackage{../templates/myStyle}
+
+\begin{document}
+\title{\titleText}
+\subtitle{String interning, Assertions, Einfach verkettete Listen}
+\author{\tutor}
+\date{3. Dezember 2012}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{QuizString.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler? \xmark
+ \item Gibt es einen Laufzeit-Fehler? \xmark
+ \item Gibt es eine Ausgabe? \cmark{} Welche Ausgabe gibt es?
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Quiz: Antwort}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{QuizString.java}
+ \begin{itemize}
+ \item string1 und string2 sind verschiedene Objekte.
+ \item string3 und string4 sind das selbe Objekt.
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Quiz: Erklärung}
+ \begin{itemize}[<+->]
+ \item Erstellt man einen String mit \myCode{String abc = new String("Hallo");}
+ wird ein neues Objekt angelegt
+ \item Erstellt man einen String mit \myCode{String abc = "Hallo";}
+ macht Java "`String interning"'
+ \end{itemize}
+ \pause[\thebeamerpauses]
+ \begin{alertblock}{Achtung}
+ Trotzdem mit \myCode{abc.equals(def);} vergleichen! Nur so
+ ist garantiert, dass ihr auf Gleichheit (und nicht nur auf
+ "`Selbstheit"' vergleicht).
+ \end{alertblock}
+\end{frame}
+
+\section{Assertions}
+\subsection{Allgemeines}
+\begin{frame}{Assertions}
+ \begin{itemize}[<+->]
+ \item Problem: Es tritt ein falsches Ergebnis auf, es ist
+ aber nicht klar warum.
+ \item Lösung: Man macht Zusicherungen (engl. assertions)
+ \item Man überlegt sich also, welche Variablen an
+ krischen Stellen welche Werte oder Beziehungen
+ zueinander haben sollen
+ \end{itemize}
+ \pause[\thebeamerpauses]
+ \begin{alertblock}{Wichtig: Assertions sind keine Exceptions!}
+ \begin{tabular}{l|l}
+ \textbf{Assertion} & \textbf{Exception}\\
+ \hline
+ muss man aktivieren & wird immer ausgeführt\\
+ dient zum Entdecken von Fehlern & dient zum behandeln von Fehlern\\
+ z.B. (a < b), (a !=0), \dots & z.B. \href{http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html}{IOException}\\
+ \end{tabular}
+ \end{alertblock}
+\end{frame}
+
+\begin{frame}{Beispiel}
+ \inputminted[linenos=false, tabsize=4, fontsize=\small]{java}{singleLines.java}
+\end{frame}
+
+\begin{frame}{Assertions aktivieren}
+ In Eclipse:
+ \begin{itemize}
+ \item \menu{Window > Preferences > Java > Installed JREs > Edit...}
+ \item Default VM Arguments: "`-enableassertions"' hinzufügen
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Weitere Materialien}
+ \begin{itemize}
+ \item docs.oracle.com: \href{http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html}{Programming With Assertions}
+ \item galileo openbook: \href{http://openbook.galileodesign.de/javainsel5/javainsel07_005.htm}{Java ist auch eine Insel}
+ \item Java Blog Buch: \href{http://www.java-blog-buch.de/0609-assertions/}{06.09 Assertions}
+ \end{itemize}
+\end{frame}
+
+\section{Einfach verkettete Listen}
+\subsection{Allgemeines}
+\begin{frame}{Einfach verkettete Listen}
+ \begin{block}{Szenario}
+ \begin{itemize}[<+->]
+ \item Ihr wollt euch Druckaufträge speichern
+ \item Funktioniert mit Array
+ \item Problem:
+ \begin{itemize}
+ \item Ihr belegt immer konstant viel Speicher
+ \item Eventuell braucht ihr mehr, eventuell weniger Speicher
+ \end{itemize}
+ \item Lösung: Verkettete Listen
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\begin{frame}{Idee}
+ \begin{itemize}[<+->]
+ \item Man speichert sich nur einen Zeiger
+ \item Dieser Zeiger zeigt auf "`Knoten"'
+ \item Jeder Knoten hat wieder einen Zeiger
+ \item Jeder Knoten kann wieder auf einen Knoten zeigen
+ \end{itemize}
+ \only<\thebeamerpauses>{
+ \includegraphics[width=\linewidth]{Singly-linked-list.png}
+ }
+\end{frame}
+
+\framedgraphic{Weiteres Beispiel}{Listenbeispiel.jpg}
+
+\begin{frame}{Was wollen wir?}
+ \begin{itemize}[<+->]
+ \item Elemente hinzufügen
+ \item Elemente löschen
+ \item Elemente finden
+ \end{itemize}
+
+ \pause[\thebeamerpauses]
+ \begin{alertblock}{Wichtig}
+ Zwischenergebnisse ausgeben
+ \end{alertblock}
+\end{frame}
+
+\begin{frame}{Wie sieht das aus?}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Main.java, frame=lines]{java}{Main.java}
+\end{frame}
+
+\begin{frame}{Welche Klassen brauchen wir?}
+ \only<2>{
+ \includegraphics[width=0.7\textheight]{ObjectDiagram.pdf}
+ }
+\end{frame}
+
+\begin{frame}{Generics}
+ \begin{block}{Hinweis}
+ \begin{itemize}[<+->]
+ \item Noch erstellt ihr eine Liste für genau einen Datentyp
+ \item Eigentlich macht der Code immer das gleiche, ist also
+ vom Datentypen unabhängig
+ \item Das löst man später mit "`Generics"'
+ \end{itemize}
+ \end{block}
+
+ \pause[\thebeamerpauses]
+ \begin{block}{Hinweis 2}
+ Oder - z.B. bei den Abschlussaufgaben - man verwendet einfach Datentypen
+ aus \href{http://docs.oracle.com/javase/7/docs/api/java/util/package-summary.html}{java.util}:
+ \begin{itemize}[<+->]
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html}{LinkedList}
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html}{HashMap} /
+ \href{http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html}{TreeMap}
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html}{HashSet} /
+ \href{http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html}{TreeSet}
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\subsection{Der Knoten}
+\begin{frame}{Teil 1: Der Knoten}
+ \begin{block}{Teil 1}
+ Erstelle die Klasse Node
+ \end{block}
+ \includegraphics[width=0.7\textheight]{ObjectDiagram-list-node}
+\end{frame}
+
+\begin{frame}{Teil 1: Der Knoten}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Node.java, frame=lines]{java}{Node.java}
+\end{frame}
+
+\subsection{Die Liste}
+\begin{frame}{Teil 2.1: Die Struktur der Liste}
+ \begin{block}{Teil 2.1}
+ Erstelle die Klasse SinglyLinkedList (noch ohne Funktionalität)
+ \end{block}
+ \includegraphics[width=0.7\textheight]{ObjectDiagram-list-node}
+\end{frame}
+
+\begin{frame}{Teil 2.1: Die Struktur der Liste}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SinglyLinkedList-structure.java]{java}{SinglyLinkedList-structure.java}
+\end{frame}
+
+\begin{frame}{Teil 2.2: printList()}
+ \begin{block}{Teil 2.2}
+ Erstelle die Methode "`printList"'
+ \end{block}
+ \includegraphics[width=0.7\textheight]{ObjectDiagram-list-node}
+\end{frame}
+
+\begin{frame}{Teil 2.2: printList()}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=60, firstline=60, lastline=69]{java}{SinglyLinkedList.java}
+\end{frame}
+
+\begin{frame}{Teil 2.3: Hilfsmethoden}
+ \begin{block}{Teil 2.3}
+ Erstelle die Methoden \myCode{boolean isEqual(Node node, int content)}
+ und \myCode{Node findNode(int number)}
+ \end{block}
+ \includegraphics[width=0.7\textheight]{ObjectDiagram-list-node}
+\end{frame}
+
+\begin{frame}{Teil 2.3: Hilfsmethoden}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=5, firstline=5, lastline=21]{java}{SinglyLinkedList.java}
+\end{frame}
+
+\begin{frame}{Teil 2.4: append}
+ \begin{block}{Teil 2.4}
+ Erstelle die Methode \myCode{append}
+ \end{block}
+ \includegraphics[width=0.7\textheight]{ObjectDiagram-list-node}
+\end{frame}
+
+\begin{frame}{Teil 2.4: append}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=23, firstline=23, lastline=34]{java}{SinglyLinkedList.java}
+\end{frame}
+
+\begin{frame}{Teil 2.5: remove}
+ \begin{block}{Teil 2.5}
+ Erstelle die Methode \myCode{remove}
+ \end{block}
+ \includegraphics[width=0.7\textheight]{ObjectDiagram-list-node}
+\end{frame}
+
+\begin{frame}{Teil 2.5: remove}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=36, firstline=36, lastline=48]{java}{SinglyLinkedList.java}
+\end{frame}
+
+\begin{frame}{Teil 2.6: find}
+ \begin{block}{Teil 2.6}
+ Erstelle die Methode \myCode{find}
+ \end{block}
+ \includegraphics[width=0.7\textheight]{ObjectDiagram-list-node}
+\end{frame}
+
+\begin{frame}{Teil 2.6: find}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=50, firstline=50, lastline=58]{java}{SinglyLinkedList.java}
+\end{frame}
+
+\section{Abspann}
+\subsection{Kommende Tutorien}
+\begin{frame}{Kommende Tutorien}
+ \begin{itemize}
+ \item[7.] 03.12.2012: JUnit-Tests, \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#toString()}{toString}, Vererbung
+ \item[6.] 10.12.2012: Generics?
+ \item[5.] 17.12.2012: Video "`Library"' zeigen
+ \item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
+ \item[-] 31.12.2012: Silvester - Kein Tutorium
+ \item[4.] 07.01.2013
+ \item[3.] 14.01.2013
+ \item[2.] 21.01.2013
+ \item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
+ \item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
+ \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-development-cycle.jpg}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/ACMEBicycle.java b/presentations/Programmieren-Tutorium/Tutorium-08/ACMEBicycle.java
new file mode 100644
index 0000000..4541b55
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/ACMEBicycle.java
@@ -0,0 +1,4 @@
+class ACMEBicycle implements Bicycle {
+ // remainder of this class
+ // implemented as before
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Animal.java b/presentations/Programmieren-Tutorium/Tutorium-08/Animal.java
new file mode 100644
index 0000000..bc6be62
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/Animal.java
@@ -0,0 +1,7 @@
+public class Animal {
+ private String sound;
+
+ public void roar() {
+ System.out.println(sound);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Bicycle.java b/presentations/Programmieren-Tutorium/Tutorium-08/Bicycle.java
new file mode 100644
index 0000000..ba35a37
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/Bicycle.java
@@ -0,0 +1,11 @@
+interface Bicycle {
+
+ // wheel revolutions per minute
+ void changeCadence(int newValue);
+
+ void changeGear(int newValue);
+
+ void speedUp(int increment);
+
+ void applyBrakes(int decrement);
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Cat.java b/presentations/Programmieren-Tutorium/Tutorium-08/Cat.java
new file mode 100644
index 0000000..afe8bb3
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/Cat.java
@@ -0,0 +1,12 @@
+public class Cat extends Animal {
+ public String sound;
+
+ public Cat() {
+ String sound = "Maunz";
+ }
+
+ @Override
+ public void roar() {
+ System.out.println("Cat:" + sound);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-detailed-results.png b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-detailed-results.png
new file mode 100755
index 0000000..9c072d0
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-detailed-results.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-execution-button.png b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-execution-button.png
new file mode 100755
index 0000000..0294da0
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-execution-button.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-execution-result.png b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-execution-result.png
new file mode 100755
index 0000000..87116ff
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-execution-result.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-new-filter-trace.png b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-new-filter-trace.png
new file mode 100755
index 0000000..375f480
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-new-filter-trace.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-new-test.png b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-new-test.png
new file mode 100755
index 0000000..6815c32
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-new-test.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-project-explorer.png b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-project-explorer.png
new file mode 100755
index 0000000..ef5f7e8
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-08/Eclipse-JUnit-project-explorer.png differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Jungle.java b/presentations/Programmieren-Tutorium/Tutorium-08/Jungle.java
new file mode 100644
index 0000000..9bba8c4
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/Jungle.java
@@ -0,0 +1,15 @@
+public class Jungle {
+ public static void main(String[] args) {
+ Animal tigger = new Tiger();
+ Animal felix = new Cat();
+ Cat ninja = new Cat();
+ Tiger diego = new Tiger();
+
+ tigger.roar();
+ felix.roar();
+ ninja.roar();
+ diego.roar();
+ diego.sound = "Hust hust";
+ diego.roar();
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Klassendiagramm.dia b/presentations/Programmieren-Tutorium/Tutorium-08/Klassendiagramm.dia
new file mode 100644
index 0000000..a757f32
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-08/Klassendiagramm.dia differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/LevenshteinCompilationTest.java b/presentations/Programmieren-Tutorium/Tutorium-08/LevenshteinCompilationTest.java
new file mode 100644
index 0000000..3bf7616
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/LevenshteinCompilationTest.java
@@ -0,0 +1,21 @@
+import levenshtein.Levenshtein;
+
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import static org.junit.Assert.assertEquals;
+
+public class LevenshteinCompilationTest {
+
+ public LevenshteinCompilationTest() {
+ }
+
+ @Test(timeout = 10000)
+ public void runTest() {
+ Levenshtein levenshtein = new Levenshtein("nämlich", "dämlich");
+ assertEquals("Incorrect result comparing nämlich and dämlich", 1, levenshtein.getDistance());
+ }
+
+ public static void main(String[] args) throws Exception {
+ JUnitCore.main(LevenshteinCompilationTest.class.getName());
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Makefile b/presentations/Programmieren-Tutorium/Tutorium-08/Makefile
new file mode 100644
index 0000000..b1bbbdc
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-08
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Node.java b/presentations/Programmieren-Tutorium/Tutorium-08/Node.java
new file mode 100644
index 0000000..7ad4c74
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/Node.java
@@ -0,0 +1,13 @@
+public class Node {
+ public Bike element;
+ public Node next;
+
+ public Node(Bike element) {
+ this.element = element;
+ }
+
+ @Override
+ public String toString() {
+ return "Node[element=" + element + "]";
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/Tiger.java b/presentations/Programmieren-Tutorium/Tutorium-08/Tiger.java
new file mode 100644
index 0000000..299b724
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/Tiger.java
@@ -0,0 +1,3 @@
+public class Tiger extends Animal {
+ String sound = "ROAR";
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-08/tutorium-08.tex b/presentations/Programmieren-Tutorium/Tutorium-08/tutorium-08.tex
new file mode 100644
index 0000000..e470ade
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-08/tutorium-08.tex
@@ -0,0 +1,277 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+\usepackage{../templates/myStyle}
+
+\begin{document}
+\title{\titleText}
+\subtitle{JUnit, Vererbung, toString(), Interfaces}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz: Vererbung}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Tiger.java, frame=lines]{java}{Tiger.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+ \end{minipage}
+\end{frame}
+
+\begin{frame}{Quiz: Antwort}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Tiger.java, frame=lines]{java}{Tiger.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
+ \begin{itemize}
+ \item null
+ \item Cat:null
+ \item Cat:null
+ \item null
+ \item null
+ \end{itemize}
+ \end{minipage}
+\end{frame}
+
+\begin{frame}{Erklärung}
+ \begin{itemize}
+ \item Zeile 2 und 3: \myCode{sound} im Konstruktor von \myCode{Cat} ist eine
+ lokale Variable, kein Attribut
+ \item In Java werden nur Methoden vererbt
+ \begin{itemize}
+ \item Klassen: Signatur und Implementierung
+ \item Interfaces: Nur Signatur
+ \end{itemize}
+ \end{itemize}
+
+ Mehr dazu später
+\end{frame}
+
+\section{JUnit}
+\subsection{Allgemeines}
+\begin{frame}{JUnit: Allgemeines}
+ JUnit \dots
+ \begin{itemize}[<+->]
+ \item ist ein Java-Paket
+ \item ist ein Framework zum Testen von Java-Programmen
+ \item ist SEHR verbreitet
+ \item dient der Erstellung von Unit-Tests
+ \item wurde von Erich Gamma und Kent Beck erstellt
+ \end{itemize}
+\end{frame}
+
+\subsection{Beispiel}
+\begin{frame}{JUnit: Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=LevenshteinCompilationTest.java, frame=lines]{java}{LevenshteinCompilationTest.java}
+\end{frame}
+
+\framedgraphic{Eclipse: JUnit}{Eclipse-JUnit-new-test.png}
+\framedgraphic{Eclipse: JUnit}{Eclipse-JUnit-project-explorer.png}
+\framedgraphic{Eclipse: JUnit}{Eclipse-JUnit-execution-button.png}
+\framedgraphic{Eclipse: JUnit}{Eclipse-JUnit-execution-result.png}
+\framedgraphic{Eclipse: JUnit}{Eclipse-JUnit-detailed-results.png}
+\framedgraphic{Eclipse: JUnit}{Eclipse-JUnit-new-filter-trace.png}
+
+\subsection{Fehler}
+\begin{frame}{JUnit: Fehler}
+ \begin{alertblock}{Fehler}
+ The import org.junit cannot be resolved
+ \end{alertblock}
+ \begin{block}{Lösung}
+ \begin{itemize}
+ \item \href{https://github.com/KentBeck/junit/downloads}{Hier} junit-4.11.jar mit Hamcrest herunterladen
+ \item \menu{Project > Properties > Java Build Path > Libraries > Add External JARs...}
+ \item \texttt{junit-4.11.jar} auswählen
+ \item Auf OK klicken
+ \end{itemize}
+ \end{block}
+\end{frame}
+
+\section{Vererbung}
+\subsection{Allgemeines}
+\begin{frame}{Allgemeines}
+ Vererbung \dots
+ \begin{itemize}[<+->]
+ \item ist ein Schlüsselelement der OOP
+ \item ist in Java eingeschränkt: Eine Klasse erbt in Java
+ von genau einer anderen Klasse
+ \begin{itemize}
+ \item alle Klassen erben von \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html}{Object}
+ \end{itemize}
+ \item dient der Spezialisierung
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Beispiel}
+ Wo kann Vererbung nützlich sein?
+ \begin{itemize}[<+->]
+ \item Oberklasse Liste, Unterklassen SinglyLinkedList und
+ DoubleLinkedList
+ \begin{itemize}
+ \item \myCode{contains()} ist gleich
+ \item \myCode{append()} ist unterschiedlich
+ \item \myCode{remove()} ist unterschiedlich
+ \end{itemize}
+ \item Oberklasse Animal, Unterklassen Säugetier, Tiger, Schlange, Bär, \dots
+ \item Brettspiele:
+ \begin{itemize}
+ \item Klasse Spielbrett; Unterklassen: Schachbrett, Dame-Brett, Mensch-ärgere-dich-nicht
+ \item Klasse Spielfigur; Unterklassen: Bauer, Dame, Springer, Turm
+ \item Klasse Spiellogik; Unterklassen: DameLogik, SchachLogik
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Beispiel}{Klassendiagramm.pdf}
+
+\begin{frame}{Vererbung: Beispiel in Java}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Tiger.java, frame=lines]{java}{Tiger.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
+ \end{minipage}
+\end{frame}
+
+\begin{frame}{Allgemeines}
+ \begin{block}{\href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html\#jls-8.4.8}{JLS 8.4.8}}
+ A class C inherits from its direct superclass and direct
+ superinterfaces all abstract and non-abstract methods of the
+ superclass and superinterfaces that are public, protected, or
+ declared with default access in the same package as C, and are
+ neither overridden (§8.4.8.1) nor hidden (§8.4.8.2) by a
+ declaration in the class.
+ \end{block}
+\end{frame}
+
+\section{toString()}
+\subsection{Allgemeines}
+\begin{frame}{toString()}
+ \begin{itemize}[<+->]
+ \item Jedes Objekt hat eine Methode \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#toString()}{toString()}
+ \item Diese wird von \myCode{Object} vererbt
+ \item und \st{kann} sollte überschrieben werden
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Information aus den Javadoc}
+ Wie sollte toString() aussehen?
+ \begin{itemize}
+ \item Eine kurze textuelle Repräsentation des Objekts
+ \item Soll von Menschen gelesen werden
+ \item Per Standard: \myCode{getClass().getName() + '@' + Integer.toHexString(hashCode())}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, label=Node.java, frame=lines]{java}{Node.java}
+\end{frame}
+
+\section{Interfaces}
+\subsection{Allgemeines}
+\begin{frame}{Interfaces: Allgemeines}
+ \begin{itemize}[<+->]
+ \item auf Deutsch: Schnittstelle
+ \item es werden nur Methodensignaturen vererbt
+ \item die Implementierung muss komplett selbst durchgeführt werden!
+ \item wird wie Klassen in einer eigenen "`MeinInterface.java"' Datei gespeichert
+ \end{itemize}
+ \pause[\thebeamerpauses]
+ \begin{block}{Namenskonvention}
+ Der Name einer Schnittstelle endet oft mit -able.
+ \end{block}
+\end{frame}
+
+\subsection{Beispiel}
+\begin{frame}{Interfaces: Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=Bicycle.java, frame=lines]{java}{Bicycle.java}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=ACMEBicycle.java, frame=lines]{java}{ACMEBicycle.java}
+ \small{Quelle: \href{http://docs.oracle.com/javase/tutorial/java/concepts/interface.html}{docs.oracle.com}: What Is an Interface?}\\
+ Weitere Informationen: \href{http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html}{docs.oracle.com}: Interfaces
+\end{frame}
+
+\subsection{Real World Examples}
+\begin{frame}{Real World Examples}
+ \begin{itemize}
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html}{Comperable}: Vergleichen mit \myCode{<}
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html}{List}: Viele Listenoperationen
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html}{Iterable}: foreach
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html}{Serializable}: Speichern / verschicken übers Netzwerk
+ \item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html}{Runnable}: Multithreading
+ \end{itemize}
+\end{frame}
+
+\subsection{Weitere Informationen}
+\begin{frame}{Interfaces: Weitere Informationen}
+ \begin{itemize}
+ \item \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html}{JLS 7}
+ \item \href{http://openbook.galileodesign.de/javainsel5/javainsel06_010.htm}{Galileo openbook}
+ \end{itemize}
+\end{frame}
+
+\section{Nachbesprechung ÜB 3}
+\subsection{Allgemeines}
+\begin{frame}{Allgemeines}
+ Lösungen sind \href{https://github.com/MartinThoma/prog-ws1213/tree/master/Blatt-03}{hier} zu finden.
+\end{frame}
+\begin{frame}{Allgemeines}
+ \begin{itemize}[<+->]
+ \item \myCode{\href{http://docs.oracle.com/javase/7/docs/api/java/lang/String.html\#charAt(int)}{char charAt(int index)}}:
+ Returns the char value at the specified index.
+ \item \myCode{\href{http://docs.oracle.com/javase/7/docs/api/java/lang/String.html\#matches(java.lang.String)}{public boolean matches(String regex)}}
+ Tells whether or not this string matches the given regular expression.
+ \item \myCode{\href{http://docs.oracle.com/javase/7/docs/api/java/lang/String.html\#substring(int, int)}{String substring(int beginIndex,
+ int endIndex)}} Returns a new string that is a substring of this string.
+ \end{itemize}
+ \pause[\thebeamerpauses]
+ \begin{block}{Eclipse-Tipp}
+ Wenn Eclipse euch im Projektordner einen Fehler anzeigt, aber
+ keine Datei fehlerhaft ist, solltet ihr mal einen
+ Blick in \menu{Window > Show View > Problem} werfen.
+ \end{block}
+\end{frame}
+
+\section{Abspann}
+\subsection{Kommende Tutorien}
+\begin{frame}{Kommende Tutorien}
+ \begin{itemize}
+ \item[5.] 17.12.2012: Generics?, Video "`Library"' zeigen
+ \item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
+ \item[-] 31.12.2012: Silvester - Kein Tutorium
+ \item[4.] 07.01.2013
+ \item[3.] 14.01.2013
+ \item[2.] 21.01.2013
+ \item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
+ \item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
+ \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Beware of physicist fathers}{../images/Beware-of-physicist-fathers.png}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Animal.java b/presentations/Programmieren-Tutorium/Tutorium-09/Animal.java
new file mode 100644
index 0000000..cb89f0b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Animal.java
@@ -0,0 +1,11 @@
+public class Animal {
+ private String sound;
+
+ public void setSound(String sound) {
+ this.sound = sound;
+ }
+
+ public String getSound() {
+ return this.sound;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Basket.java b/presentations/Programmieren-Tutorium/Tutorium-09/Basket.java
new file mode 100644
index 0000000..fb15976
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Basket.java
@@ -0,0 +1,11 @@
+public class Basket {
+ private E element;
+
+ public void setElement(E x) {
+ element = x;
+ }
+
+ public E getElement() {
+ return element;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Cat.java b/presentations/Programmieren-Tutorium/Tutorium-09/Cat.java
new file mode 100644
index 0000000..170e619
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Cat.java
@@ -0,0 +1,11 @@
+public class Cat extends Animal {
+ public String sound;
+
+ public Cat() {
+ sound = "Maunz";
+ }
+
+ public String getCatSound() {
+ return sound;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Fruit.java b/presentations/Programmieren-Tutorium/Tutorium-09/Fruit.java
new file mode 100644
index 0000000..c134499
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Fruit.java
@@ -0,0 +1,8 @@
+class Fruit {
+}
+
+class Apple extends Fruit {
+}
+
+class Orange extends Fruit {
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Generics-quiz-main.java b/presentations/Programmieren-Tutorium/Tutorium-09/Generics-quiz-main.java
new file mode 100644
index 0000000..1e49c35
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Generics-quiz-main.java
@@ -0,0 +1,3 @@
+Basket basket = new Basket();
+basket.setElement(new Apple());
+Apple apple = basket.getElement();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Generics-quiz-main2.java b/presentations/Programmieren-Tutorium/Tutorium-09/Generics-quiz-main2.java
new file mode 100644
index 0000000..eb5df27
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Generics-quiz-main2.java
@@ -0,0 +1,3 @@
+Basket basket = new Basket();
+basket.setElement(new Apple());
+Orange orange = (Orange) basket.getElement();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Generics-singleLines.java b/presentations/Programmieren-Tutorium/Tutorium-09/Generics-singleLines.java
new file mode 100644
index 0000000..40e2046
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Generics-singleLines.java
@@ -0,0 +1,9 @@
+public class SinglyLinkedList {
+ private Node head;
+
+ public void add(E object) {
+ Node newNode = new Node(object);
+ newNode.setNext(head);
+ head = newNode;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Jungle.java b/presentations/Programmieren-Tutorium/Tutorium-09/Jungle.java
new file mode 100644
index 0000000..86d3e4a
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Jungle.java
@@ -0,0 +1,7 @@
+public class Jungle {
+ public static void main(String[] args) {
+ Animal felix = new Cat();
+ System.out.println(felix.getCatSound());
+ System.out.println(felix.getSound());
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/LateBinding.java b/presentations/Programmieren-Tutorium/Tutorium-09/LateBinding.java
new file mode 100644
index 0000000..6d2dbe9
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/LateBinding.java
@@ -0,0 +1,8 @@
+import java.util.LinkedList;
+import java.util.List;
+
+public class Jungle {
+ public static void main(String[] args) {
+ List bikeStock = new LinkedList();
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Makefile b/presentations/Programmieren-Tutorium/Tutorium-09/Makefile
new file mode 100644
index 0000000..1ae41af
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-09
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Question04.java b/presentations/Programmieren-Tutorium/Tutorium-09/Question04.java
new file mode 100644
index 0000000..8d54f29
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Question04.java
@@ -0,0 +1,7 @@
+Basket b = new Basket();
+Basket b1 = new Basket();
+Basket b2 = new Basket();
+Basket b3 = new Basket();
+Basket b4 = new Basket();
+Basket> b5 = new Basket();
+Basket b6 = new Basket>();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/Question06.java b/presentations/Programmieren-Tutorium/Tutorium-09/Question06.java
new file mode 100644
index 0000000..6c8859f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/Question06.java
@@ -0,0 +1,5 @@
+Basket b = new Basket();
+Basket bA = b;
+Basket bO = b;
+bA.setElement(new Apple());
+Orange orange = bO.getElement();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SingleLines.java b/presentations/Programmieren-Tutorium/Tutorium-09/SingleLines.java
new file mode 100644
index 0000000..1ff1a01
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SingleLines.java
@@ -0,0 +1 @@
+List extends HasWord> wordList = toke.tokenize();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Result/Node.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Result/Node.java
new file mode 100644
index 0000000..55698dc
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Result/Node.java
@@ -0,0 +1,46 @@
+public class Node {
+ private final E element;
+ private Node next;
+
+ /**
+ * Constructor.
+ *
+ * @param element the element you want to add
+ */
+ public Node(E element) {
+ this.element = element;
+ }
+
+ /**
+ * Getter for the content of this node.
+ *
+ * @return the element
+ */
+ public E getElement() {
+ return element;
+ }
+
+ /**
+ * @return the next
+ */
+ public Node getNext() {
+ return next;
+ }
+
+ /**
+ * @param next the next to set
+ */
+ public void setNext(Node next) {
+ this.next = next;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "Node[element=" + element + "]";
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Result/SinglyLinkedList.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Result/SinglyLinkedList.java
new file mode 100644
index 0000000..90a8d90
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Result/SinglyLinkedList.java
@@ -0,0 +1,90 @@
+public class SinglyLinkedList {
+ private Node head;
+
+ /**
+ * Add an object to the list.
+ *
+ * @param object the element you want to add
+ */
+ public void add(E object) {
+ Node newNode = new Node(object);
+ newNode.setNext(head);
+ head = newNode;
+ }
+
+ /**
+ * Check if object is in is in the SinglyLinkedList
+ *
+ * @param object the object you want to search
+ * @return the bike, if you found it, otherwise {@code null}
+ */
+ public boolean contains(E object) {
+ Node currentNode = head;
+
+ while (currentNode != null && currentNode.getElement().equals(object)) {
+ currentNode = currentNode.getNext();
+ }
+
+ return currentNode != null;
+ }
+
+ /**
+ * Get a bike.
+ *
+ * @param bike the bike you want to get
+ * @return
+ */
+ public E get(E bike) {
+ if (contains(bike)) {
+ Node currentNode = head;
+ while (currentNode.getElement() != bike) {
+ currentNode = currentNode.getNext();
+ }
+ return bike;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Remove bike from the SinglyLinkedList, if it exists.
+ *
+ * @param bike the bike you want to search
+ * @return {@code bike} if it is in SinglyLinkedList, otherwise {@code null}
+ */
+ public E remove(E bike) {
+ if (!contains(bike)) {
+ return null;
+ } else if (head.getElement() == bike) {
+ head = head.getNext();
+ return bike;
+ } else {
+ // Knoten und Vorgängerknoten finden
+ Node previousNode = head;
+ Node currentNode = head;
+
+ while (currentNode.getElement() != bike) {
+ previousNode = currentNode;
+ currentNode = currentNode.getNext();
+ }
+
+ // Zeiger umbiegen
+ previousNode.setNext(currentNode.getNext());
+ return bike;
+ }
+ }
+
+ /**
+ * Print all bikes in SinglyLinkedList.
+ */
+ public void printBikes() {
+ Node currentNode = head;
+ System.out.print("start -> ");
+ while (currentNode != null) {
+ System.out.print(currentNode);
+ System.out.print(" -> ");
+ currentNode = currentNode.getNext();
+ }
+ System.out.println("null");
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Bike.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Bike.java
new file mode 100644
index 0000000..4b8db8b
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Bike.java
@@ -0,0 +1,98 @@
+/**
+ * A bike model in Java.
+ *
+ * @author Markus Iser, Martin Thoma
+ * @version 1.0
+ */
+
+public class Bike {
+ private final Gears gears;
+ private final Wheels wheels;
+
+ enum Material {
+ ALU, STEEL, TITAN
+ }
+
+ private final Material material;
+
+ private final String modelId;
+
+ private final boolean hasBell;
+ private final boolean hasLights;
+
+ /** Price of the bike in cents. */
+ private int price;
+
+ Bike(String modelId) {
+ this.gears = null;
+ this.wheels = null;
+ this.material = Material.ALU;
+ this.modelId = modelId;
+ this.hasBell = true;
+ this.hasLights = true;
+ }
+
+ Bike(Gears gears, Wheels wheels, Material material,
+ String modelId, boolean bell, boolean lights) {
+ this.gears = gears;
+ this.wheels = wheels;
+ this.material = material;
+ switch (material) {
+ case ALU:
+ price = 20000;
+ break;
+ case STEEL:
+ price = 30000;
+ break;
+ case TITAN:
+ price = 40000;
+ break;
+ }
+ this.modelId = modelId;
+ this.hasBell = bell;
+ this.hasLights = lights;
+ }
+
+ /**
+ * Check if the bike is legal for usage on streets.
+ *
+ * @return {@code true} if the bike has a bell and has lights
+ */
+ public boolean isStreetLegal() {
+ return hasBell && hasLights;
+ }
+
+ /**
+ * Get the price of the bike.
+ *
+ * @return the sum of the bike's base-price and the price of the wheels and
+ * gears
+ */
+ public int getPrice() {
+ return price + gears.getPrice() + wheels.getPrice();
+ }
+
+ /**
+ * @return the material of this bike
+ */
+ public Material getMaterial() {
+ return this.material;
+ }
+
+ /**
+ * @return the model id of this bike
+ */
+ public String getModelId() {
+ return this.modelId;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "Bike[" + modelId + "]";
+ }
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/BikeStorage.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/BikeStorage.java
new file mode 100644
index 0000000..da121b7
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/BikeStorage.java
@@ -0,0 +1,95 @@
+public class BikeStorage {
+ private Node head;
+
+ /**
+ * Add a bike to the BikeStorage.
+ *
+ * @param bike the bike you want to add
+ */
+ public void add(Bike bike) {
+ Node newNode = new Node(bike);
+ newNode.setNext(head);
+ head = newNode;
+ }
+
+ /**
+ * Check if bike is in the BikeStorage
+ *
+ * @param bike the bike you want to search
+ * @return the bike, if you found it, otherwise {@code null}
+ */
+ public boolean contains(Bike bike) {
+ // Normalerweise würde man hier nach einer Seriennummer
+ // oder ähnlichem - also "identifizierenden" Attributen
+ // von Bike - suchen und dann das gesamte Bike zurückgeben
+ Node currentNode = head;
+
+ // usually you you should implement .equals(),
+ // and not use != or == for objects
+ while (currentNode != null && currentNode.getElement() != bike) {
+ currentNode = currentNode.getNext();
+ }
+
+ return currentNode != null;
+ }
+
+ /**
+ * Get a bike.
+ *
+ * @param bike the bike you want to get
+ * @return
+ */
+ public Bike get(Bike bike) {
+ if (contains(bike)) {
+ Node currentNode = head;
+ while (currentNode.getElement() != bike) {
+ currentNode = currentNode.getNext();
+ }
+ return bike;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Remove bike from the BikeStorage, if it exists.
+ *
+ * @param bike the bike you want to search
+ * @return {@code bike} if it is in BikeStorage, otherwise {@code null}
+ */
+ public Bike remove(Bike bike) {
+ if (!contains(bike)) {
+ return null;
+ } else if (head.getElement() == bike) {
+ head = head.getNext();
+ return bike;
+ } else {
+ // Knoten und Vorgängerknoten finden
+ Node previousNode = head;
+ Node currentNode = head;
+
+ while (currentNode.getElement() != bike) {
+ previousNode = currentNode;
+ currentNode = currentNode.getNext();
+ }
+
+ // Zeiger umbiegen
+ previousNode.setNext(currentNode.getNext());
+ return bike;
+ }
+ }
+
+ /**
+ * Print all bikes in BikeStorage.
+ */
+ public void printBikes() {
+ Node currentNode = head;
+ System.out.print("start -> ");
+ while (currentNode != null) {
+ System.out.print(currentNode);
+ System.out.print(" -> ");
+ currentNode = currentNode.getNext();
+ }
+ System.out.println("null");
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Gears.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Gears.java
new file mode 100644
index 0000000..82a9fe7
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Gears.java
@@ -0,0 +1,69 @@
+/**
+ * This class models the gears. It is restricted to derailleur gears.
+ *
+ * @author Markus Iser, Martin Thoma
+ * @version 1.0
+ */
+
+public class Gears {
+ public static final int MIN_FRONT_SPROCKETS = 1;
+ public static final int MAX_FRONT_SPROCKETS = 3;
+ public static final int MIN_REAR_SPROCKETS = 1;
+ public static final int MAX_REAR_SPROCKETS = 10;
+
+ private int frontSprockets;
+ private int rearSprockets;
+
+ /** Price in cents. */
+ private final int price;
+
+ Gears(int frontSprockets, int rearSprockets, int price) {
+ setSprockets(frontSprockets, rearSprockets);
+ this.price = price;
+ }
+
+ /**
+ * Sets the sprocket numbers. Uses default-values if consisteny criteria are
+ * not met.
+ *
+ * @param sprockets
+ * @param rearSprockets
+ */
+ void setSprockets(int sprockets, int rearSprockets) {
+ this.frontSprockets = sprockets;
+ this.rearSprockets = rearSprockets;
+
+ if (!(this.frontSprockets >= 1)) { // A.1
+ this.frontSprockets = 1;
+ } else if (!(this.frontSprockets < 4)) { // A.2
+ this.frontSprockets = 3;
+ }
+
+ if (this.rearSprockets < 1) { // B.1
+ this.rearSprockets = this.frontSprockets;
+ }
+ if (this.rearSprockets > 9) { // B.2
+ this.rearSprockets = this.frontSprockets * 3;
+ }
+
+ if (this.rearSprockets < this.frontSprockets) { // C.1
+ this.rearSprockets = this.frontSprockets;
+ } else if (this.rearSprockets > 3 * this.frontSprockets) { // C.2
+ this.rearSprockets = 3 * this.frontSprockets;
+ }
+ }
+
+ /**
+ * @return the number of gears as the number of sprocket-combinations
+ */
+ int getNumberOfGears() {
+ return frontSprockets * rearSprockets;
+ }
+
+ /**
+ * @return the price of the gears
+ */
+ int getPrice() {
+ return price;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Node.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Node.java
new file mode 100644
index 0000000..42dbcfe
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Node.java
@@ -0,0 +1,48 @@
+public class Node {
+ // Usually you would use "Generics" at this point to be able
+ // to hold arbitrary Objects, not only Bikes.
+ private final Bike element;
+ private Node next;
+
+ /**
+ * Constructor.
+ *
+ * @param element the element you want to add
+ */
+ public Node(Bike element) {
+ this.element = element;
+ }
+
+ /**
+ * Getter for the content of this node.
+ *
+ * @return the element
+ */
+ public Bike getElement() {
+ return element;
+ }
+
+ /**
+ * @return the next
+ */
+ public Node getNext() {
+ return next;
+ }
+
+ /**
+ * @param next the next to set
+ */
+ public void setNext(Node next) {
+ this.next = next;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "Node[element=" + element + "]";
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Wheels.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Wheels.java
new file mode 100644
index 0000000..6a8c86d
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/Wheels.java
@@ -0,0 +1,49 @@
+/**
+ * A bike model in Java. This class models the wheels.
+ *
+ * @author Markus Iser, Martin Thoma
+ * @version 1.0
+ */
+
+class Wheels {
+ public static final int MIN_DIAMETER = 150;
+ public static final int MAX_DIAMETER = 700;
+ public static final int MIN_WHEEL_SIZE = 20;
+ public static final int MAX_WHEEL_SIZE = 50;
+
+ /** The diameter is in range MIN_DIAMETER to MAX_DIAMETER. */
+ private int diameter = 559;
+
+ /** The wheelsSize is in range MIN_WHEEL_SIZE to MAX_WHEEL_SIZE. */
+ private double wheelsSize = 50;
+
+ /** Price measured in Euro-cents. */
+ private final int price;
+
+ Wheels(int diameter, double wheelSize, int price) {
+ this.diameter = diameter;
+ this.wheelsSize = wheelSize;
+ this.price = price;
+ }
+
+ /**
+ * @return the price of the wheels in cent
+ */
+ int getPrice() {
+ return price;
+ }
+
+ /**
+ * @return the diameter in mm
+ */
+ public int getDiameter() {
+ return this.diameter;
+ }
+
+ /**
+ * @return the size of the wheel in mm
+ */
+ public double getWheelsSize() {
+ return this.wheelsSize;
+ }
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/World.java b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/World.java
new file mode 100644
index 0000000..e968e93
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SinglyLinkedList-Template/World.java
@@ -0,0 +1,28 @@
+public class World {
+ public static void main(String[] args) {
+ BikeStorage ladenLutz = new BikeStorage();
+
+ Bike a = new Bike("a");
+ Bike b = new Bike("b");
+ Bike c = new Bike("c");
+ Bike d = new Bike("d");
+
+ ladenLutz.printBikes();
+
+ ladenLutz.add(a);
+ ladenLutz.printBikes();
+ ladenLutz.add(b);
+ ladenLutz.printBikes();
+
+ ladenLutz.add(c);
+ System.out.println("c wurde hinzugefügt:");
+ ladenLutz.printBikes();
+ ladenLutz.remove(c);
+ System.out.println("c wurde entfernt:");
+ ladenLutz.printBikes();
+ ladenLutz.add(d);
+ ladenLutz.add(a);
+
+ ladenLutz.printBikes();
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SourceA.java b/presentations/Programmieren-Tutorium/Tutorium-09/SourceA.java
new file mode 100644
index 0000000..aee4d25
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SourceA.java
@@ -0,0 +1,3 @@
+Basket> b5 = new Basket();
+b5.setElement(new Apple());
+Apple apple = (Apple) b5.getElement();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SourceB.java b/presentations/Programmieren-Tutorium/Tutorium-09/SourceB.java
new file mode 100644
index 0000000..ee5395c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SourceB.java
@@ -0,0 +1,3 @@
+Basket b = new Basket();
+b.setElement(new Apple());
+Apple apple = (Apple) b.getElement();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/SourceC.java b/presentations/Programmieren-Tutorium/Tutorium-09/SourceC.java
new file mode 100644
index 0000000..7443d03
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/SourceC.java
@@ -0,0 +1,3 @@
+Basket b1 = new Basket();
+b1.setElement(new Apple());
+Apple apple = (Apple) b1.getElement();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-09/tutorium-09.tex b/presentations/Programmieren-Tutorium/Tutorium-09/tutorium-09.tex
new file mode 100644
index 0000000..d7f897c
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-09/tutorium-09.tex
@@ -0,0 +1,334 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+\usepackage{../templates/myStyle}
+
+\begin{document}
+\title{\titleText}
+\subtitle{Polymorphismus, Generics, Libraries}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+%\AtBeginSection[]{
+% \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection
+%}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz: Vererbung II}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
+ \vspace{1cm}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+ \end{minipage}
+\end{frame}
+
+\begin{frame}{Quiz: Antwort}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Animal.java, frame=lines]{java}{Animal.java}
+ \vspace{1cm}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Jungle.java, frame=lines]{java}{Jungle.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cat.java, frame=lines]{java}{Cat.java}
+ \begin{itemize}
+ \item Compiler-Fehler
+ \item The method getCatSound() is undefined for the type Animal
+ \item Thema: "`Polymorphismus"'
+ \end{itemize}
+ \end{minipage}
+\end{frame}
+
+\section{Polymorphismus}
+\subsection{Allgemeines}
+\begin{frame}{Allgemeines}
+ Motivation
+ \begin{itemize}
+ \item Eine Unterklasse kann alles, was die Oberklasse kann
+ \item[$\rightarrow$] sie hat die gleichen Methoden, wenn auch eventuell überschrieben
+ \item Eventuell ist uns die konkrete Klasse egal
+ \item oder wir benötigen einen Kontainter für viele verschiedene
+ Objekte mit einer gemeinsamen Oberklasse
+ \end{itemize}
+
+ Was ist "`Polymorphismus'"?
+ \begin{itemize}
+ \item \myCode{Animal felix = new Cat();}
+ \item \myCode{Animal[] zoo = new Animal[10];}\\
+ \myCode{zoo[0] = felix;}
+ \end{itemize}
+\end{frame}
+
+\subsection{Beispiel}
+\begin{frame}{Beispiel}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{LateBinding.java}
+\end{frame}
+
+\subsection{Wann wird Polymorphismus verwendet?}
+\begin{frame}{Wann wird Polymorphismus verwendet?}
+ \begin{itemize}[<+->]
+ \item Man Benötigt eigentlich nur bestimmte Methoden (ein Interface)
+ \begin{itemize}[<+->]
+ \item Wenn ihr später aus einer LinkedList eine ArrayList macht, müsst ihr nur eine Zeile ändern!
+ \item[$\Rightarrow$] \myCode{List myList = new LinkedList();} anstelle von \myCode{LinkedList myList = new LinkedList();} schreiben
+ \end{itemize}
+ \item Man weiß zur Compile-Zeit die exakten Klassen noch nicht
+ \item Bei den Abschlussaufgaben
+ \end{itemize}
+\end{frame}
+
+\section{Generics}
+\subsection{Allgemeines}
+\begin{frame}{Allgemeines}
+ \begin{itemize}
+ \item Problem: Man schreibt genau eine verkettete Listen-Klasse
+ für genau eine Klasse (z.B. "`Bike"'), obwohl
+ die Logik (hinzufügen, entfernen, suchen) von der
+ Klasse unabhängig ist
+ \item Lösung: Generics
+ \end{itemize}
+\end{frame}
+
+\subsection{Verwendung}
+\begin{frame}{Verwendung}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Generics-singleLines.java}
+ \begin{block}{Hinweis}
+ Ihr könnt den "`Generic-Parameter"' wie eine Variable für die
+ Bezeichnung einer Klasse verwenden.
+ \end{block}
+\end{frame}
+
+\subsection{Praxis}
+\begin{frame}{Praxis}
+ \begin{block}{Arbeitsauftrag}
+ Programmiert die Einfach-verkettete Liste um, sodass sie
+ nirgends mehr "`Bike"' sondern nur noch Generics verwendet.
+ \end{block}{Arbeitsauftrag}
+
+ \begin{exampleblock}{Hinweis}
+ \begin{itemize}
+ \item URL für die Bike-Version: \href{http://goo.gl/RoiBC}{http://goo.gl/RoiBC}
+ \item Wer nur Zettel und Papier hat, implementiert die "`Node.java"'
+ komplett neu und "`SinglyLinkedList.java"' mindestens mit "`add()"'
+ \end{itemize}
+ \end{exampleblock}
+\end{frame}
+
+\begin{frame}{Praxis: Node}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{SinglyLinkedList-Result/Node.java}
+\end{frame}
+
+\begin{frame}{Praxis: SinglyLinkedList}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=13]{java}{SinglyLinkedList-Result/SinglyLinkedList.java}
+\end{frame}
+
+\subsection{Blog-Artikel}
+\begin{frame}{Man kanns auch übertreiben}
+ Siehe Blog-Artikel "`\href{http://martin-thoma.com/java-generics/}{Java Generics}"'
+\end{frame}
+
+\subsection{Besonderheit}
+\begin{frame}{Besonderheit: ?}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstnumber=1, firstline=1, lastline=1]{java}{SingleLines.java}
+ Bedeutet:
+ \begin{itemize}[<+->]
+ \item Die Liste erwartet Objekte, deren Klasse \myCode{HasWord} erweitern
+ \item[$\rightarrow$] \myCode{HasWord} oder Kinder
+ \item \myCode{?} wird "`bounded wildcard"' genannt
+ \item \href{http://stackoverflow.com/a/3009779/562769}{SO 1} und \href{http://stackoverflow.com/a/1840022/562769}{SO 2}
+ \end{itemize}
+\end{frame}
+
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \begin{block}{Hinweis}
+ Das folgende Quiz stammt von \href{http://www.grayman.de/quiz/java-generics-en.quiz}{www.grayman.de}.
+ Danke für die Erlaubnis, es in meine Folien einbinden zu
+ dürfen!
+ \end{block}
+\end{frame}
+
+\begin{frame}{Quiz}
+ \begin{block}{Frage}
+ Mit Generics hat der Compiler mehr Typ-Informationen. Explizite
+ Casts müssen als nicht so of benutzt werden.
+
+ Welche Bedeutung für die Laufzeit haben Generics?
+ \end{block}
+
+ \begin{overprint}
+ \onslide<1>
+ \begin{itemize}
+ \item Der Compiler kann mit Generics den Code besser für
+ Typen optimieren. Das, und das Wegfallen der Casts sind
+ Gründe warum der kompilierte Code mit Generics
+ \textbf{schneller} läuft als ohne
+ \item Generics haben \textbf{keinen Einfluss} auf die Laufzeit
+ \item Die erhöhte Flexibilität und Typsicherheit bedeutet,
+ dass der Compiler für jeden konkreten Typen Code aus
+ dem generischen Code erstellen mus. Das bedeutet,
+ die Programme sind \textbf{etwas langsamer}
+ \end{itemize}
+ \onslide<2>
+ Die Java Virtual Machine und der kompilierte Byte-Code sind
+ unabhängig von Generics. Der kompilierte Byte-Code mit Generics
+ unterscheidet sich nicht von Byte-Code ohne Generics. Generics
+ haben also \textbf{keinen Einfluss} auf die Laufzeit von Java-Programmen.
+ \end{overprint}
+\end{frame}
+
+\begin{frame}{Quiz}
+ \begin{block}{Frage}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Basket.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny,]{java}{Fruit.java}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main.java}
+ \end{minipage}
+ \end{block}
+
+ \begin{overprint}
+ \onslide<1>
+ \begin{itemize}
+ \item Der source code ist OK. Es gibt weder Compiler-, noch Laufzeitfehler
+ \item Compiler-Fehler in Zeile 2
+ \item Compiler-Fehler in Zeile 3
+ \end{itemize}
+ \onslide<2>
+ \begin{itemize}
+ \item Zeile 2 ist ok
+ \item Zeile 3 verursacht einen Laufzeitfehler
+ \item Der Rückgabewert der Methode \myCode{getElement}
+ in \myCode{Basket} ist \myCode{Fruit}.
+ Man kann eine \myCode{Fruit}-Variable
+ keiner \myCode{Apple}-Variable ohne cast zuweisen.
+ \end{itemize}
+ \end{overprint}
+\end{frame}
+
+\begin{frame}{Quiz}
+ \begin{block}{Frage}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=In main, frame=lines]{java}{Generics-quiz-main2.java}
+ \end{block}
+
+ \begin{overprint}
+ \onslide<1>
+ \begin{itemize}
+ \item Es gibt weder Laufzeit-, noch Compiler-Fehler
+ \item Compiler-Fehler in Zeile 2
+ \item Compiler-Fehler in Zeile 3
+ \item Eine \myCode{ClassCastException} tritt in Zeile 3 auf
+ \end{itemize}
+ \onslide<2>
+ \begin{itemize}
+ \item Sowohl \myCode{Apple} als auch \myCode{Orange} sind
+ \myCode{Fruit} und können in \myCode{Basket}
+ landen
+ \item[$\rightarrow$] Der Cast in Zeile 3 ist nötig
+ \item Die JVN überprüft während der Laufzeit den Cast in Zeile 3
+ \item[$\rightarrow$] Ein \myCode{ClassCastException} wird geworfen, da \myCode{Apple} keine \myCode{Orange} ist
+ \end{itemize}
+ \end{overprint}
+\end{frame}
+
+\begin{frame}{Quiz}
+ \begin{block}{Frage}
+ Welche der folgenden Zeilen kann ohne Compiler-Fehler kompilieren?
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Question04.java}
+ \end{block}
+
+ \visible<2>{
+ \begin{itemize}
+ \item Generische Klassen können ohne spezifizierten Typ genutzt werden.
+ Allerdings sollte man das nicht machen und Eclipse warnt auch davor.
+ \item Korrekt sind: 1, 2, 3, 6
+ \item Grundsätzlich gilt: Rechts vom \myCode{=} darf man genauer sein als links
+ \end{itemize}
+ }
+\end{frame}
+
+\begin{frame}{Quiz}
+ \begin{block}{Frage}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceA.java, frame=lines]{java}{SourceA.java}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceB.java, frame=lines]{java}{SourceB.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=SourceC.java, frame=lines]{java}{SourceC.java}
+ Which of the following statements are true?
+ \end{minipage}
+ \end{block}
+
+ \begin{overprint}
+ \onslide<1>
+ \begin{enumerate}[(a)]
+ \item SourceA kompiliert nicht
+ \item SourceB kompiliert mit warning(s). Es gibt keine
+ Laufzeit-Fehler
+ \item SourceC kompiliert mit warning(s). Es gibt eine
+ \myCode{ClassCastException} zur Laufzeit
+ \end{enumerate}
+ \onslide<2>
+ \begin{itemize}
+ \item (a) und (b) sind richtig.
+ \item Der Compiler kennt nicht den Typ von Elementen in b5
+ \item[$\rightarrow$] Er kann nicht garantieren, dass ein
+ Apfel in b5 eingefügt werden kann
+ \item Da \myCode{b5.setElement(..)} nicht erlaubt ist, kompiliert es nicht
+ \item SourceB wird so behandelt, als ob es pre-Java 1.5 Code wäre
+ \end{itemize}
+ \end{overprint}
+\end{frame}
+
+\begin{frame}{Frage}
+ Sollen wir die restlichen 9 Fragen auf \href{http://www.grayman.de/quiz/java-generics-en.quiz}{grayman.de} machen?
+\end{frame}
+
+\section{Einschub: Libraries}
+\subsection{Warum heißen Bibliotheken so?}
+\begin{frame}{Einschub: Libaries}
+ Warum heißen Programmbibliotheken "`Bibliotheken"'?
+
+
+ $\rightarrow$ \href{http://www.rrze.uni-erlangen.de/wir-ueber-uns/publikationen/das-rrze-der-film.shtml}{Video `"RRZE1973-MPEG-1.mpg'" der Uni Erlangen}
+\end{frame}
+
+\section{Abspann}
+\subsection{Kommende Tutorien}
+\begin{frame}{Kommende Tutorien}
+ \begin{itemize}
+ \item[-] 24.12.2012: Heiligabend - \href{http://www.fmc.uni-karlsruhe.de/faq/wann-sind-die-weihnachtsferien}{Kein Tutorium}
+ \item[-] 31.12.2012: Silvester - Kein Tutorium
+ \item[4.] 07.01.2013
+ \item[3.] 14.01.2013
+ \item[2.] 21.01.2013
+ \item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
+ \item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
+ \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
+ \end{itemize}
+\end{frame}
+
+\framedgraphic{Frohe Weihnachten!}{../images/xkcd-incident.png}
+
+\end{document}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Animal.java b/presentations/Programmieren-Tutorium/Tutorium-10/Animal.java
new file mode 100644
index 0000000..3f83666
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Animal.java
@@ -0,0 +1,24 @@
+public static class Animal {
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+}
+public static class Rat extends Animal {}
+public static class Lion extends Animal {}
+public static class Cage {
+ /* above */
+}
+
+public static void main(String[] args) {
+ Cage animals = new Cage();
+ Cage lions = new Cage();
+
+ // OK to put a Rat into a Cage
+ animals.add(new Rat());
+
+ lions.add(new Lion());
+
+ // invoke the super generic method
+ lions.transferTo(animals);
+ animals.showAnimals();
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Apple.java b/presentations/Programmieren-Tutorium/Tutorium-10/Apple.java
new file mode 100644
index 0000000..8a833ec
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Apple.java
@@ -0,0 +1 @@
+public class Apple extends Fruit { }
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Cage.java b/presentations/Programmieren-Tutorium/Tutorium-10/Cage.java
new file mode 100644
index 0000000..556295a
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Cage.java
@@ -0,0 +1,18 @@
+public static class Cage {
+ private Set pen = new HashSet();
+
+ public void add(T animal) {
+ pen.add(animal);
+ }
+
+ /* It's OK to put subclasses into a cage of
+ super class
+ */
+ public void transferTo(Cage super T> cage) {
+ cage.pen.addAll(this.pen);
+ }
+
+ public void showAnimals() {
+ System.out.println(pen);
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Fibonacci.java b/presentations/Programmieren-Tutorium/Tutorium-10/Fibonacci.java
new file mode 100644
index 0000000..cd1d6cb
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Fibonacci.java
@@ -0,0 +1,32 @@
+import java.util.HashMap;
+import java.util.Map;
+
+public class Fibonacci {
+ private final Map functionValues;
+
+ public Fibonacci() {
+ functionValues = new HashMap();
+ functionValues.put(0, 0);
+ functionValues.put(1, 1);
+ }
+
+ private int calculate(int x) {
+ return getFunctionValue(x - 1) + getFunctionValue(x - 2);
+ }
+
+ public int getFunctionValue(int x) {
+ if (x < 0) {
+ /* Exception werfen */
+ throw new IllegalArgumentException(
+ "Fibonacci is not defined for negative values");
+ }
+
+ if (functionValues.containsKey(x)) {
+ return functionValues.get(x);
+ } else {
+ int functionValue = calculate(x);
+ functionValues.put(x, functionValue);
+ return functionValue;
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Fruit-Example-Problem.java b/presentations/Programmieren-Tutorium/Tutorium-10/Fruit-Example-Problem.java
new file mode 100644
index 0000000..9305961
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Fruit-Example-Problem.java
@@ -0,0 +1,6 @@
+LinkedList apples = new LinkedList();
+LinkedList fruits = apples;
+fruits.add(new Banana());
+
+// Safe at compile time, but it's a Banana!
+Apple apple = apples.getFirst();
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Fruit.java b/presentations/Programmieren-Tutorium/Tutorium-10/Fruit.java
new file mode 100644
index 0000000..4570fd3
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Fruit.java
@@ -0,0 +1 @@
+public class Fruit { }
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Disc.java b/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Disc.java
new file mode 100644
index 0000000..83febec
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Disc.java
@@ -0,0 +1,28 @@
+/**
+ Represents a Disc with a certain size.
+
+ @author Tobi
+*/
+public class Disc {
+ private int size;
+
+ /**
+ Creates a {@code Disc} with a given size.
+
+ Size has to be a positive number, greater 0.
+ @param size the size of the disc.
+ */
+ public Disc(int size) {
+ if (size <= 0) {
+ throw new IllegalArgumentException("Invalid Disc-Size!");
+ }
+ this.size = size;
+ }
+
+ /**
+ Returns the size of the Disc.
+ */
+ public int getSize() {
+ return size;
+ }
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Hanoi.java b/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Hanoi.java
new file mode 100644
index 0000000..d3f23a9
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Hanoi.java
@@ -0,0 +1,42 @@
+/**
+ This is an aotomatic Hanoi algorithm. It solves a given game.
+*/
+public class Hanoi {
+
+ public static void main (String[] args) {
+ Pole a = new Pole(3);
+ Pole b = new Pole(3);
+ Pole c = new Pole(3);
+ Disc d1 = new Disc(1);
+ Disc d2 = new Disc(2);
+ Disc d3 = new Disc(3);
+
+ a.push(d3);
+ a.push(d2);
+ a.push(d1);
+
+ System.out.println("from: \n" + a);
+ System.out.println("help: \n" + b);
+ System.out.println("to: \n" + c);
+ move(a, b, c);
+ System.out.println("from: \n" + a);
+ System.out.println("help: \n" + b);
+ System.out.println("to: \n" + c);
+ }
+
+ public static void move(Pole from, Pole help, Pole to) {
+ if(from == null | to == null || help == null) {
+ throw new IllegalArgumentException("Pole is null");
+ }
+
+ move(from.getSize(), from, help, to);
+ }
+
+ private static void move(int n, Pole from, Pole help, Pole to) {
+ if(n > 0) {
+ move(n - 1, from, to, help);
+ to.push(from.pop());
+ move(n - 1, help, from, to);
+ }
+ }
+}
\ No newline at end of file
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Pole.java b/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Pole.java
new file mode 100644
index 0000000..ad6df02
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Hanoi/Pole.java
@@ -0,0 +1,101 @@
+/**
+ A Pole is a stick with Discs on it. The Discs have to be sorted ascending by their size, at all time.
+ Discs can be moved from one pole to another. Only the Disc on top of a pole can be accessed.
+*/
+public class Pole {
+ private Disc[] discs;
+ int currPop; //the index of the element, which has to be popped next.
+
+ /**
+ Creates a {@code Pole} with a given capacity.
+
+ The capacity is a positive number. It indicates, how many Discs can be handeld by the Pole-Instance.
+ @param capacity the capacity of the new pole
+ */
+ public Pole(int capacity) {
+ if (capacity < 0) {
+ throw new IllegalArgumentException("Invalid capacity. Has to be >= 0!");
+ }
+ discs = new Disc[capacity];
+ currPop = -1;
+ }
+
+ /**
+ Pushes a given disc to the top of this pole.
+
+ The result will be false, if the pole is full or the size of the given disc does not fit.
+ @param d the disc to push onto this pole
+ @param true of the operation has succeeded
+ @return true iff operation was successfull, otherwise false
+ */
+ public boolean push(Disc d) {
+ if (d == null) {
+ throw new IllegalArgumentException("parameter was null");
+ } else if (getTopDisc() != null && getTopDisc().getSize() <= d.getSize()) {
+ return false; //size of d is too big.
+ } else if (currPop >= discs.length - 1) {
+ return false; //full
+ }
+
+ currPop++;
+ discs[currPop] = d;
+ return true;
+ }
+
+ /**
+ Fetches the Disc of the top of the Pole, removes it from the pole and returns the disc.
+ @return the top disc of the pole or null, if the pole is empty.
+ */
+ public Disc pop() {
+ Disc result = getTopDisc();
+ if(result != null) { //if there is no top disc, there is no need of change of currPop.
+ discs[currPop] = null;
+ currPop--;
+ }
+ return result;
+ }
+
+ public String toString() {
+ String result = "";
+ for(int i = discs.length - 1; i >= 0; i--) {
+ result += discToString(discs[i], discs.length) + "\n";
+ }
+ return result;
+ }
+
+ private String discToString(Disc d, int width) {
+ String result = "";
+ int padWhitespace = width;
+ if(d == null) {
+ result = "|";
+ } else {
+ padWhitespace = (width - d.getSize());
+ for (int i = 0; i < d.getSize(); i++){
+ result += "+++";
+ }
+ }
+ //pad left/right
+ for(int i = 0; i < padWhitespace; i++) {
+ result = " " + result + " ";
+ }
+
+ return result;
+ }
+
+ /**
+ Returns the number of discs on this pole.
+ @return the number of discs
+ */
+ public int getSize() {
+ return currPop + 1;
+ }
+
+ /* Returns the disc on top (or null if empty), but doesn't pop it.*/
+ private Disc getTopDisc() {
+ if (currPop >= 0) {
+ return discs[currPop];
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Main-Fibonacci.java b/presentations/Programmieren-Tutorium/Tutorium-10/Main-Fibonacci.java
new file mode 100644
index 0000000..28d6923
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Main-Fibonacci.java
@@ -0,0 +1,22 @@
+public class Main {
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ Fibonacci f = new Fibonacci();
+ for (int i = 0; i < 10; i++) {
+ System.out.println(f.getFunctionValue(i));
+ }
+
+ /* Fehlerbehandlung */
+ try {
+ f.getFunctionValue(-2);
+ } catch (IllegalArgumentException e) {
+ System.out.println("Your Error: ");
+ System.out.println(e);
+ }
+ }
+
+}
+
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Main-Quiz-solution.java b/presentations/Programmieren-Tutorium/Tutorium-10/Main-Quiz-solution.java
new file mode 100644
index 0000000..8347717
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Main-Quiz-solution.java
@@ -0,0 +1,14 @@
+import java.util.LinkedList;
+
+public class Main {
+ public static void main(String[] args) {
+ LinkedList super Apple> apples = new LinkedList();
+ apples.add(new Apple());
+
+ // I can't get apples out
+ for (Object o : apples) {
+ Apple a = (Apple) o;
+ System.out.println(a);
+ }
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Main-Quiz-solution2.java b/presentations/Programmieren-Tutorium/Tutorium-10/Main-Quiz-solution2.java
new file mode 100644
index 0000000..20f5725
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Main-Quiz-solution2.java
@@ -0,0 +1,12 @@
+import java.util.LinkedList;
+
+public class Main {
+ public static void main(String[] args) {
+ LinkedList extends Fruit> apples = new LinkedList();
+
+ // I can't get apples in
+ // this gives an error
+ apples.add(new Apple());
+ // In fact, you can only add null!
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Main.java b/presentations/Programmieren-Tutorium/Tutorium-10/Main.java
new file mode 100644
index 0000000..6ae1022
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Main.java
@@ -0,0 +1,18 @@
+import java.util.LinkedList;
+import java.util.List;
+
+public class Main {
+ public static void main(String[] args) {
+ List myFruits = new LinkedList();
+ List myApples = new LinkedList();
+
+ myFruits.add(new Fruit());
+ myFruits.add(new Apple());
+
+ myApples.add(new Apple());
+
+ System.out.println(myFruits.getClass());
+ System.out.println(myApples.getClass());
+ myFruits = myApples;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/Makefile b/presentations/Programmieren-Tutorium/Tutorium-10/Makefile
new file mode 100644
index 0000000..0f32993
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/Makefile
@@ -0,0 +1,10 @@
+SOURCE = tutorium-10
+
+make:
+ #latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $(SOURCE).tex
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf #shellescape wird fürs logo benötigt
+ pdflatex -shell-escape $(SOURCE).tex -output-format=pdf # nochmaliges ausführen wegen Inhaltsverzeichnissen
+ make clean
+
+clean:
+ rm -rf $(TARGET) *.class *.html *.log *.aux *.out *.glo *.glg *.gls *.ist *.xdy *.1 *.toc *.snm *.nav *.vrb *.fls *.fdb_latexmk *.pyg
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/UniverseExplodeException.java b/presentations/Programmieren-Tutorium/Tutorium-10/UniverseExplodeException.java
new file mode 100644
index 0000000..dcac5b1
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/UniverseExplodeException.java
@@ -0,0 +1,5 @@
+public class UniverseExplodeException extends RuntimeException {
+ public UniverseExplodeException() {
+ super("The universe will explode!");
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/pokemon.jpg b/presentations/Programmieren-Tutorium/Tutorium-10/pokemon.jpg
new file mode 100644
index 0000000..349cbb6
Binary files /dev/null and b/presentations/Programmieren-Tutorium/Tutorium-10/pokemon.jpg differ
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/singleLines.java b/presentations/Programmieren-Tutorium/Tutorium-10/singleLines.java
new file mode 100644
index 0000000..1d1efdb
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/singleLines.java
@@ -0,0 +1,39 @@
+List> myList = new LinkedList();
+myList.add(null); // ok
+myList.add(new Fruit()); // Compiler error
+
+try {
+ // your code
+} catch (Exception ex) {
+ // Gotcha!
+}
+
+/* *
+ * The foo method.
+ *
+ * @throws UniverseExplodeException when the universe
+ * is going to explode
+ */
+public void foo() throws UniverseExplodeException {
+ if (true) {
+ throw new UniverseExplodeException();
+ }
+}
+
+/**
+ * Generic version of the Box class.
+ *
+ * @param the type of the value being boxed
+ */
+public class Box {
+ // T stands for "Type"
+ private T t;
+
+ public void set(T t) {
+ this.t = t;
+ }
+
+ public T get() {
+ return t;
+ }
+}
diff --git a/presentations/Programmieren-Tutorium/Tutorium-10/tutorium-10.tex b/presentations/Programmieren-Tutorium/Tutorium-10/tutorium-10.tex
new file mode 100644
index 0000000..1a3355f
--- /dev/null
+++ b/presentations/Programmieren-Tutorium/Tutorium-10/tutorium-10.tex
@@ -0,0 +1,365 @@
+\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
+\usepackage{../templates/myStyle}
+
+\begin{document}
+\title{\titleText}
+\subtitle{Wildcards, equals(), Exceptions}
+\author{\tutor}
+\date{\today}
+\subject{Programmieren}
+
+\frame{\titlepage}
+
+\frame{
+ \frametitle{Inhaltsverzeichnis}
+ \setcounter{tocdepth}{1}
+ \tableofcontents
+ \setcounter{tocdepth}{2}
+}
+
+\section{Einleitung}
+\subsection{Quiz}
+\begin{frame}{Quiz}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Fruit.java, frame=lines, firstline=1, lastline=1]{java}{Fruit.java}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Apple.java, frame=lines, firstline=1, lastline=1]{java}{Apple.java}
+ \begin{itemize}
+ \item Gibt es einen Compiler-Fehler?
+ \item Gibt es einen Laufzeit-Fehler?
+ \item Gibt es eine Ausgabe? Welche?
+ \end{itemize}
+ \end{minipage}
+\end{frame}
+
+\begin{frame}{Quiz: Antwort}
+ \begin{block}{Compiler-Fehler}
+ Type mismatch: cannot convert from List to List
+ \end{block}
+
+ \begin{itemize}[<+->]
+ \item Ohne Zeile 16 gibt es folgende Ausgabe:\\
+ \myCode{class java.util.LinkedList}\\
+ \myCode{class java.util.LinkedList}
+ \item Sowohl \myCode{myFruits = myApples;} als auch \myCode{myApples = myFruits;}
+ geben einen Compiler-Fehler
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Quiz: Problem}
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Fruit-Example-Problem.java}
+\end{frame}
+
+\begin{frame}{Quiz: Lösung \#1}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution.java}
+\end{frame}
+
+\begin{frame}{Quiz: Lösung \#2}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution2.java}
+\end{frame}
+
+\begin{frame}{Beispiel}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cage.java, frame=lines]{java}{Cage.java}
+ \end{minipage}
+ \hspace{0.5cm}
+ \begin{minipage}[b]{0.45\linewidth}
+ \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Animal.java}
+ \end{minipage}
+
+ {\tiny Source: \href{http://stackoverflow.com/a/6828257/562769}{StackOverflow}}
+\end{frame}
+
+\section{Generics}
+\subsection{Wildcards}
+\begin{frame}{Wildcards}
+ \begin{itemize}[<+->]
+ \item Das \myCode{?} in \myCode{List> myList} wird Wildcard
+ genannt
+ \item \myCode{?} steht immer nur in der Deklaration, nie in der Initialisierung
+ \item[$\Rightarrow$] \myCode{?} nur links vom \myCode{=}
+ \item \myCode{List> myList} ist eine "`unbounded Wildcard"'
+ \begin{itemize}
+ \item \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=1, lastline=3]{java}{singleLines.java}
+ \item \myCode{?} ein bestimmter, aber nicht angegebener Parameter\\
+ \item[$\Rightarrow$] kann zur Compile-Zeit nicht überprüft werden\\
+ \item[$\Rightarrow$] Liste darf nicht modifiziert werden
+ \end{itemize}
+ \item \myCode{List extends Fruit> myList} und \myCode{List super Fruit> myList} sind "`bounded Wildcards"'
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Bounded Wildcards: extends}
+ \begin{itemize}[<+->]
+ \item \myCode{List extends Fruit> myList} kann als Elemente
+ \myCode{Fruit} und \myCode{Apple} haben, nicht jedoch
+ \myCode{Object}
+ \item Hinweis: "`extends"' ist hier nicht exakt das gleiche
+ wie bei der Vererbung. Es kann entweder wirklich "`extends"'
+ oder "`implements"' bedeuten
+ \item Sowohl in \myCode{List} als auch in
+ \myCode{List extends Fruit>} können
+ \myCode{Fruit} und \myCode{Apple} beinhalten
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Bounded Wildcards: super}
+ \begin{itemize}[<+->]
+ \item \myCode{List super Fruit> myList} kann als Elemente
+ \myCode{Fruit} und \myCode{Object} haben, nicht jedoch
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Namenskonvetionen}
+ Für die Parameter sind folgende Bezeichnungen üblich:
+ \begin{itemize}
+ \item E - Element (used extensively by the Java Collections Framework)
+ \item K - Key
+ \item N - Number
+ \item T - Type
+ \item V - Value
+ \item S, U, V etc. - 2nd, 3rd, 4th types
+ \end{itemize}
+
+ z.B.
+ \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=23, lastline=39]{java}{singleLines.java}
+\end{frame}
+
+\subsection{Generics und Polymorphismus}
+\begin{frame}{Generics und Polymorphismus}
+ \begin{itemize}
+ \item Polymorphismus: \myCode{Fruit myVariable = new Apple();}\\
+ {\tiny links allgemeiner als rechts}
+ \item Generics: \myCode{LinkedList myList = new LinkedList();}\\
+ {\tiny Compiler-Fehler: Type mismatch: cannot convert from LinkedList to LinkedList}
+ \end{itemize}
+\end{frame}
+
+\subsection{Fazit}
+\begin{frame}{Fazit}
+ \begin{itemize}
+ \item Wildcards sind schwer
+ \item Wildcards werdet ihr vermutlich bei den Abschlussaufgaben
+ nicht benötigen
+ \end{itemize}
+\end{frame}
+
+\subsection{Quellen und Ressourcen}
+\begin{frame}{Quellen und Ressourcen}
+ \begin{itemize}
+ \item \href{http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html}{JavaDoc Tutorial - Wildcards}
+ \item \href{http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html}{JavaDoc Tutorial - Wildcards} (extra)
+ \item \href{http://stackoverflow.com/q/3009745/562769}{What does the question mark in Java generics' type parameter mean?}
+ \item \href{http://stackoverflow.com/q/12340808/562769}{What's the difference between List