Aufgabenblatt 1 - Goethe

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