Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Goethe-Universität Frankfurt am Main Grundlagen der Programmierung 2 Sommersemester 2011 Aufgabenblatt Nr. 1 Abgabe: Mittwoch 20. April 2011 vor! der Vorlesung Allgemeine Hinweise: • Bitte notieren Sie auf Ihrer Abgabe Ihren Namen, den Namen des Tutors und den entsprechenden Übungstermin. • Legen Sie die Abgabe bitte mittwochs vor der Vorlesung in den entsprechenden Kasten Ihres Tutors (im Hörsaal II). • Alternativ (falls Sie nicht (pünktlich) zur Vorlesung erscheinen können) können Sie Ihre Abgabe bis Mittwoch 09:00h (z.B. schon am Dienstag) auch in den weißen Briefkasten neben Zimmer 216 (2.Stock, Robert-Mayer-Str. 11-15) einwerfen. • Bitte beachten Sie, dass zu Ihrer Lösung zugehöriger Quellcode sowohl gedruckt abgegeben als auch per Email an den entsprechenden Tutor gesendet werden muss! Da Sie für dieses Blatt Ihren Tutor erst am Abgabetag erfahren, reicht es aus, wenn Sie den Quellcode im Laufe des 20. April an Ihren Tutor schicken. Die Email-Adressen der Tutoren sind: Tutor Christian Grunert Email-Adresse [email protected] Markus Wondrak [email protected] Sadik Yel [email protected] Roman Lossa [email protected] Frank Abromeit [email protected] Nicolas Torchalla [email protected] Markus Palcer [email protected] Anja Gerbes [email protected] Alexey Mosesov [email protected] Ralf Hauenschild [email protected] • Für zu implementierende Programme sind stets auch Testaufrufe mit geeigneten Werten der Lösung beizufügen! Aufgabe 1 (25 Punkte) a) Melden Sie sich bis Montag, den 18. April, 14:00h online für die Übungen an. Die passwortgeschützte Anmeldeseite ist unter http://www.informatik.uni-frankfurt.de/~prg2 abrufbar. Das erforderliche Passwort wurde in der ersten Vorlesung bekannt gegeben und hängt am Brett links neben Zimmer 216, 2. Stock, Informatikgebäude (Robert-Mayer-Str. 11-15) aus. (5 Punkte) 1 b) Üben Sie die Benutzung des Haskell-Interpreters GHCi, indem Sie den Interpreter starten (bzw. eventuell vorher installieren) und sich mit der zugehörigen Dokumentation vertraut machen. Machen Sie sich insbesondere mit den Kommandos des Interpreters vertraut und erklären Sie die Funktionalitäten der Kommandos1 :load, :reload, :cd, :quit und :? und geben Sie Beispiele für deren Verwendung an. (5 Punkte) c) Implementieren Sie eine Funktion in Haskell, die als Eingaben eine Gesamtzahl an Übungspunkten aus der ersten Hälfte, eine Gesamtzahl an Übungspunkten aus der zweiten Hälfte, sowie zwei Wahrheitswerte erhält, die jeweils dann wahr (d.h. True) sind, wenn in der ersten (bzw. zweiten) Hälfte der Übungen mindestens einmal vorgerechnet wurde. Als Ausgabe soll die Funktion die Bonuspunkte für die Klausur berechnen. Speichern Sie die Funktion in einer Datei2 und laden Sie sie in einen Haskell-Interpreter. Testen Sie die Funktion anschließend mit sinnvollen Werten. (15 Punkte) Aufgabe 2 (50 Punkte) Implementieren Sie folgende Funktionen als rekursive Funktionen in Haskell: a) Eine Funktion, die die Quersumme einer Zahl berechnet. Die Quersumme einer Zahl ist die Summe ihrer Ziffern. (15 Punkte) b) Eine Funktion, die die iterierte Quersumme einer Zahl berechnet. Die iterierte Quersumme einer Zahl erhält man, indem man von der einfachen Quersumme wiederholt die Quersumme bildet, bis nur noch eine einstellige Zahl übrig bleibt. (15 Punkte) c) Eine Funktion, die die alternierende Quersumme einer Zahl berechnet. Die alternierende Quersumme erhält man, indem man bei einer Zahl, beginnend ganz rechts, die Ziffernwerte abwechselnd subtrahiert und addiert. So ist für die Zahl 12345 die alternierende Quersumme 5 − 4 + 3 − 2 + 1 = (((5 − 4) + 3) − 2) + 1 = 3 Hinweis: Es gilt a − b + c = a + (−b) + c, d.h. für das obige Beispiel haben wir 5 − 4 + 3 − 2 + 1 = 5 + (−4) + 3 + (−2) + 1 = 3. (20 Punkte) Aufgabe 3 (25 Punkte) Es seien folgende Funktionsdefinitionen in Haskell gegeben: fun1 fun2 fun3 fun4 a) b) c) d) e) 1 2 a a a a b b b b = = = = if 1000 < a+b then 20 else fun3 a (b*3) if (fun1 100 b) == 10) then fun2 (a+1) (b-1) else fun4 (a-1) (b+1) fun4 (a-1) (fun1 (b+2)) (fun1 a b) - (mod (fun4 a (b+1)) (fun1 a b)) Für welche Funktionen f, g ∈ {fun1, fun2, fun3, fun4} gilt f referenziert g direkt? (7 Für welche Funktionen f , g ∈ {fun1, fun2, fun3, fun4} gilt f referenziert g? (6 Welche der Funktionen fun1, fun2, fun3 und fun4 sind direkt rekursiv? (3 Welche der Funktionen fun1, fun2, fun3 und fun4 sind rekursiv? (4 Welche Paare der Funktionen fun1, fun2, fun3 und fun4 sind verschränkt rekursiv? (5 Man kann die Kommandos auch verkürzt eingeben, d.h. z.B. :l statt :load Haskell-Quelldateien haben die Endung .hs bzw. .lhs, wenn Sie den Literate Haskell-Stil verwenden. 2 Punkte) Punkte) Punkte) Punkte) Punkte)