Aufgabe 2 - Goethe

Werbung
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
Herunterladen