Prof. Dr. R. Schrader Anna Schulze [[email protected]] Birgit Engels [[email protected]] SS 2006 1. Teil Programmierpraktikum Abgabe Donnerstag, 27.4.2006 Aktuelle Informationen bezüglich des Vorlesungsteils (Skript) sowie des Programmierteils des Praktikums (Header und Testprogramme) finden sich unter : http://www.zaik.uni-koeln.de/AFS/teachings/courses/Programmierpraktikum/progprakt.html.de Von dort können für die C++-Programmierung die folgenden Pakete heruntergeladen werden : cheader1.tar.gz Enthält die C++-Header Vertex.h, Edge.h, Graph.h, Dijkstra.h, deren Methoden in den entsprechenden *.cpp-Dateien zu implementieren sind, sowie ein primitives Makefile. Private Methoden können in den Klassen natürlich ergänzt werden. ctests1.tar.gz Enthält eine Test-Datei für Dijkstras Algorithmus, basierend auf den oben genannten Klassen, sowie einige Text-Dateien in festem Format aus denen Beispielgraphen geparst werden sollen (siehe Klassen Graph, Dijkstra). Das Format der Dateien ist (zunächst) wie folgt aufgebaut: • Alle Zeilen, die mit einer Raute ( # ) beginnen sollen als Kommentarzeilen behandelt ( d.h. ignoriert werden ). Entsprechende Zeilen werden in der folgenden Aufzählung nicht berücksichtigt. • Die 1. Zeile enhält ausschliesslich die Anzahl der Knoten des Graphen. • Die 2. Zeile enhält ausschliesslich die Anzahl der Kanten des Graphen. • Die folgenden Zeilen enhalten je eine Kante, wobei durch einzelne Leerzeichen getrennt jeweils die IDs des Start- und Ziel- Knotens und das Kantengewicht gelistet sind. • Die vorletzte Zeile enhält ausschliesslich die ID des Start-Knotens. • Die letzte Zeile enhält ausschliesslich die ID des Ziel-Knotens. Für die Programmierung in Java sind die C++-Header der vorgegebenen Klassen in Java-Klassen mit leeren Methoden-Köpfen umgewandelt worden und stehen im Paket jclasstemplates.tar.gz zusammen mit einer Testklasse und den oben erläuterten Text-Dateien zur Verfügung. Beide Pakete enthalten eine README-Datei mit einer kleinen FAQ-Sammlung, die mit weiteren auftretenden Fragen/Antworten ergänzt werden wird. Bitte wenden ! Hinweis: Für alle Teile des Programmierpraktikums gilt, dass eine ausreichende und sinnvolle Kommentierung des Codes notwendig ist. In Extremfällen kann sich aufgrund mangelnder Kommentare die Bewertung eines Aufgabenteils verschlechtern. Aufgabe 1: (Datenstrukturen) Implementieren Sie die Datenstrukturen Vertex, Edge und Graph zu den entsprechenden Header/Klassen-Dateien. Um später die Projektstruktur und Test-Dateien nutzen zu können, müssen die öffentlichen Methoden, insbesondere get-/set-Methoden der Klassen implementiert sein. Hinweis : Die vorgegebene Klassenstruktur soll als Leitfaden für die Programmieraufgaben genutzt werden. In begründeten Einzelfällen ist eine Abweichung von vorgegebenen Methoden möglich. Dabei muss allerdings die volle geforderte Funktionalität erfüllt sein ! Aufgabe 2: (Dijkstra) Implementieren Sie Dijkstra’s Algorithmus unter Verwendung der Datenstrukturen aus Aufgabe 1. Zur Bestimmung des Knotens mit minimaler (vorläufiger) Distanz kann zunächst eine lineare Suchmethode ( linmin() ) verwendet werden. Tip: Die bereits betrachteten Knoten werden während des Algorithmus in einer separaten Menge verwaltet. Die Zugehörigkeit eines Knotens zu dieser Menge kann als Flag ([get—set]Marker()) im Knoten selbst gespeichert werden. Der von Dijkstra’s Algorithmus gefundene kürzeste Weg soll in selbserklärendem Format (d.h. mit ein wenig Text wie Knoten x, Knoten y, usw.) in eine (Text-)Datei geschrieben werden (siehe writeOutput() in der Klasse Dijkstra).