Grundlagen der Programmierung 2 Aufgabenblatt Nr. 1 Aufgabe 1

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 2014
Aufgabenblatt Nr. 1
Abgabe: Mittwoch 23. April 2014 vor! der Vorlesung
Aufgabe 1 (10 Punkte)
Implementieren Sie eine Funktion bonuspunkte in Haskell, die 24 Eingaben erhält und die anrechenbaren Bonuspunkte für die PRG-2-Klausur berechnet, wobei
• die ersten zwölf Eingaben Kommazahlen sind, die die erreichten Punkte für die Aufgabenblätter
1 bis 12 angeben.
• die letzten zwölf Eingaben Wahrheitswerte (True oder False) sind, die jeweils angeben, ob in
der Übung zum entsprechenden Blatt vorgerechnet wurde.
Die Regeln zur Anrechnung der Bonuspunkte können Sie den Allgemeinen Hinweisen“ und den Folien
”
”
zum Organisatorischen“ von der Webseite zur Vorlesung
http://www.informatik.uni-frankfurt.de/~prg2/SS2014
entnehmen. Einige Beispielaufrufe sind
*> bonuspunkte 30 75 75 75 75
20.0
*> bonuspunkte 40 100 100 100
20.0
*> bonuspunkte 20 50 50 50 50
13.333333333333332
*> bonuspunkte 20 50 50 50 50
0.0
*> bonuspunkte 20 50 50 50 50
0.0
75 75 75 75 75 75 75 True False False False False False False False False False False True
100 100 100 100 100 100 100 100 True True True True True True True True True True True True
50 50 50 50 50 50 50 True False False False False False False True False False False False
50 50 50 50 50 50 50 True False False False False False False False False False False False
50 50 50 50 50 50 50 False False False False False False False False False False False True
Tipps: Wenn Sie möchten, können Sie Hilfsfunktionen definieren, die
• prüfen, ob sowohl in Teil 1 (Blatt 1 bis 7) und in Teil 2 (Blatt 8 bis 12) jeweils mindestens einmal
vorgerechnet wurde;
• die Punkte für Teil 1 und Teil 2 berechnen.
Diese Hilfsfunktionen können Sie dann innerhalb von bonuspunkte aufrufen.
Außerdem können Sie die Haskell-Funktion min verwenden, um das Minimum zweier Zahlen zu berechnen. Auch die Booleschen Verknüpfungen && (Und-Verknüpfung) und || (Oder-Verknüpfung),
könnten hilfreich sein.
1
Aufgabe 2 (30 Punkte)
Ein Lottoschein enthält Felder für die Zahlen von 1 bis 49. Ein Lottoschein ist gültig, wenn genau 6
der 49 Zahlen angekreuzt sind.
Ein Lottoschein sei in Haskell als Funktion modelliert, die als Eingabe eine Zahl (zwischen 1 und 49)
erwartet und True oder False liefert, jenachdem ob das entsprechende Feld angekreuzt ist oder nicht.
Ein Beispiel für einen Lottoschein auf dem die Zahlen 4, 13, 22, 27, 36 und 48 angekreuzt sind, ist
die folgende Funktion lottoschein1
lottoschein1
lottoschein1
lottoschein1
lottoschein1
lottoschein1
lottoschein1
lottoschein1
lottoschein1
::
4
13
22
27
36
48
_
Int -> Bool
= True
= True
= True
= True
= True
= True
= False
Implementieren Sie die folgenden Funktionen in Haskell:
(je 10 Punkte)
a) Eine Funktion
anzahlRichtige :: (Int -> Bool) -> Int -> Int -> Int -> Int -> Int -> Int -> Int,
die sieben Eingaben – einen Lottoschein als Funktion von Int nach Bool (wie oben erklärt)
und sechs (gezogene) Zahlen – erwartet und als Ausgabe die Anzahl der richtig angekreuzten
Zahlen liefert.
Tipp: Sie können eine Hilfsfunktion bool2int :: Bool -> Int implementieren, die bei Eingabe von True den Wert 1 und bei Eingabe von False den Wert 0 liefert.
Beispiele: Einige Beispielaufrufe (mit obigem Lottoschein) sind
*Main>
2
*Main>
3
*Main>
3
*Main>
0
anzahlRichtige lottoschein1 11 13 27 39 40 49
anzahlRichtige lottoschein1 11 13 27 39 40 48
anzahlRichtige lottoschein1 3 13 27 39 40 48
anzahlRichtige lottoschein1 5 10 15 20 25 30
b) Eine Funktion istGueltig :: (Int -> Bool) -> Bool, die einen Lottoschein als Funktion von
Int nach Bool erwartet und prüft, ob genau 6 Zahlen auf dem Lottoschein angekreuzt sind und
dementsprechend True (für Ja“) bzw. False (für Nein“) als Ergebnis liefert.
”
”
Tipp: Sie können alle 49 Felder nacheinander prüfen, aber kürzer wird das Programm, wenn Sie
Rekursion verwenden.
Beispiele: Sei
lottoschein2 x = if x <= 5 then True else False
lottoschein3 x = if x > 42 then True else False
2
Beispielaufrufe für istGueltig sind
*> istGueltig lottoschein1
True
*> istGueltig lottoschein2
False
*> istGueltig lottoschein3
False
c) Implementieren Sie eine allgemeinere Version von istGueltig, die nicht nur für 6 aus 49“
”
funktioniert: Implementieren Sie daher eine Funktion istGueltigAllgemein, die neben dem
Lottoschein zwei Zahlen als Eingaben erhält:
– Die Anzahl n der verfügbaren Zahlen 1, . . . , n auf dem Lottoschein.
– Die Anzahl m der anzukreuzenden Zahlen.
istGueltigAllgemein soll nun prüfen, ob genau m der n Zahlen auf dem Lottoschein angekreuzt
sind und dementsprechend True bzw. False liefern. Implementieren Sie anschließend istGueltig
aus Aufgabenteil b) erneut, indem Sie istGueltigAllgemein mit n = 49 und m = 6 aufrufen.
Tipp: Verwenden Sie Rekursion, um die Felder von 1 bis n auf dem Lottoschein zu überprüfen.
Beispiele:
*> istGueltigAllgemein
True
*> istGueltigAllgemein
False
*> istGueltigAllgemein
True
*> istGueltigAllgemein
False
*> istGueltigAllgemein
False
*> istGueltigAllgemein
True
lottoschein1 49 6
lottoschein1 49 7
lottoschein2 49 5
lottoschein2 49 6
lottoschein3 49 6
lottoschein3 49 7
3
Herunterladen