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.