1.¨Ubung zum Programmierpraktikum

Werbung
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
Herunterladen