Institut fur Informatik der Universitat Munchen Dr. Jan Johannsen Jan Homann WS 2007/08 6. November 2007 Ubungen zum Repetitorium Informatik 1 Blatt 3 Aufgabe H-4 (4 Punkte): Schreiben Sie eine SML-Funktion digit: string -> int, die bei der Eingabe einer Zier (also einer der Zeichenketten "0", "1", "2", "3", "4", "5", "6", "7", "8" oder "9") die entsprechende Zier als ganze Zahl (also als int) zur uckgibt. Bei der Eingabe einer anderen Zeichenkette soll digit die Zahl -1 ausgeben. (z.B. digit("8") = 8 und digit("SML ist toll") = -1) Verwenden Sie keine Funktionen aus der SML-Bibliothek. Geben Sie Ihre Losung als Textdatei mit dem Namen h-4.sml ab. Aufgabe H-5 (6 Punkte): (a) Schreiben Sie eine SML-Funktion flatten: (int * int * int) list -> int list, die eine Liste, die aus Tripeln von ganzen Zahlen besteht, in eine Liste von ganzen Zahlen umwandelt, die die gleichen Zahlen in der gleichen Reihenfolge wie die Eingabeliste enthalt. Zum Beispiel ist flatten([(1,2,3),(4,5,6),(6,6,6)]) = [1,2,3,4,5,6,6,6,6]. (b) Schreiben Sie eine SML-Funktion merge: int list * int list -> int list, die aus zwei Listen eine Liste erstellt, die alle Elemente der Eingabelisten enthalt und in der die Elemente der Eingabelisten abwechselnd vorkommen, bis alle Elemente der kurzeren Liste aufgebraucht sind. Zum Beispiel soll merge([3,3,3,3,3,3],[2,2,2]) = [3,2,3,2,3,2,3,3,3] gelten. Das erste Element soll, wie im Beispiel, aus der ersten Liste kommen. (c) Schreiben Sie eine SML-Funktion demerge: int list -> int list * int list, die eine Liste von ganzen Zahlen in zwei Listen zerlegt, so dass die erste alle negativen Elemente der Eingabeliste und die zweite alle positiven Element der Eingabeliste enthalt. Zum Beispiel soll demerge([1,2,-3,4,-5,-6]) = ([1,2,4],[-3,-5,-6]) gelten. Geben Sie Ihre Losung als Textdatei mit dem Namen h-5.sml ab. Aufgabe H-6 (6 Punkte): (a) Finden Sie mit Hilfe des SML-Interpreters heraus, was die vordenierten Funktionen size: string -> int, ^ : string * string -> string, substring: string * int * int -> string und Int.toString: int -> string berechnen. Beschrei- ben Sie jede der Funktionen in wenigen Worten mit einem ) am Anfang Ihrer Abgabedatei. Kommentar ( mit (*...*) (b) Schreiben Sie eine SML-Funktion dectobin: int -> string die eine Zahl in Dezimaldarstellung, in Binardarstellung ausgibt. Zum Beispiel soll dectobin(11)="1011" und dectobin(45)="101101" gelten. Verwenden Sie die Funktionen aus Teil (a). (c) Schreiben Sie eine SML-Funktion bintodec: string -> int die eine Zahl in Binardarstellung, in Dezimaldarstellung ausgibt. Beispielsweise soll bintodec("1101")=13 und bintodec("110011")=51 gelten. Gehen Sie davon aus, dass die Funktion mit Zeichenketten aufgerufen wird, die nur die Zeichen 0 und 1 enthalten und aus mindestens einem Zeichen bestehen. Sie konnen auf die Funktionen aus Teil (a) zuruckgreifen. Geben Sie Ihre Losung als Textdatei mit dem Namen h-6.sml ab. Aufgabe P-8: Schreiben Sie eine SML-Funktion f: real -> int, die f ur die Eingabe n r ≥ 1 die Funktion f(r) = max{ n | n ∈ N, 2 ≤ r } berechnet. Hinweis: Denieren Sie Hilfsfunktionen. Aufgabe P-9: (a) Implementieren Sie eine Funktion perfect: int -> bool in SML, die entscheidet ob eine Zahl vollkommen ist. (Negative Zahlen sind nicht vollkommen.) (b) Implementieren Sie eine Funktion perflist: int -> int list, die alle vollkommenen Zahlen ausgibt die kleiner sind als die Eingabe. Testen Sie Ihr Programm mit groen Zahlen. (c) Betrachten Sie folgende alternative Implementierung von perflist, die Sie in der Datei 3-1.sml nden. fun exp 0 = 1 | exp e = 2 * exp(e-1); fun cand n = exp(n-1)*(exp(n)-1); fun pl(n,t) = if (cand n) > t then [] else if perfect(cand n) then (cand n)::pl(n+1,t) else pl(n+1,t); fun perflist’ n = if n<0 then [] else pl(1,n); Korrektheit Untersuchen Sie die Funktion perflist’ empirisch im Hinblick auf und . Was fallt Ihnen im Vergleich mit Ihrer Losung auf? Wurden Sie die Funktion perflist’ an einen Kunden ausliefern? Ezienz Abgabe der Hausaufgaben u ber UniWorx bis spatestens Dienstag, 13.11.2007, 14 Uhr. Besprechung am Dienstag, 13.11.2007.