6. Übung
Bearbeitung vom 29.11.06 - 4.12.06
Aufgabe 1: Zeiger auf Funktionen
Auch Funktionen können über Zeiger angesprochen werden. Der Zeiger einer Funktion <type> f(<type>) ist <type> (*f)(<type>). Die Klammerung ist hier wichtig, da die Argumentklammer eine höhere Priorität als der Dereferenzierungsoperator hat. Der Aufruf der Funktion sin(x) aus der math.h Bibliothek kann also z.B auch erfolgen durch
double (*pf)(double);       // Zeigerdeklaration
pf = &sin;                  // Zeiger auf die Funktion
double y = (*pf)(x);        // Aufruf ueber Zeiger
Im Programm integral.cc hat ein schlechter Programmierer versucht, eine allgemeine Intregrationsroutine zu schreiben, wobei die Funktion $f(x)$ als Argument der Integrationsroutine übergeben werden sollte. Korrigieren Sie die Fehler und verifizieren Sie die Ergebnisse der Integrationen.
Aufgabe 2: Klasse der komplexen Zahlen
Entwickeln Sie eine eigene Klasse Complex der komplexen Zahlen, mit einem Konstruktor und Destruktor, sowie Methoden für die 4 Grundrechenaufgaben (Die Division darf bei Zeitmangel weggelassen werden). In der Darstellung $z = x + iy$ ist
$\displaystyle z$ $\textstyle =$ $\displaystyle z_{1} \pm z_{2} = (x_{1} \pm x_{2}) + i ( y_{1} \pm y_{2})$  
$\displaystyle z$ $\textstyle =$ $\displaystyle z_{1} \cdot z_{2} = (x_{1}x_{2} - y_{1}y_{2}) + i (x_{1} y_{2} + y_{1} x_{2})$  
$\displaystyle z$ $\textstyle =$ $\displaystyle 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}}$  

Die Klassendeklaration könnte z.B. folgendes Aussehen haben:
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();                             // 
};
Da Realteil _x und Imaginärteil _y als private deklariert sind, brauchen wir noch die beiden Methoden getReal() und getImag() . Führen Sie jeweils eine Addition, Subtraktion und Multiplikation im Hauptprogramm aus, z.B. mit z.add(z1,z2) oder z->add(*z1,*z2), und drucken Sie die Ergebnisse mit z.print() b.z.w. z->print() aus.
Aufgabe 3: Harmonischer Oszillator (Zusatzaufgabe)
a) Ein harmonischer Oszillator schwingt schwingt mit der zeitabhängigen Auslenkung $x(t) = A \cdot sin(\omega t - \varphi)$. Schreiben Sie ein C++ Programm, das eine Klasse Oszillator enthält. Legen Sie die Klasse so aus, daß sie private Instanzvarible zur Abspeicherung der Schwingungsamplitude $A$, der Phase $\varphi$ und der Kreisfrequenz $\omega$ bereitstellt. Öffentliche Methoden sollen existieren zum Einstellen und Abfragen der Werte für $A, \omega$ und $\varphi$, sowie zur Berechnung der Auslenkung $x(t)$, der Geschwindigkeit $v(t) = dx/dt$ und der Beschleunigung $a(t) = dv/dt$.
b) Setzen Sie $A = 2 \; cm$, $\omega = \pi/4$, $\varphi = \pi/2$ und geben Sie eine Tabelle der Struktur
 
t    x(t)     v(t)    a(t)
mit 11 äquidistanten Werten für $0 \leq t \leq 10$ am Bildschirm aus.



Harm Fesefeldt
2006-11-28