Computer-Aided Program Development
Institute of Computer Science
Faculty of Engineering, Christian-Albrechts-University of Kiel
Logo of the Working Group
Programmierpraktikum P1

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