Grundlagen der Programmierung 2 Aufgabenblatt Nr. 3 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 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
Herunterladen