Einführung in die Informatik 2 3. Übung

Ähnliche Dokumente
Einführung in die Informatik 2 3. Übung

Einführung in die Informatik 2 4. Übung

Einführung in die Informatik 2

Musterlösung zur 2. Aufgabe der 4. Übung

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 5A. Lösung zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler)

Einführung in die Informatik 2 8. Übung

Einführung in die Informatik 2 6. Übung

Informatik B von Adrian Neumann

Einführung in die Informatik 2 7. Übung

Institut für Informatik

Einführung in die Informatik Übung

Funktionale Programmierung Grundlegende Datentypen

Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

Programmieren in Haskell Einstieg in Haskell

Programmieren in Haskell Programmiermethodik

Empfehlenswerte Referenzen

Programmieren in Haskell

Einführung in die funktionale Programmierung

Grundlagen: Algorithmen und Datenstrukturen

Einführung in die Theoretische Informatik

Softwareentwicklung II (IB) Blatt 2. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Prüfung Informatik D-MATH/D-PHYS :00 17:00

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 4A

Wissenschaftliches Rechnen

INFORMATIK FÜR BIOLOGEN

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 4A

TECHNISCHE UNIVERSITÄT MÜNCHEN. Abgabe: (vor der Vorlesung)

Die Korrektheit von Mergesort

Programmierkurs (Java) 30. Oktober 2017 Institut für Informatik ÜBUNGBLATT 02. Dieses Übungsblatt wird in der Woche des 06. November besprochen.

Binärbäume: Beispiel

Institut fu r Informatik

Projekt 3 Variablen und Operatoren

Institut für Informatik

Wiederholungsklausur "ADP" WS 2016/2017

Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom : Algebraische Datentypen

Grundlagen der Informatik

Kapitel 12: Induktive

FAKULTÄT FÜR INFORMATIK

Programmierkurs Java

Einführung in die Theoretische Informatik

WS 2015/16 Diskrete Strukturen Kapitel 3: Kombinatorik (3)

Induktion und Rekursion

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung

Einführung in die Theoretische Informatik

Tutoraufgabe 1 (Listen):

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

Übung zu Einführung in die Informatik # 11

Lösungshinweise/-vorschläge zum Übungsblatt 13: Software-Entwicklung 1 (WS 2017/18)

WS 2013/14. Diskrete Strukturen

1.) Zahlensysteme (10 Punkte)

Workshop Einführung in die Sprache Haskell

Tag 6. Module, benannte Funktionen und Rekursion

Diskrete Mathematik 1 WS 2008/09

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Programmierpraktikum

Einführung in die Theoretische Informatik

Tutoraufgabe 1 (Hoare-Kalkül):

Arrays. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Grundlagen der Theoretischen Informatik Musterlösungen zu ausgewählten Übungsaufgaben

Informatik I: Einführung in die Programmierung. Übungsblatt 3. Abgabe: Freitag, 15. November 2013, 18:00 Uhr

Klausur "ADP" SS 2016

Computeranwendung und Programmierung (CuP)

Aufgabe Mögliche Punkte Erreichte Punkte a b c d Σ a b c d Σ x1 13

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 5. Blatt Für den 26. und

Teil 4: Rekursion und Listen

Tutoraufgabe 1 (Programmanalyse):

Programmierpraktikum

Funktionale Programmierung

3. Übungsblatt zu Algorithmen I im SoSe 2017

Tutoraufgabe 1 (Auswertungsstrategie):

Übungen zur Vorlesung EidP (WS 2015/16) Blatt 6

Klausur "ADP" SS 2015

Vorlesung Datenstrukturen

WS 2011/2012. Georg Sauthoff 1. November 11, 2011

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

Typ-Polymorphismus. November 12, 2014

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Programmierkurs II. Typsynonyme & algebraische Datentypen

368 4 Algorithmen und Datenstrukturen

Proseminar String Matching

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Suchen. lineare Suche, binäre Suche, divide and conquer, rekursive und iterative Algorithmen, geordnete Daten, Comparable

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Funktionale Programmierung mit Haskell

WS 2011/2012. RobertGiegerich. November 12, 2013

WS 2011/2012. RobertGiegerich. November 12, 2013

Tag 2 Repetitorium Informatik (Java)

Humboldt-Universität zu Berlin Berlin, den Institut für Informatik

Tutoraufgabe 1 (Fibonacci-Zahlen):

Institut für Programmierung und Reaktive Systeme. Java 3. Markus Reschke

Einführung in die Theoretische Informatik

