Einführung in die Informatik 2

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

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Funktionen höherer Ordnung

Funktionale Programmierung mit Haskell

Programmieren in Haskell

Programmieren in Haskell Programmiermethodik

Allgemeine Hinweise:

Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin

expr :: Expr expr = Mul (Add (Const 3) (Const 4)) (Div (Sub (Const 73) (Const 37)) (Const 6))

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

Tutoraufgabe 1 (Datenstrukturen in Haskell):

Tag 7. Pattern Matching und eigene Datentypen

PIWIN 1 Übung Blatt 5

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

Programmieren in Haskell

Musterlösung zur Hauptklausur Theoretische Grundlagen der Informatik Wintersemester 2013/14

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Programmtransformationen und Induktion in funktionalen Programmen

Übung Datenstrukturen. Objektorientierung in C++

Haskell. A Wild Ride. Sven M. Hallberg. sm@khjk.org. 21C3 Berlin / Bildungswerk Hamburg p. 1/36

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

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

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Verkettete Datenstrukturen: Bäume

Tag 8. Beispiel: Tabellen formatieren

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

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

Probeklausur der Tutoren

2. Schriftliche Leistungskontrolle (EK)

Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

TheGI 1: Grundlagen und algebraische Strukturen Prof. Dr.-Ing. Uwe Nestmann Februar Schriftliche Leistungskontrolle (EK)

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

[10] Software Transactional Memory in Haskell, Tortenwurf und Aufgabenblatt 7

Grundlagen der Programmierung 2. Bäume

Klausur: Programmierkurs 1, Java, HTML

Musterlösung. TECHNISCHE UNIVERSITÄT MÜNCHEN Fakultät für Mathematik. Klausur Mathematik für Physiker 3 (Analysis 2) I... II...

Klausur zur Vorlesung Höhere Mathematik I

Einführung in die Programmierung

Klausur zum Kurs Betriebssysteme (1802) am 19. September 2009

Hochschule München, FK 03 SS Masterstudiengang Technische Berechnung und Simulation. Programmierung von CAx-Systemen Teil 1

Frage, Fragen und nochmals Fragen

Universität Karlsruhe Institut für Theoretische Informatik. Klausur: Informatik III

Weitere Operationen auf neu deklarierten Typen: Begriffsklärung: Weitere Anwendungen der datatype-deklaration: Beispiel: (Aufzählungstypen)

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Übungen zu Programmierung I - Blatt 8

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Grundprinzipien der funktionalen Programmierung

"Einführung in die Programmierung" Krefeld, den 24. September 2013

Klausur Algorithmen und Datenstrukturen

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Programmieren in Haskell

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

Vorname:... Matrikel-Nr.:... Unterschrift:...

Tutorium - Haskell in der Schule. Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli

Vorsemesterkurs Informatik

Vorsicht bei redundanten und unvollständigen Matches!

Einführung in die Theoretische Informatik

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 1 -

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Allgemeine Informatik 2 im SS 2007 Programmierprojekt

Musterlösung der Hauptklausur zur Vorlesung Theoretische Grundlagen der Informatik Wintersemester 2012/13

Einstieg in die Informatik mit Java

1. Probeklausur zu Programmierung 1 (WS 07/08)

Theoretische Informatik: Berechenbarkeit und Formale Sprachen

Allgemeine Informatik II SS :30-13:30 Uhr

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Definieren Sie eine Funktion circlearea zur Berechnung der Fläche eines Kreises mit gegebenen Radius (Float).

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Modulprüfung BA 04 Mathematik: Grundlagen der Mathematik C: Geometrie, Elementare Algebra und Zahlentheorie

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Funktionale Programmierung

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Klausur zur Vorlesung Mathematische Grundlagen für Wirtschaftswissenschaftler

Buch-Add-Ons. Jürgen Bayer. Object Pascal-Tipps und Tricks. 1 Konvertieren und auf numerische Werte überprüfen 2

Übungen zur Vorlesung Funktionale Programmierung. Wintersemester 2012/2013 Übungsblatt 1

Einführung in die Theoretische Informatik

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

Typklassen, Eingabe und Monaden In Haskell

HS Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Modul Datenbanksysteme 2 Prüfung skizzenhaft SS Aug Name: Note:

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

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Grundlagen der Programmierung 2 (1.C)

Funktionale Programmierung

Vertraulich. Nachname: Vorname: Matrikel-Nummer: Studiengang: Datum: 30. Januar 2015

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

