\documentclass[a4paper,twoside,12pt]{article}
%\usepackage [reqno] {amsmath}
\usepackage{amsfonts,amstext}
\usepackage{amsmath}
\usepackage{german}
\usepackage{graphicx}
\usepackage{fullpage}
\usepackage{verbatim}

\newcommand{\ZETTELNUMMER}{8}
\newcommand{\ABGABEDATUM}{am 21. Juni 2016 bis 12 Uhr in die
Tutorenf\"acher}

\newcounter{AUFGNR}
\setcounter{AUFGNR}{1}
\newcommand{\AUFGABE}[2]{\vspace{0.3cm}\item[Aufgabe~\arabic{AUFGNR}]\stepcounter{AUFGNR} #1\hfill\emph{#2}}


\newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor}
\newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil}
\newcommand{\half}[1]{\frac{#1}{2}}



\renewcommand{\labelenumi}{(\alph{enumi})}
\renewcommand{\labelenumii}{(\roman{enumii})}


\begin{document}
\pagestyle{empty}
\hrule\medskip
\rule{0ex}{0ex}\\[-1ex]
\ZETTELNUMMER. Aufgabenblatt zur Vorlesung

\smallskip
\noindent
\large
\textbf{Informatik B}\hfill SoSe 2016 \\[0.5ex]
\normalsize
Wolfgang Mulzer

\medskip\hrule

\smallskip
\noindent
\textbf{Abgabe} \ABGABEDATUM

\vskip 0.5cm


\begin{description}

\AUFGABE{Java-Stringklassen}{10 Punkte}

In dieser Aufgabe untersuchen wir die Klassen
\texttt{String} und \texttt{StringBuffer} bez\"uglich ihrer
F\"ahigkeiten, einen 
langen String effizient zu invertieren. Das soll
mittels der Methode \texttt{System.nanoTime()} dokumentiert werden. 
Bezeichner werden im
Tutorium verabredet.

\begin{enumerate}
\item Erzeugen Sie zun\"achst in der Klasse \texttt{String}
einen langen String \texttt{str} der L\"ange \texttt{size} (\texttt{size}
ist vom Typ \texttt{int}). Sie k\"onnen zum Beispiel immer wieder zyklisch
durch das Alphabet gehen und die Buchstaben mittels \texttt{+=}
an einen anfangs leeren String anh\"angen, bis dieser die 
gew\"unschte L\"ange hat. Protokollieren Sie mit einer Bildschirmausgabe 
die verstrichene Zeit, etwa mittels
\texttt{elapsedTime = System.nanoTime() - startTime}. 
Bevor Sie anfangen, sollten Sie sich mittels
\texttt{startTime = System.nanoTime()} die Startzeit merken. 
Dabei handelt es sich um ganze Zahlen vom Typ \texttt{long}.
\item Invertieren Sie nun den String \texttt{str} in der Klasse 
\texttt{String}, indem Sie von hinten nach vorne mit einer Schleife 
die Zeichen sukzessive an einen anfangs leeren String
anh\"angen. Protokollieren Sie die Zeitdauer mit einer Bildschirmausgabe.
\item Invertieren Sie jetzt den String in der Klasse 
  \texttt{StringBuffer}, indem Sie wieder von hinten nach vorne die 
  Zeichen an einen anfangs leeren \texttt{StringBuffer} anh\"angen.
Protokollieren Sie wieder die Zeitdauer.
\item
Testen Sie zum Schluss die vordefinierte Methode \texttt{reverse} in 
\texttt{StringBuffer}. Erzeugen Sie dazu mit 
\texttt{new StringBuffer(str)} ein neues Objekt und
rufen Sie darauf \texttt{reverse()} auf. Protokollieren Sie die Zeit.
\end{enumerate}

\emph{Hinweise}: Testen Sie verschiedene 
Eingabegr\"o\ss{}en. Die Zeitdauer gibt man besser in
Mikrosekunden an (\texttt{elapsedTime / 1000}).


\AUFGABE{$\pi$ approximieren}{10 Punkte}

Schreiben Sie ein Java-Programm zur Approximation des Wertes 
von $\pi$ mittels eines so genannten 
\emph{Monte-Carlo-Verfahrens}. Erzeugen Sie dazu Paare von 
Zufallszahlen $(x, y) \in \{0, \dots, 1000\}^2$ 
und interpretieren Sie diese als Festkommazahlen mit
drei Nachkommastellen. Testen Sie dann, ob 
$x^2+y^2 \leq 1$ ist. Wenn ja, so liegt der Punkt
in dem  Viertelkreis mit Fl\"ache $\pi/4$. Sie sollten 
also $\pi/4$ ann\"ahern k\"onnen durch das Verh\"altnis
der Anzahl der erfolgreichen Versuch zur Gesamtzahl der Versuche.
Experimentieren Sie sowohl mit der Anzahl der Versuche wie auch mit 
der Genauigkeit
der Zahlen. Dokumentieren Sie dies.

\AUFGABE{Vererbung}{10 Punkte}

\begin{enumerate}
\item
Definieren Sie eine Klasse \texttt{Geom3D} und eine Hierarchie, 
in der als Unterklassen von \texttt{Geom3D} geeignete 
Klassen \texttt{Wuerfel}, \texttt{Quader}, \texttt{Kugel} und 
\texttt{Tetraeder} vorkommen.
Definieren Sie f\"ur die einzelnen Klassen sinnvolle Attribute, 
Konstruktoren sowie Methoden \texttt{volume()} und 
\texttt{surfaceArea()}, die das Volumen bzw. die Oberfl\"ache bestimmen.
Schreiben Sie dann ein Programm, das f\"ur ein Array von 
verschiedenen solchen geometrischen K\"orpern das 
Gesamtvolumen bzw. die Gesamtoberfl\"ache berechnet.
Mit einer Klasse \texttt{Geom3Demo} soll das Ganze dann getestet werden.

\emph{Hinweis}: Warum ist es keine gute Idee, 
\texttt{Wuerfel} zu einer Unterklasse von \texttt{Quader} zu machen?
\item
Betrachten Sie die folgenden Java-Klassen und zeichnen Sie das 
Vererbungsdiagramm. Was ist die Ausgabe eines Aufrufes der 
\texttt{main}-Methode in der Klasse \texttt{Maryland}. Begr\"unden
Sie Ihre Antwort!

\begin{verbatim}
public class Place extends Object {
    public void printMe() { System.out.println("Buy it."); }
}
public class Region extends Place {
    @Override
    public void printMe() { System.out.println("Box it."); }
}
public class State extends Region {
    @Override
    public void printMe() { System.out.println("Ship it."); }
}
public class Maryland extends State {
    @Override
    public void printMe() { System.out.println("Read it."); }

    public static void main(String[] args) {
        Region mid = new State();
        State md = new Maryland();
        Object obj = new Place();
        Place usa = new Region();
        md.printMe();
        mid.printMe();
        ((Place) obj).printMe();
        obj = md;
        ((Maryland) obj).printMe();
        obj = usa;
        ((Place) obj).printMe();
    }
}
\end{verbatim}
\end{enumerate}
\end{description}
\end{document}