WS 2013/14. Diskrete Strukturen

Vorkurs Informatik WiSe 16/17

Tag 7. Pattern Matching und eigene Datentypen

Einführung in die Praktische Informatik. Übungsblatt 3. PD Dr. U. Köthe Heidelberg, 7. November Aufgabe 3.1 Gaußsche Osterregel [6 Punkte]

Transkript:

Technische Universität München WS 2014/15 Institut für Informatik 24.10.2014 Prof. Tobias Nipkow, Ph.D. Abgabe: 31.10.2014 L. Noschinski, L. Hupel, Dr. J. Blanchette, M. Eberl Einführung in die Informatik 2 3. Übung Aufgabe G3.1 Einfache Listenfunktionen Implementieren Sie per Rekursion über Listen die folgenden Funktionen: 1. Die Funktion snoc :: [a] -> a -> [a] nimmt eine Liste [x 1,..., x n ] und ein Element y und gibt die Liste [x 1,..., x n, y] zurück. Implementieren Sie diese Funktion ohne ++ zu verwenden. 2. Die Funktion member :: Eq a => a -> [a] -> Bool nimmt ein Element t und eine Liste [x 1,..., x n ] und liefert genau dann True zurück, wenn es ein 1 i n gibt mit x i = t. (Diese Funktion ist übrigens Teil vono Data.List unter dem Namen elem.) 3. Die Funktion butlast :: [a] -> [a] nimmt eine Liste [x 1,..., x n 1, x n ] und gibt die Liste [x 1,..., x n 1 ] zurück. Ist n = 0, so wird die leere Liste erwartet. Eine ähnliche Funktion ist übrigens Teil der Bibliothek Data.List unter dem Namen init. Aufgabe G3.2 Entfernen wiederholter Elemente 1. Schreiben Sie eine Funktion uniq :: Eq a => [a] -> [a], die aufeinanderfolgende gleiche Elemente entfernt. Zum Beispiel sollen die folgenden Gleichheiten gelten: uniq [] == [] uniq [1,2,2,1] == [1,2,1] uniq [1,2,3] == [1,2,3] uniq [1,1,4,1,1] == [1,4,1] Eine Hilfsfunktion vom Typ Eq a => a -> [a] -> [a] kann hilfreich sein. 2. Schreiben Sie eine Funktion uniqcount :: Eq a => [a] -> [(a, Integer)], die zusätzlich zählt, wie viele gleiche Elemente in der Eingabe aufeinander folgen. Zum Beispiel sollen die folgenden Gleichheiten gelten: uniqcount [] == [] uniqcount [1,2,3] == [(1,1),(2,1),(3,1)] uniqcount [1,2,2,1] == [(1,1),(2,2),(1,1)] uniqcount [1,1,4,1,1] == [(1,2),(4,1),(1,2)] Eine Hilfsfunktion vom Typ Eq a => (a, Integer) -> [a] -> [(a, Integer)] kann hilfreich sein.

Aufgabe G3.3 Trenner Implementieren Sie die folgenden Funktionen. 1. Die Funktion intersep :: a -> [a] -> [a] nimmt ein Element t (den Trenner) und eine Liste [x 1, x 2,..., x n ] und liefert die Liste [x 1, t, x 2, t,..., t, x n ] zurück, mit n 1 Trennern. Für n = 0 wird die leere Liste erwartet. Zum Beispiel: intersep, "" == "" intersep, "a" == "a" intersep, "ab" == "a,b" intersep, " abcdef " == "a,b,c,d,e,f" intersep 0 [3, 2, 1] == [3, 0, 2, 0, 1] (Diese Funktion ist übrigens Teil von Data.List unter dem Namen intersperse.) 2. Die Funktion andlist :: [[Char]] -> [Char] nimmt eine Liste von Wörtern [w 1, w 2,..., w n 1, w n ] und liefert im Allgemeinen den Text,,w 1, w 2,..., w n 1, and w n zurück, mit einem Komma vor dem,,and. 1 Es gibt aber Ausnahmen für n < 3: andlist [] == "" andlist [" Ayize "] == " Ayize " andlist [" Bhekizizwe ", " Gugu "] == " Bhekizizwe and Gugu " andlist [" Jabu ", " Lwazi ", " Nolwazi "] == " Jabu, Lwazi, and Nolwazi " andlist [" Phila ", " Sihle ", " Sizwe ", " Zama "] == " Phila, Sihle, Sizwe, and Zama " Aufgabe G3.4 Dreieck (optional) Gesucht ist eine polymorphe Funktion triangle :: [a] -> [(a, a)], die eine Liste von Werten [a 1,..., a n ] nimmt und die folgende n(n 1)/2-elementige Liste von Paaren zurückgibt: [ (a1, a 2 ), (a 1, a 3 ), (a 1, a 4 ),... (a 1, a n 1 ), (a 1, a n ), (a 2, a 3 ), (a 2, a 4 ),... (a 2, a n 1 ), (a 2, a n ), Zum Beispiel: (a 3, a 4 ),... (a 3, a n 1 ), (a 3, a n ),.... triangle [] == [] triangle [ 1111] == [] triangle [1, 2] == [(1, 2)] triangle [222, 11] == [(222, 11)] triangle [" AA", "AA "] == [(" AA", "AA ")] triangle [1, 2, 3] == [(1, 2), (1, 3), (2, 3)]. (a n 2, a n 1 ), (a n 2, a n ), (a n 1, a n ) ] triangle [3, 5, 7, 11] == [(3, 5), (3, 7), (3, 11), (5, 7), (5, 11), (7, 11)] 1 Dieses Komma heißt,,serial comma oder,,oxford comma und ist im Prinzip wahlfrei, wobei es bei amerikanischen Autoren sehr beliebt ist.