Basiskonzepte des Rechnerbetriebs

Programmieren in Haskell Felder (Arrays)

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

Klausur Informatik-Propädeutikum (Niedermeier/Hartung/Nichterlein, Wintersemester 2012/13)

Zahlen in Haskell Kapitel 3

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Strukturelle Rekursion und Induktion

Kapitel 3: Programmierung mit Kombinatoren

CGI Programmierung mit Ha. Markus Schwarz

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Grundlagen der Theoretischen Informatik

Transkript:

Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Lars Hupel, Lars Noschinski, Dr. Jasmin Blanchette Wintersemester 2013/14 Abschlussklausur 21. Februar 2014 Einführung in die Informatik 2 Name Vorname Studiengang Matrikelnummer................................ Diplom Inform. Bachelor BioInf. Lehramt Mathe................. Hörsaal Reihe Sitzplatz Unterschrift................................................................ Allgemeine Hinweise Bitte füllen Sie obige Felder in Druckbuchstaben aus und unterschreiben Sie! Bitte schreiben Sie nicht mit Bleistift oder in roter/grüner Farbe! Die Arbeitszeit beträgt 120 Minuten. Alle Antworten sind in die geheftete Angabe auf den jeweiligen Seiten (bzw. Rückseiten) der betreffenden Aufgaben einzutragen. Auf dem Schmierblattbogen können Sie Nebenrechnungen machen. Der Schmierblattbogen muss ebenfalls abgegeben werden, wird aber in der Regel nicht bewertet. Es sind keine Hilfsmittel außer einem DIN-A4-Blatt zugelassen. Hörsaal verlassen von...... bis...... / von...... bis...... Vorzeitig abgegeben um...... Besondere Bemerkungen: Erstkorrektur Zweitkorrektur A1 A2 A3 A4 A5 A6 A7 A8 Σ Korrektor

Aufgabe 1 (6 Punkte) Geben Sie den allgemeinsten Typen der folgenden Ausdrücke an: 1. map reverse 2. map (: []) 3. \f (x,y) -> f x y 4. [(:[])] 5. zipwith (+) Weiterhin: 6. Warum ist es oft sinnvoller null xs statt xs == [] zu schreiben? 2

Aufgabe 2 (6 Punkte) Gegeben sei ein Datentyp zur Darstellung von Knoten in einem Dateisystem: data Node = File String Dir String [Node] Ein Knoten ist also entweder eine normale Datei (File) oder ein Verzeichnis (Dir). Knoten haben einen Namen (von Typ String). Zudem enthalten Verzeichnisse eine Liste von Knoten. Ein komplettes Dateisystem lässt sich als Liste von Knoten darstellen: Beispiel: type FileSys = [Node] myfilesys = [Dir "Applications" [Dir "Aquamacs.app" [File "Info.plist"], Dir "Scribus.app" [File "Info.plist"]], Dir "Library" [Dir "Automator" [], Dir "Logs" []], Dir "Users" [Dir "smith" [Dir "bugs" [File "Scratch.hs"], File "Scratch.hs"]]] Implementieren Sie eine Funktion removefiles :: String -> FileSys -> FileSys, die alle normalen Dateien mit dem angegebenen Namen auch in Unterverzeichnissen löscht (und sonst keine Änderungen vornimmt). 3

