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.