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 2013 Aufgabenblatt Nr. 3 Abgabe: Mittwoch 08. Mai 2013 vor! der Vorlesung Aufgabe 1 (30 Punkte) Verwenden Sie im Wesentlichen elem, tail, map, filter, concat und length, um die folgenden Funktionen zur Listenverarbeitung in Haskell zu programmieren: a) Eine Funktion, die eine Liste von Zahlen erhält und zunächst alle Zahlen größer gleich 500 entfernt und anschließend alle verbleibenden Zahlen quadriert. Z.B. soll für [1,3,10,30,90,500,1000,3000] das Ergebnis [1,9,100,900,8100] berechnet werden. (7 Punkte) b) Eine Funktion, die eine Liste von (nicht-leeren) Strings1 erhält, das jeweils erste Zeichen der Strings entfernt, anschließend alle Strings entfernt, die mit ’A’ oder ’a’ anfangen und schließlich die erhaltenen Strings aneinanderhängt, so dass ein einziger String entsteht. Z.B. soll für ["Baum", "Haus", "Affe", "Haskell", "Informatik"] das Ergebnis "ffenformatik" berechnet werden. (7 Punkte) c) Eine Funktion, die eine Liste von Listen von Strings erhält und die inneren Listen von Strings jeweils zu einem String zusammenhängt und anschließend in der erhaltenen Liste von Strings, ausschließlich jene Strings in die Ausgabe übernimmt, die mindestens 10 Zeichen lang sind. Z.B. soll für [["Maus","Laus","Haus"],["Affe","Haus"],["Apfel","Maus"],["Banane","Katze"]] das Ergebnis ["MausLausHaus","BananeKatze"] lauten. (7 Punkte) d) Eine Funktion, die eine Liste von Strings erhält und – alle Strings entfernt, die ? oder ! enthalten, und – alle Kleinbuchstaben zu Großbuchstaben macht. Z.B. soll bei Eingabe ["Programmierung 2", "Informatik?", "Haskell!", "PRG-2"] die Ausgabe ["PROGRAMMIERUNG 2","PRG-2"] lauten. (9 Punkte) Hinweis: Die Bibliothek Data.Char beinhaltet die Funktionen isUpper, isLower, toUpper, toLower, die Sie in Ihrer Lösung verwenden dürfen. Auch die Funktion elem aus der Bibliothek Data.List könnte hilfreich sein. Sie können die Bibliotheken durch import Data.Char import Data.List am Anfang des Quelltextes in Ihr Programm einbinden. 1 Strings sind in Haskell nichts anderes als Listen von Zeichen, d.h. "Haskell" ist nur eine andere Darstellung für die Liste [’H’,’a’,’s’,’k’,’e’,’l’,’l’] 1 Aufgabe 2 (30 Punkte) (10 Punkte pro Teilaufgabe) Wir betrachten erneut (m × m) Matrizen (m > 0), die mit Zahlen aus {1, . . . , m} gefüllt sind (siehe Aufgabenblatt 1). Im Gegensatz zu Aufgabenblatt 1 sei eine (m×m)-Matrix jedoch durch eine Liste von Listen von Zahlen dargestellt, so dass • die äußere Liste als Elemente die Zeilen der Matrix von oben nach unten enthält; • jede innere Liste eine Zeile der Elemente von links nach rechts repräsentiert, d.h. sie ist eine Liste von m Zahlen. Ein Beispiel für eine (3 × 3)-Matrix und die passende Listendarstellung in Haskell ist: 1 2 3 1 2 1 2 2 2 2 3 3 2 1 1 matrix :: [[Int]] matrix = [[2,1,2] ,[2,2,3] ,[2,1,1]] a) Implementieren Sie in Haskell eine Funktion anzahlKartenMitZahl :: Int -> [[Int]] -> Int die eine Zahl i und eine Matrix erhält und als Ergebnis die Anzahl der Vorkommen der Zahl i in der Matrix berechnet. b) Implementieren Sie eine Funktion istGueltig :: erhält und prüft, [[Int]] -> Bool, die eine Matrix – ob diese genauso viele Zeilen wie Spalten enthält. – ob alle Zeilen gleich viele Elemente enthalten. Tipp: Die Funktion all aus der Bibliothek Data.List könnte hilfreich sein. c) Implementieren Sie eine Funktion fuelleMatrix :: Int -> [Int] -> [[Int]], die eine Zahl m und eine Liste zs von Zahlen erhält und daraus eine (m×m)-Matrix erstellt, indem Sie von oben links beginnend die Zahlen aus zs zeilenweise in die Matrix einfügt. Enthält zs mehr als m2 Zahlen, so werden die verbleibenden Zahlen verworfen. Enthält zs weniger als m2 Zahlen, so werden die fehlenden Einträge der Matrix mit 1en gefüllt. Beispiele für alle Teilaufgaben: anzahlKartenMitZahl 1 matrix anzahlKartenMitZahl 2 matrix anzahlKartenMitZahl 3 matrix istGueltig [[1,2],[3,4]] istGueltig [[1,2],[3,4],[5,6]] istGueltig [[1,2,3],[4,5,6]] istGueltig [[1,2],[4,5,6]] istGueltig [[1,2,3],[4,5]] fuelleMatrix 3 [1,10,100,4,5,6,7,8,9] fuelleMatrix 2 [1,10,100,4,5,6,7,8,9] fuelleMatrix 3 [1,2,3,4] → → → → → → → → → → → 2 3 5 1 True False False False False [[1,10,100],[4,5,6],[7,8,9]] [[1,10],[100,4]] [[1,2,3],[4,1,1],[1,1,1]] Aufgabe 3 (40 Punkte) a) Implementieren Sie in Haskell eine Funktion ersetze :: String -> String -> String -> String die ein Suchwort, ein Ersatzwort und einen Text erhält, und im Text alle Auftreten des Suchwortes durch das Ersatzwort ersetzt. Tipp: Die Funktion isPrefixOf aus der Bibliothek Data.List könnte hilfreich sein. (12 Punkte) b) Implementieren Sie eine weitere Funktion ersetzeJedesMalAnders :: String -> [String] -> String -> String die anstelle des Ersatzwortes eine Liste von Ersatzworten erhält, und das 1. Auftreten des Suchwortes durch das 1. Ersatzwort, das 2. Auftreten des Suchwortes durch das 2. Ersatzwort, usw. ersetzt. (13 Punkte) c) Implementieren Sie eine weitere Funktion ersetzeMehrere :: [String] -> [String] -> String -> String die eine Liste von Suchworten, eine Liste von Ersatzworten und einen Text erhält, und jedes Auftreten des i. Suchwortes mit dem i. Ersatzwort ersetzt. Niemals wird dabei in einem eingesetzten Ersatzwort nochmals ersetzt. Bei Konflikten soll das jeweils weiter vorne in der Liste von Suchworten stehende Suchwort ersetzt werden. Tipp: Die Funktion any aus der Bibliothek Data.List könnte hilfreich sein. (15 Punkte) Beispiele für alle Teilaufgaben: > ersetze "aus" "und" "Haus mit Maus ist raus" "Hund mit Mund ist rund" > ersetzeJedesMalAnders "aus" ["und","ann","iesig"] "Haus mit Maus ist raus" "Hund mit Mann ist riesig" > ersetzeMehrere ["Hau","Haus","Maus"] ["Mau","Hund","Haus"] "Haus mit Maus ist raus" "Maus mit Haus ist raus" 3