Hartmut Jürgens Universität Bremen SS 2009 Computerpraktikum Übung 8 Zusammengesetzte Datenstrukturen und Klassen Aufgabe 1 – Verwalten einer CD-Sammlung Ihre CD-Sammlung soll mit einem C++-Programm verwaltet werden. Überlegen Sie sich, welche Daten einer Audio-CD Sie abspeichern wollen und definieren Sie die nötigen Datenstrukturen als structs. struct kann auch verschachtelt werden. Hinweis: Das Musikgenre (z.B. Jazz, Rock, etc.) kann als Aufzählungstyp enum definiert werden. (ca. 20 min) Aufgabe 2 – Liste mit einfacher Verknüpfung In der Vorlesung (Felder und Strukturen) haben wir als wichtiges Beispiel einer dynamischen Datenstruktur die Liste (und grundlegende Operationen, die auf ihr ausgeführt werden) kennengelernt. Nun sollen weitere Operationen auf der Liste implementiert werden. Formulieren Sie als erstes das Programm aus der Vorlesung so um, dass die Eingabe und Ausgabe jeweils eine eigenständige Funktion bilden. Dabei soll bei der Ausgabe kein Element gelöscht werden. Schreiben sie nun jeweils eine Funktion, die es ihnen erlaubt • die Anzahl der Listeneinträge bzw. Listenknoten zu ermitteln; • einen Datensatz nach dem i-ten Element in der Liste einzuhüngen bzw. zu löschen (mit Sicherheitsabfrage, ob i-tes Element existiert); • die vorhandene Liste zu sortieren (optional). Das Beispielprogramm ”liste_simple.cpp” findet sich auf der Praktikumsseite. (ca. 25 min) Aufgabe 3 – Komplexe Zahlen Fassen Sie die Beispiele bzgl. der Klasse Complex aus der Vorlesung zusammen und ergänzen Sie die Klasse ausserdem so, das sie folgende Funktionalitäten enthält: 1. Die Konstruktoren Complex() und Complex(double x, double y). 2. Den Kopierkonstruktor Complex(const Complex &other). 8-1 3. Die Methode void Set(double x, double y) zum nachträglichen Setzen von Real- und Imaginärteil. 4. Die Methoden double real() und double imag() zum Abfragen von Real- und Imaginärteil. 5. Die Methode double norm() für den Absolutbetrag der komplexen Zahl. 6. Die Funktionen add und mult für Summe und Produkt zweier komplexer Zahlen. add kann z.B. so aussehen: Complex add ( const Complex &a , const Complex & b ) { double x = a . x + b . x ; double y = a . y + b . y ; return Complex (x , y ); } 7. Welche Bedeutung hat der &-Operator im Funktionskopf von Punkt 6 und warum sind die Argumente als const deklariert? 8. Welche Elemente (sowohl Methoden als auch Datenelemente) sollten public und welche private sein und warum? (ca. 25 min) Aufgabe 4 – Konvergenz einer komplexen Folge Berechnen Sie mit der Klasse aus Aufgabe 3 die ersten 15 Folgenglieder zi ∈ C der Folge z0 = 0, zn+1 = zn2 + c für c ∈ {0, 0.5, 1, 0.5i, −1.1 + 0.1i, 0.1 + 0.7i, −0.1 + 0.7i}. Geben sie die Ergebnisse auf dem Bildschirm aus. Für welche c ist die Folge ein Kandidat für Konvergenz? Hinweis: Sobald |z| ≥ 2 ist, divergiert diese Folge. (ca. 15 min) Aufgabe 5 – Projektverwaltung Teilen Sie den Programmcode der vorhergehenden Aufgaben, so auf, dass die Klasse Complex in complex.h deklariert wird. Einige Methoden und Funktionen können Sie auch in complex.cpp auslagern. Das Hauptprogramm complexmain.cpp soll dann mit #include "complex.h" auf diese Klasse zugreifen. Das Projekt kann wie folgt übersetzt werden: $ g++ -c -o complex.o complex.cpp $ g++ -o complexmain complexmain.cpp complex.o (ca. 15 min) 8-2