Die Funktion lässt sich sowohl rekursiv als auch mit Listenkomprehensionen schreiben. Schreiben Sie QuickCheck-Tests für Ihre Implementierung. Aufgabe H3.1 Einmal auffüllen, bitte! Wie Sie von der Vorlesungswebseite wissen, wird Haskell unter anderem gerne für Finanzsoftware eingesetzt. Für ein größeres Finanzsoftwareprojekt benötigen Sie zur Anzeige von Geldbeträgen unter anderem eine Funktion, die eine Liste von Zahlen von vorne mit Leerzeichen auffüllt, sodass alle Zahlen die gleiche Länge haben. padnumbers :: [ Integer ] -> [ String ] Die Funktion muss dabei folgende Voraussetzungen erfüllen: Die Ergebnisliste hat die gleiche Länge wie die Eingabeliste Alle Strings in der Ergebnisliste haben die gleiche Länge Der i-te Eintrag der Ergebnisliste ist, nach Entfernen des Paddings, die String-Repräsentation des i-ten Eintrags der Eingabeliste. 2 Das Padding darf hierbei nur am Anfang des Strings (bei nichtnegativen Zahlen) bzw. zwischen Vorzeichen und der Zahl selbst (bei negativen Zahlen) stattfinden. Beispiel: Für padnumbers [23, -42, 1337] wären z. B. folgende Ausgaben erlaubt: 3 [" 23", "- 42", " 1337 "] [" 23", "- 42", " 1337 "] Nicht erlaubt wären unter anderem: [" 23", "- 42", " 1337 "] [" 23", " -42", " 1337 "] ["+ 23", "- 42", " 1337 "] [" 023 ", "- 42", " 1337 "] [" 23 ", "- 42 ", " 1337 "] ["- 42", " 23", " 1337 "] [" 23", " 1337 "] Mit einer gewissen Skepsis haben Sie vernommen, dass die Implementierung dieser Funktion einem notorisch unzuverlässigen neuen Mitarbeiter zugeteilt wurde, der bis vor kurzem bei einer jetzt insolventen Finanzfirma gearbeitet hat. Zur Sicherheit wollen Sie daher QuickCheck-Tests schreiben, die sicher stellen, dass der Code keine Fehler enthält. Stellen Sie dabei, dass Ihr Test korrekt und vollständig ist. Korrekt bedeutet, dass der Test für keine Implementierung, die die obigen Voraussetzungen erfüllt, fehlschlägt. Vollständig bedeutet, 2 Mit String-Repräsentation ist hierbei der String gemeint, den show ausgibt also ohne führende Nullen, mit - als Vorzeichen für negative Zahlen und ohne Vorzeichen für nichtnegative Zahlen. 3 Ein steht hierbei für ein Leerzeichen.

