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 2017 Aufgabenblatt Nr. 1 Abgabe: Mittwoch 26. April 2017 vor! der Vorlesung Aufgabe 1 (0 Punkte) Lesen Sie die Allgemeinen Hinweise“ auf der Webseite zur Vorlesung: ” http://www.informatik.uni-frankfurt.de/~prg2/SS2017/#Aufgaben Aufgabe 2 (10 Punkte) Implementieren Sie eine Funktion berechneNote in Haskell, die len klausurpunkte und bonuspunkte erhält und zunächst prüft, punkte übergeben wurden, und prüft, ob nicht mehr als 100 den. Sollte einer der Tests nicht erfüllt sein, geben Sie eine die (vordefinierte) Funktion error mit einer Zeichenkette als error "Mehr als 20 Bonuspunkte koennen nicht angerechnet als Eingaben zwei Kommazahob nicht mehr als 20 BonusKlausurpunkte übergeben wurFehlermeldung aus, indem Sie Argument aufrufen, also z.B. werden". Sollten beide Tests erfüllt sein, so soll berechneNote die beiden Punktzahlen addieren und die Note berechnen. Wie sich die Note genau berechnet ist Ihnen bereits aus Aufgabe 1 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. Diese Aufgabe beschäftigt sich mit dem Zwei-Personen-Spiel Floßversenken. Ein Spielfeld entspricht einer quadratischen Matrix, die durch eine zweistellige Funktion f modelliert wird, wobei f i j das Matrix-Element in Zeile i und Spalte j darstellt. Dabei steht ein Matrix-Element mit Wert 0 für Wasser, 1 für ein Floß des ersten Spielers und 2 für ein Floß des zweiten Spielers. Negative Funktionswerte werden allen Elementen zugeordnet, die außerhalb der Dimension der Matrix liegen. Im Gegensatz zum bekannten Schiffeversenken, spielen beide Spieler auf einem gemeinsamen Spielfeld, d.h. ein Floß nimmt genau ein Feld ein und auf einem Feld kann sich höchstens ein Floß befinden. Die folgende Funktion entspricht dem durch die danebenstehende Matrix dargestellten Spielfeld. spielfeldA spielfeldA spielfeldA spielfeldA spielfeldA spielfeldA spielfeldA spielfeldA spielfeldA spielfeldA 1 1 1 2 2 2 3 3 3 _ 1 2 3 1 2 3 1 2 3 _ = = = = = = = = = = 0 1 0 2 0 0 1 0 2 -1 0 1 0 A= 2 0 0 1 0 2 1 Beachten Sie, dass man im GHCi keine Funktion anzeigen kann. Zur Anzeige eines Spielfelds kann die Funktion zeigeSpielfeld verwenden werden, die in der Datei blatt1.hs definiert ist und für eine Zahl k und ein Spielfeld die Flöße des Spielers k anzeigt. 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 flossAufFeld, die als erstes Argument eine x-Koordinate, als zweites eine y-Koordinate und als drittes ein Spielfeld entgegennimmt und True genau dann zurückliefert, falls sich ein Floß auf dem entsprechenden Feld befindet. (5 Punkte) Beispielaufruf: *> flossAufFeld 1 2 spielfeldA True b) Implementieren und testen Sie in Haskell eine Funktion sehrSchlechteIdee, die als erstes Argument eine Zahl k für Spieler k, als zweites eine x-Koordinate, als drittes eine y-Koordinate und als viertes ein Spielfeld entgegennimmt und True genau dann zurückliefert, falls sich ein Floß des Spielers k auf dem entsprechenden Feld befindet. (5 Punkte) Beispielaufruf: *> sehrSchlechteIdee 1 1 2 spielfeldA True c) Implementieren und testen Sie in Haskell eine Funktion bombeAuf, die als erstes Argument eine x-Koordinate, als zweites eine y-Koordinate und als drittes ein Spielfeld entgegennimmt und das Spielfeld zurückliefert, nachdem auf das Feld mit Koordinate (x, y) eine Bombe geworfen wurde. Tipp: Das Ergebnis von bombeAuf ist eine Funktion mit zwei Argumenten. Hier bietet sich eine anonyme Funktion, also eine Funktion ohne Namen an: (\a b -> ...) Unter welchen Bedingungen sind die Werte des gegebenen Spielfelds zu übernehmen? (5 Punkte) Beispielaufrufe: *> zeigeSpielfeld 1 (bombeAuf 1 2 spielfeldA) 000 000 100 *> (bombeAuf 1 2 spielfeldA) 1 2 0 d) Implementieren und testen Sie in Haskell eine Funktion spielfeldGroesse, welche die Dimension eines Spielfelds berechnet. Eine rekursive Hilfsfunktion kann nützlich sein. (5 Punkte) Beispielaufruf: *> spielfeldGroesse spielfeldA 3 e) Implementieren und testen Sie in Haskell eine Funktion anzahlFloesse, die als erstes Argument eine Zahl k für Spieler k und als zweites ein Spielfeld entgegennimmt und die Anzahl der Flöße des Spielers k auf dem Spielfeld zurückliefert. (5 Punkte) Beispielaufruf: *> anzahlFloesse 1 (bombeAuf 1 2 spielfeldA) 1 f) Implementieren und testen Sie in Haskell eine Funktion ergebnis, die für ein Spielfeld 0 zurückliefert, falls beide Spieler noch Flöße auf dem Spielfeld haben, 1 falls Spieler 2 keine Flöße mehr auf dem Spielfeld hat und 2 falls Spieler 1 keine Flöße mehr auf dem Spielfeld hat. (5 Punkte) Beispielaufruf: *> ergebnis (bombeAuf 3 3 (bombeAuf 2 1 spielfeldA)) 1 2