Blatt 5

Werbung
Institut fur Informatik
der Universitat Munchen
Dr. Jan Johannsen
Jan Homann
WS 2007/08
20. November 2007

Ubungen
zum Repetitorium Informatik 1
Blatt 5
Aufgabe H-10 (4 Punkte): Ein
Polygon
(oder Vieleck) ist eine zweidimensionale
geometrische Figur, die aus mindestens drei Strecken besteht, die eine zusammenhangende Flache umschlieen. Ein Polygon P = p1 , . . . , pn , pi ∈ R2 kann als endliche Folge von Punkten in der Ebene deniert werden. Der Umfang von P ist die Summe der
Streckenlangen p1 p2 , . . . ,pn−1 pn und pn p1 .
(a) Denieren Sie Typen point und polygon in SML, die einen zweidimensionalen
Punkt bzw. ein Polygon reprasentieren.
(b) Schreiben Sie eine Funktion girt: polygon -> real, die den Umfang eines Polygons berechnet.
Geben Sie Ihre Losung als Textdatei mit dem Namen h-10.sml ab.
Aufgabe H-11 (6 Punkte): In der Datei 5-1.sml nden Sie Deklarationen von SMLTypen pb entry und phonebook, die ein Telefonbuch modellieren. Dabei sind Telefonnummern Listen von ganzen Zahlen, die ausschlielich Ziern enthalten.
(a) Schreiben Sie eine Funktion name: pb entry -> string, die den gesamten Namen
der Person im eingegebenen Eintrag ausgibt.
(b) Schreiben Sie eine Funktion germany: pb entry -> bool, die true liefert falls die
Telefonnummer im eingegebenen Eintrag mit der Ziernfolge 4,9 beginnt und anderenfalls false.
(c) Implementieren Sie eine Funktion getNames: phonebook * (pb entry -> bool)
-> string list, so dass der Aufruf getNames(book,f) die Liste mit den vollstandigen Namen der Personen im Telefonbuch book liefert, fur deren Eintrage e, f(e) =
true gilt.
Zum Beispiel soll fur das Telefonbuch testbook in 5-1.sml, getNames(testbook,
germany) = ["Sebastian Schneider","Norbert Brommer"] gelten.
Geben Sie Ihre Losung als Textdatei mit dem Namen h-11.sml ab.
Aufgabe H-12 (8 Punkte): Die vordenierte SML-Funktion ord: char -> int liefert
fur jeden Wert vom Typ char eine eine Zahl n mit 0 ≤ n ≤ 255. chr: int -> char
wandelt ein solches n zuruck in ein Zeichen.
(a) Schreiben Sie eine Funktion caesarshift: int -> char -> char, die bei Eingabe
der naturlichen Zahl n eine Funktion f liefert, so dass f(c) = chr((ord(c) + n)
mod 256) ist.
(b) Implementieren Sie eine Funktion inverse: (char -> char) -> char -> char,
die die Umkehrfunktion einer bijektiven Funktion (siehe unten) f: char -> char
berechnet. Gehen Sie davon aus, dass die Funktion nur mit bijektiven Eingaben
aufgerufen wird.
(c) Schreiben Sie eine Funktion encrypt: string * (char -> char) -> string, so
dass encrypt(s,f) die Funktion f auf jedes Zeichen der Zeichenkette s anwendet
und die dadurch entstandene Zeichenkette ausgibt.
(d) Schreiben Sie eine Funktion decrypt: string * (char -> char) -> string, so
dass decrypt(s,f) die Umkehrfunktion der Funktion f auf jedes Zeichen der Zeichenkette s anwendet und die dadurch entstandene Zeichenkette ausgibt. Gehen Sie
wieder davon aus, dass die Eingabefunktion bijektiv ist.
Jetzt konnen Sie zum Beispiel mit dem Aufruf val secret = encrypt("Ein String", caesarshift 10) eine Zeichenkette verschlusseln und mit dem Aufruf decrypt(secret,caesarshift
10) wieder entschl
usseln. Hinweis: Fur die letzten beiden Aufgaben sind die vordenierten Funktionen explode: string -> char list, implode: : char list -> string und
map hilfreich.
Aufgabe P-12: Zur Erinnerung: Falls M eine endliche Menge ist und f : M → M, so
sind die folgenden Aussagen aquivalent.
f ist bijektiv.
f ist injektiv, d.h. ∀ m, n ∈ M : f(n) = f(m) ⇒ n = m.
f ist surjektiv, d.h. ∀ m ∈ M ∃ n ∈ M : f(n) = m.
Schreiben Sie eine SML-Funktion onetoone: (char -> char) -> bool, die true ausgibt
falls die Eingabe bijektiv ist und anderenfalls false.
Aufgabe P-13: Bestimmen Sie
SML-Ausdrucke.
ohne Hilfe des Interpreters die Typen der folgenden
(*a*) fun f c = (c,c ^ "");
(*b*) val g = fn (f,x) => [f(x+1)+1];
(*c*) val x = fn (y,z) => y z;
(*d*) val x = fn z => fn y => let
val a = z y
in z a end;
Abgabe der Hausaufgaben u
ber UniWorx bis spatestens Dienstag, 27.11.2007, 14
Uhr. Besprechung am Dienstag, 27.11.2007.
Herunterladen