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 2016 Aufgabenblatt Nr. 1 Abgabe: Mittwoch 20. April 2016 vor! der Vorlesung Aufgabe 1 (0 Punkte) Lesen Sie die Allgemeinen Hinweise“ auf der Webseite zur Vorlesung: ” http://www.informatik.uni-frankfurt.de/~prg2/SS2016/#Aufgaben Aufgabe 2 (10 Punkte) Implementieren Sie eine Funktion bonuspunkte 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 genau 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. Testen Sie die Funktion anschließend mit sinnvollen Werten. Die Regeln zur Anrechnung der Bonuspunkte sind Ihnen aus Aufgabe 1 schon bekannt. Aufgabe 3 (30 Punkte) In dieser Aufgabe machen wir davon Gebrauch, dass Haskell Funktionen höherer Ordnung unterstützt, daher können Funktionen (genau wie Daten) als Ein- und als Ausgabe von anderen Funktionen verwendet werden. Eine Matrix wird durch eine zweistellige Funktion f modelliert, wobei f i j das Matrix-Element in Zeile i und Spalte j darstellt. Die Matrizen sind stets quadratisch und alle Matrix-Elemente sind nichtnegative ganze Zahlen. Negative Funktionswerte werden allen Elementen zugeordnet, die außerhalb der Dimension der Matrix liegen. Die folgende Funktionen stellen die Matrizen auf der folgende Seite dar. matrixA matrixA matrixA matrixA matrixA matrixA matrixA matrixA matrixA matrixA 1 1 1 2 2 2 3 3 3 _ 1 2 3 1 2 3 1 2 3 _ = = = = = = = = = = 0 42 1337 501 314 301 13 161 271 -1 matrixB matrixB matrixB matrixB matrixB matrixB matrixB matrixB matrixB matrixB 1 1 1 1 2 2 2 3 3 3 _ 1 2 3 1 2 3 1 2 3 _ = = = = = = = = = = 1 2 3 4 5 6 7 8 9 -1 0 42 1337 A = 501 314 301 13 161 271 1 2 3 B= 4 5 6 7 8 9 Beachten Sie, dass man im GHCi keine Funktion anzeigen kann. Zur Anzeige einer Matrix kann die Funktion showMatrix verwenden werden, die in der Datei blatt1.hs definiert ist. Diese Datei findet sich beim Aufgabenblatt 1 auf der Webseite zur Vorlesung. Die Verwendung von Listenfunktionen und Listensyntax ist bei allen Teilaufgaben verboten. a) Implementieren und testen Sie in Haskell eine Funktion matrixIdentity, welche die EinheitsMatrix mit vorgegebener Dimension als Funktion darstellt. Dabei wird die Dimension durch das erste Argument festgelegt. (6 Punkte) Beispielaufrufe: *> showMatrix (matrixIdentity 4) 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 *> (matrixIdentity 3) 1 1 1 b) Implementieren und testen Sie in Haskell eine Funktion matrixDimension, welche die Dimension einer Matrix berechnet. Tipp: Eine rekursive Hilfsfunktion kann nützlich sein. Beispielaufrufe: (6 Punkte) *> matrixDimension matrixA 3 *> matrixDimension matrixB 3 c) Implementieren und testen Sie in Haskell eine Funktion matrixAdd, die zwei Matrizen komponentenweise addiert, wobei die Dimension der beiden Matrizen gleich ist. (6 Punkte) Beispielaufrufe: *> showMatrix (matrixAdd matrixA matrixB) 1 44 1340 505 319 307 20 169 280 *> (matrixAdd matrixA matrixB) 3 2 169 d) Implementieren und testen Sie in Haskell eine Funktion matrixTrace, welche die Summe der Hauptdiagonalelemente (Spur) einer Matrix berechnet. (6 Punkte) Beispielaufrufe: *> matrixTrace matrixB 15 *> matrixTrace (matrixIdentity 300) 300 e) Implementieren und testen Sie in Haskell eine Funktion matrixMaximum, die das größte Element einer Matrix berechnet. (6 Punkte) Beispielaufrufe: *> matrixMaximum (matrixIdentity 50) 1 *> matrixMaximum matrixB 9 2