Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Biologie und Informatik/ Institut für Informatik Johann Wolfgang Goethe-Universität Frankfurt am Main Praktische Informatik 1 Wintersemester 2004/2005 Aufgabenblatt Nr. 6 Abgabe: Mittwoch 8. Dezember 2004 vor! der Vorlesung Aufgabe 1 (33 Punkte) Gemischte Zahlen a cb bestehen aus einem ganzzahligen Anteil a sowie einem Bruch bc , wobei b c ≥ 0 und b < c. Der Datentyp GemischteZahl sei in Haskell für positive gemischte Zahlen als data GemischteZahl = GemischteZahl Integer Rational deriving(Show) definiert. Implementieren Sie folgende Funktionen in Haskell: a) pGemischteZahlToRational konvertiert eine positive gemischte Zahl in einen Bruch vom Typ Rational. (11 Punkte) b) pRationalToGemischteZahl konvertiert einen positiven Bruch vom Typ Rational in eine gemischte Zahl. (11 Punkte) c) addp erhält zwei positive gemischte Zahlen und liefert als Ergebnis die Summe der Eingaben als positive gemischte Zahl. (11 Punkte) Hinweise: Rationale Zahlen vom Typ Rational können mit dem Infix-Operator % zusammengesetzt werden, dafür ist es jedoch notwendig die entsprechende Bibliothek einzubinden. Dies ist möglich mit der Anweisung import Data.Ratio die am Anfang ihrer Quelltextdatei stehen sollte. Diese Bibliothek stellt auch die u.U. hilfreichen Selektoren numerator und dominator zur Verfügung, die angewendet auf eine Bruchzahl ihren Zähler bzw. Nenner liefern. Bei der Lösung der Aufgabe könnte es hilfreich sein, wenn Sie versuchen auf die vordefinierte Addition (+) für Bruchzahlen vom Typ Rational zurück zu greifen. 1 Aufgabe 2 (42 Punkte) Implementieren Sie Funktionen untersumme und obersumme in Haskell, die jeweils als Eingaben eine Funktion, ein Intervall [a, b], und eine Anzahl an Streifen erhalten, und die Untersumme bzw. die Obersumme der Fläche zwischen x-Achse und der Funktion berechnen. b b a a f f Untersumme Obersumme Die Höhe eines Streifens (Rechtecks) ist bei der Untersumme (bzw. Obersumme) durch das Minimum (bzw. Maximum) der Funktionswerte zu Beginn und am Ende des Streifens festgelegt. Verläuft die Funktion unterhalb der x-Achse, so ist der Flächeninhalt negativ. Testen Sie beide Funktionen, indem Sie die Ober- und Untersumme für die Funktion g(x) = x3 + 4 · x + 2000 im Intervall [−15, 15] mit 10.000 Streifen berechnen. Aufgabe 3 (25 Punkte) a) Implementieren Sie in Haskell jeweils einen Summentypen – Wochentag, wobei Werte von diesem Typ Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag sind. (4 Punkte) – Monat, mit den Werten Januar, Februar, Maerz, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember. (4 Punkte) b) Implementieren Sie anschließend einen Datentyp Datum, der Jahr, Monat, Tag und Wochentag speichern soll. Tage und Jahre können Sie durch Verwendung des Typs Int repräsentieren, Monate und Wochentage sollen durch Verwendung der in Aufgabenteil a) implementierten Datentypen repräsentiert werden. Geben Sie Ihr Geburtsdatum mit dem Datentypen an. (7 Punkte) c) Implementieren Sie in Haskell auf dem Datentyp Datum, die Selektoren – tag :: Datum -> Int, die für ein gegebenes Datum den Tag zurück liefert. – wochentag :: Datum -> Wochentag, die für ein gegebenes Datum den Wochentag zurück liefert. – jahr :: Datum -> Int, die für ein gegebenes Datum das Jahr zurück liefert. – monat :: Datum -> Monat, die für ein gegebenes Datum den Monat zurück liefert. (10 Punkte) 2