ProInformatik: Funktionale Programmierung, 28.7

Werbung
ProInformatik: Funktionale Programmierung, 28.7-22.8.2008
Tag 2, 29.7.2008
Übungen
Für alle Programmieraufgaben gilt wie immer: testen Sie Ihr Programm in Hugs und
schreiben Sie eine Funktionsauswertung für eine konkrete Eingabe.
Aufgabe 2.0
Welche Funktionen (Abschnitte) sind korrekt / falsch definiert? Begründen bzw. erläutern Sie, was
die Funktionen berechnen (Sie dürfen das Haskell-System zur Überprüfung Ihrer Antworten
heranziehen. Wichtig sind die Begründungen!)
a) 0 `mod` 2
b) ((`mod` 2) == 0)
c) flop f b a = f a b
d) (* 8 12)
e) f a b c = g a b c + g a (b-1) c
where
g x y = (* `div` x y)
Sind die folgenden Ausdrücke korrekt? (Begründung und ggf. Wert).
f) 7 * 3 – ( -2)
g) (+) 3 (2*5)
h) (+) 3 ((2*) 5 )
i) (+) 3 2 * 5
j) (3+) (2*) 5
k) (3+2 *) 5
Aufgabe 2.1
a) Schreiben Sie eine Funktion istZahl, die eine Eingabe vom Typ Char und eine Ausgabe vom
Typ Bool hat und True zurückliefert, wenn die Eingabe ein Buchstabe (klein oder groß) ist.
Signatur: istBuchst :: Char->Bool
In Hugs:
>i stBuchst ‘A’
>True
b) Was ist das Problem bei dieser Eingabe:
Main> istBuchst 1 3
ERROR - Type error in application
*** Expression : istBuchst 1 3
*** Term
: istBuchst
*** Type
: Char -> Bool
*** Does not match : a -> b -> c
Aufgabe 2.2
a) Schreiben Sie eine Funktion machKlein, die eine Eingabe und eine Ausgabe vom Typ Char hat
und die erstens prüft, ob diese Eingabe ein Buchstabe ist und wenn dem so ist, diesen in
einen Kleinbuchstaben umwandelt, und sonst '0' zurück gibt.
Signatur: machKlein :: Char-> Char
In Hugs:
>machKlein ‘A’
>‘a‘
b) Was ist das Problem bei dieser Eingabe:
Main> machKlein 'df'
ERROR - Improperly terminated character constant
Aufgabe 2.3
a) Schreiben Sie eine Funktion charToNum, die eine Eingabe vom Typ Char und eine Ausgabe
vom Typ Int hat und die erstens prüft, ob die Eingabe eine Ziffer ist und wenn dem so ist,
diese in den entsprechenden Zahlenwert vom Typ Int umwandelt und sonst 13 zurück gibt.
Signatur: charToNum :: Char -> Int,
In Hugs:
>charToNum ‘5’
>5
>charToNum ‘S’
>13
b) Was ist das Problem bei dieser Eingabe:
Main> charToNum
ERROR - Cannot find "show" function for:
*** Expression : charToNum
*** Of type : Char -> Int
Aufgabe 2.4
a) Schreiben Sie eine Funktion averageThree :: Int -> Int -> Int -> Float, die den Mittelwert ihrer
Eingabe berechnet.
In Hugs:
> averageThree 1 2 3
>2.0
b) Was ist das Problem bei dieser Eingabe:
Main> averageThree 1.2 4 5
ERROR - Illegal Haskell 98 class constraint in inferred type
*** Expression : averageThree 1.2 4 5
*** Type
: Fractional Int => Float
Aufgabe 2.5
a) Gesucht ist ein Algorithmus, der von zwei Zahlen n und m entscheidet, ob m ein Teiler von n
ist.
b) Schreiben Sie ein Haskell-Programm, das den Algorithmus umsetzt. Benutzen Sie Rekursion.
Aufgabe 2.6
In einer Formelsammlung findet man zur Berechnung des Kegelstumpfvolumens folgende Formel:
Die Höhe ist h, der Radius des Kegels ist r1, des Stumpfes r2. Defnieren Sie eine entsprechende
Funktion in Haskell.
Aufgabe 2.7
a) Gesucht ist ein Algorithmus, der die Fakultät berechnet, d.h. das Produkt der Zahlen 1 bis n,
wobei n eine natürliche Zahl ist und die Fakultät von 0 ist 1.
b) Definieren Sie die Fakultätsfunktion fak in Haskell. Benutzen Sie Rekursion.
Aufgabe 2.8
a) Gesucht ist ein Algorithmus, der die Potenz von 2, also 2n, wobei n eine natürliche Zahl ist,
berechnet.
b) Schreiben Sie ein Haskell-Programm, das den Algorithmus umsetzt. Benutzen Sie Rekursion.
Zusatzaufgaben Datentyp Float
Wenn Sie bereits mit den anderen Aufgaben fertig sind, versuchen Sie sich an den Aufgaben 3.143.17 im Buchskript Seite 45-46.
Zusatzaufgaben Rekursion
a) Gesucht ist der Algorithmus, der den größten gemeinsamen Teiler von n und m berechnet,
wobei n und m natürliche Zahl sind, n, m>0.
b) Schreiben Sie ein Haskell-Programm, das den Algorithmus umsetzt. Benutzen Sie Rekursion.
c) Wenn Sie bereits mit den anderen Aufgaben fertig sind, versuchen Sie sich an den Aufgaben
4.7-4.12 im Buchskript Seite 64-65.
Herunterladen