Aufgabe 3 (5 Punkte) Eine Collatz-Folge ist eine spezielle Folge von natürlichen Zahlen. Das Folgenglied c k+1 wird aus dem vorherigen Element c k wie folgt berechnet: { c k /2 falls c k gerade c k+1 = 3 c k + 1 falls c k ungerade Das erste Folgenglied c 0 kann eine beliebige natürliche Zahl n > 0 sein. Die Folge endet, wenn die Zahl 1 erreicht wird. Beispiel: Sei c 0 = 6. Die gesamte Folge ist dann 6, 3, 10, 5, 16, 8, 4, 2, 1. 1. Definieren Sie eine Funktion collatz :: Integer -> [Integer], die für einen gegebenen Startwert die zugehörige Collatz-Folge als Liste zurückgibt. 2. Implementieren Sie die Funktion unfold :: (a -> Maybe a) -> a -> [a]. Für einen Aufruf unfold f a soll die Funktion wiederholt f auf a anwenden und bei einem Ergebnis von Nothing abbrechen. Die Rückgabe ist die Liste sämtlicher Zwischenergebnisse, einschließich des Startwerts a. Beispiel: Für f a 0 = Just a 1, f a 1 = Just a 2,..., f a n = Nothing gilt: unfold f a 0 = [a 0, a 1,..., a n ] 3. Finden Sie eine Funktion next, so dass collatz n = unfold next n für n > 0 gilt. 4

Aufgabe 4 (3 Punkte) Gegeben sei eine Funktion factorize :: Int -> [Int], die eine positive Zahl n als Argument nimmt und eine Faktorisierung von n zurückgibt. Die Faktoren müssen nicht unbedingt Primzahlen sein. Sie müssen aber positiv sein, und 1 darf nicht als Faktor erscheinen. Beispiele: factorize ( -666) -- nicht definiert, beliebig factorize 1 == [] factorize 2 == [2] factorize 3 == [3] factorize 4 == [2, 2] oder [4] factorize 5 == [5] factorize 6 == [2, 3] oder [3, 2] oder [6] Wie die Beispiele zeigen darf die Funktion eine triviale, einelementige Liste von Faktoren erzeugen, auch wenn das Argument keine Primzahl ist. Schreiben Sie eine korrekte und vollständige QuickCheck-Testsuite für diese Funktion. Begründen Sie kurz Ihre Antwort. 5

Aufgabe 5 (6 Punkte) Gegeben seien folgende Definitionen: data T a = Tip a Node (T a) (T a) flip ( Tip a) = Tip a -- flip_tip flip ( Node t1 t2) = Node ( flip t2) ( flip t1) -- flip_node flat ( Tip a) = [a] -- flat_tip flat ( Node t1 t2) = flat t1 ++ flat t2 -- flat_node reverse [] = [] -- rev_nil reverse (x:xs) = reverse xs ++ [x] -- rev_cons [] ++ ys = ys -- app_nil (x:xs) ++ ys = x : (xs ++ ys) -- app_cons Beweisen Sie: flat ( flip t) = reverse ( flat t) Sie dürfen dabei das folgende Lemma verwenden: reverse ( xs ++ ys) = reverse ys ++ reverse xs -- rev_dist 6

Aufgabe 6 (6 Punkte) Wir betrachten das Streichholzspiel für zwei Spieler. Anfangs liegen 10 Streichhölzer auf dem Tisch. Jetzt nehmen die Spieler abwechselnd Streichhölzer vom Tisch (mindestens 1 und höchstens 5). Gewonnen hat der Spieler, der das letzte Streichholz nimmt. Definieren Sie eine IO-Aktion match :: IO (), die dieses Spiel implementiert. Vor jedem Zug sollen die Anzahl der verbleibenden Streichhölzer und der Spieler, der am Zug ist, angezeigt werden. Hat ein Spieler gewonnen, so soll das Programm dies anzeigen und sich selbst beenden. Das Program soll sicherstellen, dass der Spieler nur eine gültige Anzahl an Streichhölzern nimmt. Sind nicht mehr ausreichend viele Streichhölzer vorhanden, so werden alle Streichhölzer genommen. Sie können insbesondere die Funktionen putstrln :: String -> IO () zum Ausgeben und readln :: Read a => IO a zum Lesen der Eingabe verwenden. Streichhoelzer : 10. Spieler 1? 4 Streichhoelzer : 6. Spieler 2? 6 Eingabe muss zwischen 1 und 5 liegen. 5 Streichhoelzer : 1. Spieler 1? 1 Spieler 1 gewinnt! 7

Aufgabe 7 (3 Punkte) Geben Sie eine endrekursive Implementation der Funktion sum :: [Integer] -> Integer an, die die Summe der Elemente der übergebenen Liste berechnet. Außer den arithmetischen Basisoperationen dürfen keine vordefinierte Funktionen verwendet werden. 8

Aufgabe 8 (5 Punkte) Werten Sie die folgenden Ausdrücke Schritt für Schritt mit Haskells Reduktionsstrategie vollständig aus: 1. null nats && False 2. (\b -> False && b) (nats == nats) 3. h nats [1] wobei nats :: [ Int ] nats = 0 : map (1+) nats null :: [a] -> Bool null [] = True null _ = False (&&) :: Bool -> Bool -> Bool True && b = b False && _ = False h :: [a] -> [a] -> a h (x:xs) _ = x h _ (y:ys) = y Brechen Sie unendliche Reduktionen mit... ab, sobald Nichtterminierung erkennbar ist. 9