\documentstyle[11pt,german,epsfig,uebung]{article}
\begin{document}
\briefkopf
\LARGE
\centerline{6. "Ubung}
\large
\centerline{Bearbeitung vom 29.11.06 - 4.12.06}
\vskip 0.1cm
\normalsize
{\bf Aufgabe 1: Zeiger auf Funktionen}\newline
Auch Funktionen k"onnen "uber Zeiger angesprochen werden. Der Zeiger einer Funktion \tt <type> f(<type>) \rm
ist \tt <type> (*f)(<type>). \rm Die Klammerung ist hier wichtig, da die Argumentklammer eine h"ohere
Priorit"at als der Dereferenzierungsoperator hat. 
Der Aufruf der Funktion \tt sin(x) \rm aus der \tt math.h \rm Bibliothek kann also z.B auch erfolgen durch 
\begin{verbatim}
double (*pf)(double);       // Zeigerdeklaration
pf = &sin;                  // Zeiger auf die Funktion
double y = (*pf)(x);        // Aufruf ueber Zeiger
\end{verbatim}
Im Programm \tt integral.cc \rm hat ein schlechter Programmierer versucht, eine allgemeine Intregrationsroutine
zu schreiben, wobei die Funktion $f(x)$ als Argument der Integrationsroutine "ubergeben werden sollte.
Korrigieren Sie die Fehler und verifizieren Sie die Ergebnisse der Integrationen.
\newline \vskip 0.1cm
{\bf Aufgabe 2: Klasse der komplexen Zahlen} \newline
Entwickeln Sie eine eigene Klasse \tt Complex \rm der komplexen Zahlen, mit einem Konstruktor und Destruktor, sowie Methoden
f"ur die 4 Grundrechenaufgaben (Die Division darf bei Zeitmangel weggelassen werden). In der Darstellung $z = x + iy$ ist
\begin{eqnarray}
z &=& z_{1} \pm z_{2} = (x_{1} \pm x_{2}) + i ( y_{1} \pm y_{2}) \nonumber \\
z &=& z_{1} \cdot z_{2} = (x_{1}x_{2} - y_{1}y_{2}) + i (x_{1} y_{2} + y_{1} x_{2}) \nonumber \\
z &=& z_{1} / z_{2} = \frac{x_{1} x_{2} + y_{1} y_{2}}{x_{2}^{2} + y_{2}^{2}} + i \frac{x_{2} y_{1} - x_{1} y_{2}}{x_{2}^{2} + y_{2}^{2}}
\nonumber 
\end{eqnarray}
Die Klassendeklaration k"onnte z.B. folgendes Aussehen haben:
\begin{verbatim}
class Complex {
  private:
    double _x; double _y;                     // Realteil; Imaginaerteil
  public:
    Complex(double x, double y);              // Konstruktor  
    ~Complex();                               // Destruktor
    void add(Complex z1, Complex z2);         // Addition
    void sub(Complex z1, Complex z2);         // Subtraktion
    void mult(Complex z1, Complex z2);        // Multiplikation
    void divide(Complex z1, Complex z2);      // Division
    double getReal();                         // get Realteil
    double getImag();                         // get Imaginaerteil
    void print();                             // 
};
\end{verbatim}
Da Realteil \tt $\_$x \rm und Imagin"arteil \tt $\_$y \rm als \tt private \rm deklariert sind, brauchen wir noch die beiden
Methoden \tt getReal() \rm und \tt getImag() \rm.  
F"uhren Sie jeweils eine Addition, Subtraktion und Multiplikation im Hauptprogramm aus, 
z.B. mit \tt z.add(z1,z2) \rm oder \tt z->add(*z1,*z2), \rm und drucken Sie
die Ergebnisse mit \tt z.print() \rm b.z.w. \tt z->print() \rm aus.    
\newline \vskip 0.5cm
{\bf Aufgabe 3: Harmonischer Oszillator} (Zusatzaufgabe)\newline
a) Ein harmonischer Oszillator schwingt mit der zeitabh"angigen Auslenkung $x(t) = A \cdot sin(\omega t - \varphi)$.
Schreiben Sie ein C++ Programm, das eine Klasse \tt Oszillator \rm enth"alt. Legen Sie die Klasse so aus,
da"s sie private Instanzvarible zur Abspeicherung der Schwingungsamplitude $A$, der Phase $\varphi$ und der
Kreisfrequenz $\omega$ bereitstellt. "Offentliche Methoden sollen existieren zum Einstellen und Abfragen
der Werte f"ur $A, \omega$ und $\varphi$, sowie zur Berechnung der Auslenkung $x(t)$, der Geschwindigkeit 
$v(t) = dx/dt$ und der Beschleunigung $a(t) = dv/dt$. \newline
b) Setzen Sie $A = 2 \; cm$, $\omega = \pi/4$, $\varphi = \pi/2$ und geben Sie eine Tabelle der Struktur 
\begin{verbatim} 
t    x(t)     v(t)    a(t) 
\end{verbatim} 
mit 11 "aquidistanten Werten f"ur $0 \leq t \leq 10$
am Bildschirm aus. 
\end{document}
