Programmierpraktikum im Wintersemester 2006/07
Dozenten: Rudolf Berghammer,
Jan Christiansen
Vorlesung: Mo, 12:15 - 13:45, CAP3 - R.1 (Beginn: 13.11.2006)
Betreute Rechnerzeiten: Di, Mi, Fr, 14:00 - 16:00,
Grundausbildungspool (Beginn: 21.11.2006)
Wissenschaftliche Hilfskräfte:
Alexandra Barchunova -
bal@informatik.uni-kiel.de
Torsten Amende - tam@informatik.uni-kiel.de
Im Programmierpraktikum sollen grundlegende Fähigkeiten
der Programmierung praktisch erlernt werden. Alle Programme im
Praktikum werden in der Programmiersprache ML geschrieben und es wird
in Zweiergruppen gearbeitet. Das Praktikum umfasst vier
Aufgabenblätter zu deren Lösung jeweils etwa drei Wochen
Zeit zur Verfügung stehen. Zu jedem der Aufgabenblätter gibt
es eine Veranstaltung im CAP3 Raum 1, in der in die Aufgabenstellung
des neuen Blattes eingeführt wird. An drei Terminen in der Woche
stehen für jeweils zwei Stunden Hilfskräfte im
Grundausbildungspool zur Verfügung, um bei Fragen zu helfen. Am
Ende eines drei-Wochen-Zeitraums werden die Programme durch die
Hilfskräfte abgenommen. Dies geschieht in den Zeiten der
Rechnerbetreuung.
Organisation
Nachholprüfung
Die Nachholprüfungen werden am 12. April
2007 stattfinden.
Alle Teilaufgaben müssen zuvor bei mir vorgeführt werden, damit ich
überprüfen kann, dass die fehlenden Aufgaben nachgearbeitet
wurden. Dabei muss auch gezeigt werden, dass das Programm verstanden
wird. Diese Vorstellung muss spätestens am 6. April
erfolgen.
Am 21. März und am 4. April von 14 bis 16 Uhr stehen ein HiWi und
ich für Fragen zur Verfügung. Diese Termine finden im
Raum 709 im siebten Stock des Hochhauses statt. Desweiteren stehe ich
für Fragen auch persönlich oder per elektronischer Post
zur Verfügung.
WICHTIG
Alle Praktikumsteilnehmer, die
sich noch nicht bei Frau
Scheidemann für die Modulprüfung angemeldet haben,
müssen dieses umgehend nachholen. Das gilt auch für
Studenten die das Diplom als Abschluss anstreben. Wenn man das
Praktikum erfolgreich absolviert, aber nicht für die
Modulprüfung angemeldet ist, bekommt man nur einen "normalen"
Leistungsnachweis, aber keinen Modulprüfungsschein. Die Scheine
sind nicht gleichwertig. Wenn man dann in den Bachelor-Studiengang
wechselt, benötigt man aber den Modulprüfungsschein.
Anmeldung
Jeder Teilnehmer muss sich in der StudiDB
für das
Programmierpraktikum P1 angemeldet haben. Die Anmeldung ist noch bis
zum 26.11.2006 möglich, danach wird die StudiDB für weitere
Anmeldungen gesperrt.
Anmeldung zur Abnahme
Die
Anmeldung erfolgt in Zweiergruppen und erfordert die
Matrikelnummern beider Gruppenmitglieder. Die Anmeldung wurde
am 10.12.2006 geschlossen.
Abschlussprüfung
Die Abschlussprüfung des Programmierpraktikums findet am 13. und
14.02.2007 statt. Bis Freitag den 09.02.2007 kann man sich für
die Abschlussprüfung bei mir im Büro oder per E-Mail
anmelden.
Die Prüfung findet im Hochhaus im Raum 709 statt. In
diesem Raum fanden auch alle anderen Abnahmen statt.
Einführung
Vorlesung: 13.11.2006
Folien: Einführung.pdf
1. Aufgabenblatt
Vorlesung: 20.11.2006
Folien: Vorlesung1.pdf
Aufgaben: Serie1.pdf
Abnahme: 12.12.2006 (Anmeldung)
Materialien: Es gibt zwei Versionen der
"io.sml". Die erste Version
funktioniert mit älteren sml/nj Versionen, die vor dem
15.September 2003 erschienen sind (zum
Beispiel die Version auf den Institutsrechnern). Die zweite Version funktioniert mit allen anderen
sml/nj Versionen.
2. Aufgabenblatt
Vorlesung: 11.12.2006
Folien: Vorlesung2.pdf
Aufgaben: Serie2.pdf
Abnahme: 16.01.2007 (Anmeldung)
WICHTIG
Es gibt einen Fehler in der io.sml. Die Funktion output schreibt nicht
sofort auf das Terminal, wenn sie aufgerufen wird. Sie wartet, bis ein
"\n" geschrieben, explizit der Befehl gegeben "flushOut" oder der
Programmlauf beendet wird. Ich habe den Fehler korrigiert und die obigen Dateien angepasst.
3. Aufgabenblatt
Vorlesung: 15.01.2007
Aufgaben: Serie3.pdf
Abnahme: 06.02.2007 (Anmeldung)
Darstellung von Datenstrukturen
Der SML-NJ Interpreter gibt Terme nur bis zu einer bestimmten Tiefe
aus. Zum Beispiel liefert die folgende Eingabe
- append (1, append (2, append (3, append (4, empty))));
diese Ausgabe
val it = append (1,append (2,append #)) : int sequ
Dabei wird der Term nur bis zur Tiefe 3 ausgegeben. Die ausgeblendeten
Teilterme werden durch ein # dargestellt. Im Grundausbildungspool kann
man die Tiefe mit dem folgenden Befehl auf 10 erhöen:
- Compiler.Control.Print.printDepth := 10;
Auf neueren SML-NJ Systemen muss ein leicht anderer Befehl verwendet
werden:
- Control.Print.printDepth := 10;
Diese Angabe gilt nicht für die fest eingebaute
Listenstruktur. Diese wird immer komplett angezeigt.
toString für Baumstruktur
Um Ihnen das Testen Ihrer Suchbaumimplementierung zu erleichtern,
stelle ich eine Funktion zur Verfügung, die einen Suchbaum
darstellt. Der Baum wird dabei als auf die Seite gelegte Baumstruktur
dargestellt.
fun left (1,_ ) s = s
| left (_,false) s = " | " ^ s
| left (_,true ) s = " " ^ s
fun right (1,_ ) s = s
| right (_,false) s = " " ^ s
| right (_,true ) s = " | " ^ s
fun prefix 1 = " "
| prefix _ = " +--- "
fun treeToStringList (n: int, _: bool, Empty: (int,int) tree) =
[ prefix n ^ "Empty" ]
| treeToStringList (n: int, b: bool, Node (l,k,e,r): (int,int) tree) =
map (right (n,b)) (treeToStringList (n+1,false,r))
@ (prefix n ^ Int.toString(k) ^ " " ^ Int.toString(e))
:: map (left (n,b)) (treeToStringList (n+1,true,l))
fun treeToString (STree(_,_,t): (int,int) stree) =
concat(map (fn l => l ^ "\n") (treeToStringList(1,true,t)));
Der Aufruf print(treeToString(fromList(op <, op =,
[(1,1),(3,3),(2,2),(4,4)]))); liefert dann zum Beispiel
folgende Ausgabe (dabei sind op < und op = die
übergebenen Vergleichsfunktionen):
+--- Empty
4 4
| +--- Empty
| +--- 3 3
| | +--- Empty
+--- 2 2
| +--- Empty
+--- 1 1
+--- Empty
Diese Implementierung funktioniert nur für
Suchbäume, deren Schlüssel und Werte den Typ int
haben. Sie müssen die Musteranpassung in den Funktionen
treeToString und treeToStringList an ihre
Datentypen anpassen. Die Teile, die rot gefärbt sind, müssen
sie ggf. anpassen.
Tipps
Zur Benutzung des sml-Systems auf den SUNs im Grundausbildungspool
sollte der "sml emacs mode" verwendet werden. Dazu müssen die
folgenden Zeilen in die Daten .emacs im eigenen home-Verzeichnis
eingetragen werden.
(setq load-path (cons (expand-file-name "/home/smlnj/SML_1.10/share/emacs/site-lisp/sml-mode") load-path))
(autoload 'sml-mode "sml-mode" "Major mode for editing ML programs." t)
(setq auto-mode-alist
(append '(("\\.sml$" . sml-mode)
("\\.sig$" . sml-mode)
("\\.ML$" . sml-mode)) auto-mode-alist))
Ich musste leider feststellen, dass der sml-mode, der auf den Rechnern
im Grundausbildungspool installiert ist, den letzten Befehl nicht
versteht. Daher darf die folgende Zeile nicht in die .emacs eingetragen
werden.
(add-hook 'sml-load-hook '(lambda () (require 'sml-font)))
Wird dann eine Datei mit der Endung sml im emacs geladen, werden die
ml Schlüsselwörter hervorgehoben. Außerdem bietet der sml
mode eine automatische Einrückung. Das heißt, die Tab-Taste
rückt die Zeile in der sich der Cursor befindet intelligent
ein. Die Verwendung dieser Einrückung ist zur Steigerung der
Übersichtlichkeit sehr zu empfehlen. Weitere Informationen zum
sml mode gibt es unter der Adresse www.smlnj.org/doc/Emacs/sml-mode.html.
Weitere Informationen zu dieser Veranstaltung:
Materialien:
Jan Christiansen -
jac@informatik.uni-kiel.de
Last modified:
08-Mar-2007, 10:11:49 MET