Prof. Dr. R. Schrader D. Räbiger SS 2003 1. Übung zum Programmierpraktikum 28. April – 11. Mai 2003 ohne Abgabe Aufgabe Implementieren Sie den Algorithmus von Dijkstra zur Ermittlung kürzester Wege auf einem Graphen in C, C++ oder Java. Die Datenstruktur können Sie frei wählen. Achten Sie jedoch darauf, dass Sie Ihr Programm möglichst offen für andere Datenstrukturen halten, da in der Vorlesung verschiedene Datenstrukturen vorgestellt werden, von denen Sie einige implementieren sollen. In dieser 1. Übung wird es darum gehen, die notwendigen Funktionen zu programmieren, die Sie später wieder benutzen können. Tipps für das Vorgehen a) Überlegen Sie sich zunächst eine geeignete Datenstruktur, in der Sie den Graphen abspeichern, z.B. eine Adjazenzmatrix. b) Schreiben Sie eine Funktion/Methode, mit der Sie die Eingabedaten aus einer Datei mit dem Namen input.txt einlesen und in Ihrer Struktur abspeichern können. (Details dazu weiter unten.) c) Überlegen Sie sich dann eine Datenstruktur, in der Sie die Front der Kürzeste–Wege–Menge behandeln, z.B. eine verkettete Liste. d) Programmieren Sie den in der Vorlesung besprochenen Algorithmus von Dijkstra zur Berechnung eines kürzesten Weges. e) Um die Laufzeiten unter Verwendung verschiedener Datenstrukturen zu vergleichen, können Sie die Funktion time() benutzen. Eine Erklärung finden Sie weiter unten. f) Ihr Programm sollte die ermittelte Distanz als reellwertige Zahl in eine Datei mit dem Namen output.txt ausgeben. Datenformat Wir stellen Ihnen Testdaten auf den Webseiten zur Vorlesung bereit. Alle Eingabedaten haben das folgende Format: Zeile 1. 2. 3. 4. 5. - (m+5). Inhalt Anzahl Knoten (= n) Anzahl Kanten (= m) Startknoten (eine Zahl ∈ {1, . . . , n}) Zielknoten (eine Zahl ∈ {1, . . . , n}) gerichtete Kante im Format v1:v2:Gewicht Alle Zeilen sind durch einfache Zeilenumbrüche (\n) getrennt. Die Zeilen 5 bis m + 5 enthalten alle gerichtete Kanten des beschriebenen Graphen: Die Knoten v1, v2 sind Zahlen zwischen 1 und n. Das Gewicht der Kante ist eine Zahl aus R+ . Die drei Werte sind durch einen Doppelpunkt getrennt. Laufzeit Alle technischen Hinweise beziehen sich auf die Programmiersprache C, so dass sie auch in C++ verwendbar sind. Java stellt andere Funktionen bereit. Die von unserer Seite angebotenen Hilfestellungen beschränken sich jedoch auf den Einsatz von C/C++. Die Standard–C–Bibliothek stellt Funktionen zur Zeitmessung zur Verfügung. Binden Sie dafür die Headerdatei time.h in Ihr Programm ein. time t time(time t *tp) liefert die aktuelle Kalenderzeit. Wenn Sie sie wie folgt aufrufen, wird die aktuelle Zeit in der Variablen tStart abgelegt: time t tStart = time(NULL); Dies sollten vor dem Start Ihres Algorithmus tun, um die Startzeit festzuhalten. Nachdem der Algorithmus beendet ist, können Sie die Laufzeit Ihres Algorithmus (in Sekunden) wie folgt ermitteln (und z.B. ausgeben): time t tDijkstra = difftime(time(NULL), tStart); Organisatorisches • Diese erste Übung dient dazu, dass Sie sich mit den Strukturen und grundlegenden Funktionen vertraut machen und wird von uns nicht kontrolliert. Die zweite und dritte Übung soll jedoch über das Internet (entsprechende Seiten werden noch eingerichtet) abgegeben werden. Ihr Quelltext wird dann (wie in den Übungen zu Informatik 2) einer automatischen Prüfung unterzogen und Sie erhalten sofort eine Rückmeldung, ob sich Ihr Programm kompilieren ließ. Bitte beachten Sie dazu folgende Hinweise: Allgemein: – Der Quelltext muss in einer einzigen Datei enthalten sein. – Die Eingabe wird über die Datei input.txt gelesen und die Ausgabe Ihres Programmes muss in eine Datei output.txt geschrieben werden. Beachten Sie die Kleinschreibung! Die Dateinamen sollten fest in Ihrem Quelltext verankert sein (d.h. nicht über Eingabezeilen gelesen werden o.ä.). – Sie können Ausgaben auf dem Standardausgabekanal ( Bildschirm“) machen. Die” se fließen nicht in die Kontrolle ein. Bei einem Fehler wird Ihnen diese Ausgabe jedoch angezeigt, so dass Sie sie nutzen können, um diesen zu beheben. für C/C++ Programme: – Ihr Programm wird auf einem Unix–Rechner mittels des Programms gcc kompiliert. Dadurch kann es zu kleineren Unstimmigkeiten mit Windows–Compilern kommen. Versuchen Sie sich deswegen so gut wie möglich an den ANSI–C(++) Standard zu halten. – Sie dürfen die Standard Template Library (STL) benutzen (C++). – Achten Sie darauf, dass Sie keine in C oder C++ geschützten Begriffe verwenden. Auch C Programm werden mittels eines C++ Compilers übersetzt! Solche geschützten Begriffe sind u.a. new, delete, class, etc. für Java Programme: – Es werden nur Java 2 Programme zugelassen, die JDK 1.2 benutzen. Achten Sie auch in Java darauf, den Quelltext in eine einzige Datei zu schreiben! – Benutzen Sie keine Oberflächen-Klassen (z.B. AWT/Swing). Diese werden zu Fehlern beim automatischen Testen führen. • Wir kontrollieren abgegebene Übungen auf ähnliche Kopien und erwarten, dass jeder Teilnehmer eine eigenständige Lösung abgibt. Bei Täuschungsversuchen werden beide betroffenen Personen von der Scheinvergabe ausgeschlossen. • Ihr Programm wird nicht nur automatisch, sondern zusätzlich von Hand“ durchgeschaut. ” Achten Sie bitte deswegen auf: – eine ausführliche Kommentierung – intuitiv verständliche Namensgebung bei Variablen und Funktionen – übersichtliches Einrücken des Quelltextet, so dass die verschiedenen Texttiefen logische Arbeitsabläufe des Programms verdeutlichen • Webseite zur Veranstaltung http://www.zaik.uni-koeln.de/AFS/teachings/ss03/ProgrPrakt/ • Wir haben eine Mailingliste eingerichtet, auf der sich alle Teilnehmer eintragen können. Sie kann dazu genutzt werden, Fragen zum Programmieren zu klären, aber nicht, um ganze Quelltexte auszutauschen. Dies könnte dazu führen, dass Sie keinen Schein erhalten. Die Adresse zur Anmeldung lautet: http://www.zpr.uni-koeln.de/mailman/listinfo/pprakt