dass der Test (theoretisch) jede falsche Implementierung erkennt, also dass es für jede falsche Implementierung Testparameter gibt, sodass der Test fehlschlägt. Hinweis: Es ist nicht gefordert und auch nicht notwendig für diese Aufgabe, die padnumbers- Funktion selbst zu implementieren. Sie müssen nur die Tests schreiben. In der Übungsschablone ist hierfür die Property prop_padnumbers vorgesehen, mit folgender Definition: prop_padnumbers padnumbers xs = undefined :: Bool Eine beispielhafte (aber unnütze) Implementation: prop_padnumbers padnumbers xs = 0 <= length ( padnumbers xs) Sie sehen hier, dass die Funktion padnumbers sowohl links als auch rechts vom Gleichheitszeichen steht. Das können Sie getrost ignorieren verwenden Sie padnumbers einfach wie eine gewöhnliche Funktion. Aufgabe H3.2 Zeilen im Umbruch Implementieren Sie eine Funktion wraptext :: Integer -> [String] -> String. Der Aufruf wraptext n ws soll die Liste von Wörtern ws zu einem Text formatieren. Ein Wort besteht dabei aus beliebigen Zeichen, die kein Leersymbol sind (vgl. isspace :: Char -> Bool aus Data.Char). Dabei sollen die folgenden Regeln beachtet werden: Die Reihenfolge der Wörter wird beibehalten. Wörter werden nicht getrennt. Zwischen zwei Wörtern steht genau ein Leerzeichen(` `) oder ein Zeilenumbruch (`\n`). Besteht eine Zeile aus zwei oder mehr Wörtern, so besteht sie aus höchstens n Zeichen (ohne den abschließenden Zeilenumbruch). Jede Zeile ist so lang wie möglich. Entfernt man den abschließenden Zeilenumbruch, so hat eine Zeile keine Leersymbole am Anfang oder Ende. Aufgabe H3.3 Stretch-Bilder Wie aus der Vorlesung bekannt, werden Bilder (Typ Picture) durch Listen von Strings dargestellt. In der Übungsschablone finden Sie die Definition eines Beispielbildes pic = [".##.", ".#.#", ".###", "####"] sowie der Funktion printpicture :: Picture -> IO (), die Sie als Black-Box für die zweidimensionale Ausgabe von Bildern im Interpreter nutzen können. Zum Beispiel:

> printpicture pic.##..#.#.### #### Sie sollen eine Funktion stretch :: Picture -> Picture definieren, die ein Bild auf das zweifache vergrößert. Zum Beispiel: > printpicture ( stretch pic )..####....####....##..##..##..##..######..###### ######## ######## Wie im Beispiel zu sehen ist, sollen die existierenden Pixel vervierfacht werden. Sie dürfen annehmen, dass die Eingabebilder rechteckig sind, d.h. jede Zeile hat die gleiche Länge. Die Ausgabe muss ebenso rechteckig sein. Aufgabe H3.4 Grüppchenbildung (Wettbewerbsaufgabe) Der MC hat diese Woche schon wieder Probleme bei der Punkteberechnung. Wie letzte Woche bereits erwähnt wurde, speichert er die Punkte für den Wettbewerb als Assoziationslisten vom Typ [(String, Integer)]. Beim Berechnen der Gesamtpunktzahl aus den Punkten für die einzelnen Blätter hat er nun eine Liste der Form [(" A",23), ("A",42), ("B",13), ("C",36), ("C",32), ("C",20)] Er will nun jeweils alle adjazenten Elemente mit gleichem Schlüssel zusammenfügen und dabei die Punkte addieren, also: [(" A",65), ("B",13), ("C",88)] Schreiben Sie hierfür eine Funktion coalesce :: [( String, Integer )] - > [( String, Integer )] die dies leistet. Beachten Sie, dass nur adjazente Elemente zusammengefügt werden sollen; eine Liste wie [("A",1), ("B",2), ("A",3)] würde von coalesce nicht verändert werden. Für den Wettbewerb zählt die Tokenanzahl (je kleiner, desto besser; siehe Aufgabenblatt 1). Lösungen, die gleichwertig bezüglich der Tokenanzahl sind, werden im Hinblick auf ihre Effizienz

verglichen. Die vollständige Lösung (außer import-direktiven) muss innerhalb von Kommentaren {-WETT-} und {-TTEW-} stehen. Wichtig: Wenn Sie diese Aufgabe als Wettbewerbsaufgabe abgeben, stimmen Sie zu, dass Ihr Name ggf. auf der Ergebnisliste auf unserer Internetseite veröffentlicht wird. Sie können diese Einwilligung jederzeit widerrufen, indem Sie eine Email an fp@fp.in.tum.de schicken. Wenn Sie nicht am Wettbewerb teilnehmen, sondern die Aufgabe allein im Rahmen der Hausaufgabe abgeben möchten, lassen Sie bitte die {-WETT-}... {-TTEW-} Kommentare weg. Bei der Bewertung Ihrer Hausaufgabe entsteht Ihnen hierdurch kein Nachteil.