Aufgabe 1 - Goethe

Werbung
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)
Herunterladen