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