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

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

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

JAVA - Suchen - Sortieren

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

Tutoraufgabe 1 (2 3 4 Bäume):

Übung 9 - Lösungsvorschlag

Institut für Programmierung und Reaktive Systeme 24. Juni Programmieren II. 14. Übungsblatt

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Funktionale Programmierung mit Haskell

Abschnitt: Algorithmendesign und Laufzeitanalyse

Technische Universität München SoS 2005 Fakultät für Informatik 12. Oktober 2005 Prof. Dr. H. Seidl

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

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Allgemeine Hinweise:

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

Einschub: Anweisungen und Bedingungen für PAP und Struktogramme (1)

Technische Universität München SS 2006 Fakultät für Informatik 12. Oktober 2006 Prof. Dr. A. Knoll. Aufgabe 1 Transferfragen (Lösungsvorschlag)

Programmierkurs Java

Abgabe: (vor 12 Uhr) Aufgabe 3.1 (P) Kontrollflussgraph. Zeichnen Sie für das folgende MiniJava-Programm den Kontrollflussgraphen.

Algorithmen und Datenstrukturen

Programmieren I. Kapitel 7. Sortieren und Suchen

Abgabe: (vor 12 Uhr)

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

Kostenmaße. F3 03/04 p.188/395

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Informatik II Musterlösung

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

Fortgeschrittene Programmiertechnik Klausur WS 2014/15 Angewandte Informatik Bachelor

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

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

Übungen zu Programmierung I - Blatt 8

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

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

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

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

Grundlagen der Programmierung 2. Sortierverfahren

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

Datenstrukturen und Algorithmen

Klausur Datenstrukturen und Algorithmen SoSe 2012

Einführung in die Programmierung

Objektorientierte Programmierung

Programmierung 1 Probeklausur zur Vorklausur

Vorlesung Programmieren

Informatik B von Adrian Neumann

Die Programmiersprache C Eine Einführung

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

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

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

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Höhere Programmierkonzepte Testklausur

Kapitel 6 Elementare Sortieralgorithmen

Einführung in die Programmierung Vorlesungsprüfung

Vorkurs Informatik WiSe 16/17

Vorsicht bei redundanten und unvollständigen Matches!

Inf 12 Aufgaben

Gebundene Typparameter

Algorithmik Übung 3 Prof. Dr. Heiner Klocke. Sortierfolge nach Werten: Bube Dame König As nach Farben: Karo ( ) Herz ( ) Piek ( ) Kreuz ( )

Grundlagen der Programmierung WS 15/16 (Vorlesung von Prof. Bothe)

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

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

2. Methoden. n Generelles zum Aufruf von Methoden. n Parameterübergabemechanismen (call by value, call by reference)

Programmieren in Haskell Programmiermethodik

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

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

EndTermTest PROGALGO WS1516 A

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Frage, Fragen und nochmals Fragen

Informatik I WS 07/08 Tutorium 24

Datenstrukturen und Algorithmen

Klausur Informatik B April Teil I: Informatik 3

Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen:

C++ Templates - eine kleine Einführung. Allgemein. Funktionstemplates. Allgemein. Funktionstemplates. Klassentemplates

Einführung in die Informatik 2

Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:

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

MB2-ALG, SS15 Seite 1 Hauptklausur, geschrieben am

WS 2009/10. Diskrete Strukturen

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

Funktionale Programmierung

JAVA - Rekursion

Objektorientierte Programmierung

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

Java Kurs für Anfänger Einheit 5 Methoden

Web-Anwendungsentwicklung mit dem Delivery Server

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Übungsblatt 3: Algorithmen in Java & Grammatiken

Probeklausur der Tutoren

Aufgabenblatt Nr. 5 Generizität und TicTacToe

II.3.1 Rekursive Algorithmen - 1 -

Algorithmen und Datenstrukturen

PIWIN 1 Übung Blatt 5

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

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

Tutorium 5 - Programmieren

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Diskrete Strukturen Kapitel 1: Einleitung

Transkript:

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2008/09 Einführung in die Informatik 2 Übungsblatt 6 Prof. Dr. Helmut Seidl, T. M. Gawlitza, S. Pott, M. Schwarz 18.11.2008 Abgabe: 25.11.2008 (vor der Vorlesung) Aufgabe 6.1 (H) Rekursive Funktion Gegeben sei folgendes MiniJava-Programm: i n t x, y ; void l o g ( ) { i f ( x! = 1 ) { i f ( x%2==0) { x=x / 2 ; l o g ( ) ; y=y +1; { x=x 1; l o g ( ) ; { y =0; a) Erstellen Sie das Kontrollfluss-Diagramm für die Prozedur log()! b) Zeigen Sie die Gültigkeit des Tripels {1 2 m x < 2 m+1 log(); {y = m, wobei m eine logische Variable ist. c) Übersetzen Sie die Funktion log() möglichst genau in OCaml. Lösungsvorschlag 6.1 a) s. b) b) Wir setzen: V : 1 2 m x < 2 m+1 N : y = m Wir erstellen zunächst das Kontrollfluß-Diagramm:

2 log() V G x!=1? F y = 0; E x%2==0; C x = x-1; x = x/2; D B log(); log(); A y = y+1; N Stop Los geht s: WP y = 0; (N) m = 0 : G WP y = y + 1; (N) y = m 1 : A Wir setzen: B : 1 2 m 1 x < 2 m D : 1 2 m x < 2 m+1 Weiter geht s: WP x = x/2; (B) 1 2 m 1 x div 2 < 2 m 2 2 m x < 2 m+1 : C WP x = x 1; (D) 1 2 m x 1 < 2 m+1 : E Die Verzweigungen: WP x%2 == 0; (E, C) ((x mod 2 = 1) (1 2 m x 1 < 2 m+1 )) ((x mod 2 = 0) (2 2 m x < 2 m+1 )) 1 2 m x < 2 m+1 x 1 : F WP x!=1 (G, F) ((x = 1) (m = 0)) ((x 1) (1 2 m x < 2 m+1 )) (1 2 m x < 2 m+1 ) V Dabei ist zu beachten:

3 i) Das Tripel {Blog(); {A ist gültig, da B V[m 1/m] und A N[m 1/m] gelten. Es ist also durch Substitution der logischen Variablen m durch den Term m 1, der keine Programmvariablen enthält, entstanden. ii) Das Tripel {Dlog(); {N ist gültig, da D V gilt. l e t rec l o g x = i f x <> 1 then i f ( x mod 2 = 0) then 1 + l o g ( x / 2 ) 0 l o g ( x 1)

4 Aufgabe 6.2 (H) Finanzmärkte In dieser Aufgabe wird Aufgabe 5.6 fortgeführt. Dabei wird davon ausgegangen, dass jedes Wertpapier höchstens einmal in einem Portfolio vorkommt. Beispielsweise ist das Portfolio c) [(2,{bez= RWE ;wert=66);(3,{bez= RWE ;wert=66); (911,{bez= PORSCHE ;wert=60)] nicht erlaubt. Das Portfolio [(5,{bez= RWE ;wert=66);(911,{bez= PORSCHE ;wert=60)] ist hingegen erlaubt. Berücksichtigen Sie dies in den nachfolgenden Teilaufgaben. a) Schreiben Sei eine Funktion add_wertpapier. Der Aufruf add_wertpapier a w p soll a viele w-wertpapiere zum Portfolio p hinzufügen. Dabei sollen doppelte Einträge vermieden werden. Beispiel: Für p = [(2,{bez= RWE ;wert=66);(911,{bez= PORSCHE ;wert=60)] liefert der Aufruf den Wert add_wertpapier 5 {bez= RWE ;wert=66 p p = [(7,{bez= RWE ;wert=66);(911,{bez= PORSCHE ;wert=60)] zurück. b) Nutzen Sie die in Teil a) definierte Funktion add_wertpapier, um nachfolgend beschriebene Funktion union_portfolios zu definieren. Der Aufruf union_portfolios p1 p2 soll ein Portfolio liefern, das aus allen Wertpapieren beider Portfolios p1 und p2 besteht. c) Schreiben Sie eine Funktion wertaenderung. Der Aufruf wertaenderung bez d p soll ein Portfolio zurück liefern, das dem Portfolio p entspricht, bis darauf, dass der Wert des mit bez bezeichneten Wertpapiers um d Prozent erhöht ist. d) Schreiben Sie eine Funktion max, die dasjenige Wertpapier innerhalb eines Portfolios bestimmt, in das am meisten Geld investiert ist. Schreiben Sie diese Funktion einmal in einer nicht end-rekursiven Version und einmal in einer end-rekursiven Version.

5 Lösungsvorschlag 6.2 ( Loesungen von Aufgabe 5. 6 ) type w e r t p a p i e r = { bez : s t r i n g ; wert : i n t type kunde = { name : s t r i n g ; p o r t f o l i o : ( i n t w e r t p a p i e r ) l i s t l e t rec p o r t f o l i o w e r t = L i s t. f o l d _ l e f t ( fun s ( a,w) > s + a w. wert ) 0 l e t kundenwert k = p o r t f o l i o w e r t k. p o r t f o l i o l e t rec a n z a h l p r a e d i k a t k u n d e n _ l i s t e = match k u n d e n _ l i s t e with [ ] > 0 k : : ks > a n z a h l p r a e d i k a t ks + i f p r a e d i k a t k then 1 0 l e t f i l t e r = L i s t. f i l t e r l e t g r o s s k u n d e n = f i l t e r ( fun k > kundenwert k >= 1000000) ( Ab h i e r s i n d d i e Loesungen zu den Hausaufgaben ) l e t rec a d d _ w e r t p a p i e r a w p = match p with [ ] > [ ( a,w) ] ( a,w ) : : p > i f w = w then ( a + a, w ) : : p ( a,w ) : : a d d _ w e r t p a p i e r a w p l e t rec u n i o n _ p o r t f i l i o s p1 p2 = match p1 with [ ] > p2 ( a,w ) : : p1 > u n i o n _ p o r t f i l i o s p1 ( a d d _ w e r t p a p i e r a w p2 ) l e t rec a e n d e r bez d = f u n c t i o n [ ] > [ ] ( a,w ) : : p > i f w. bez = bez then ( a, { bez=w. bez ; w ert =w. wert +(w. wert d ) / 1 0 0 ) : : a e n d e r bez d p ( a,w ) : : a e n d e r bez d p l e t rec max = f u n c t i o n [ ] > ( 0, { bez=" " ; w e rt =0) ( a,w ) : : p >

6 l e t ( a,w ) = max p in i f a w. wert >= a w. wert then ( a,w) ( a,w ) l e t rec max ( a,w ) = f u n c t i o n [ ] > ( a,w ) ( a,w ) : : p > i f a w. wert >= a w. wert then max ( a,w) p max ( a,w ) p l e t max = max ( 0, { bez=" " ; w ert =0)

7 Aufgabe 6.3 (P) OCaml vs. Java 2! Übersetzen Sie die folgende Java-Klasse möglichst genau in OCaml. p u b l i c c l a s s J ava { s t a t i c a b s t r a c t c l a s s Tree { i n t v a l u e ; a b s t r a c t boolean i s L e a f ( ) ; a b s t r a c t i n t sum_up ( ) ; a b s t r a c t i n t d e p t h ( ) ; s t a t i c c l a s s Leaf extends Tree { Leaf ( i n t v ) { v a l u e = v ; boolean i s L e a f ( ) { return t rue ; i n t sum_up ( ) { return v a l u e ; i n t d e p t h ( ) { return 1 ; s t a t i c c l a s s Node extends Tree { Tree l, r ; Node ( i n t v, Tree l e f t, Tree r i g h t ) { v a l u e = v ; l = l e f t ; r = r i g h t ; boolean i s L e a f ( ) { return f a l s e ; i n t sum_up ( ) { return v a l u e + l. sum_up ( ) + r. sum_up ( ) ; i n t d e p t h ( ) { i n t d l = l. d e p t h ( ) ; i n t dr = r. d e p t h ( ) ; i f ( d l < dr ) return 1 + dr ; return 1 + d l ; Lösungsvorschlag 6.3 type t r e e = Leaf of i n t Node of t r e e i n t t r e e

8 l e t rec sum_up = f u n c t i o n Leaf x > x Node ( l, x, r ) > x + sum_up l + sum_up r l e t rec d e p t h = f u n c t i o n Leaf _ > 1 Node ( l, _, r ) > l e t d l = d e p t h l in l e t dr = d e p t h r in i f d l < dr then 1 + dr 1 + d l

9 Aufgabe 6.4 (P) Mergesort Mergesort ist ein rekursiver Sortieralgorithmus, der gemäß dem Divide-and-Conquer-Prinzip arbeitet. Hier soll Mergesort zum Sortieren von Listen implementiert werden. Die prinzipielle Arbeitsweise des Algorithmus läßt sich wie folgt skizzieren. Null- und einelementige Listen sind sortiert Listen mit mehr als einem Element werden in zwei möglichst gleich große Teillisten aufgeteilt. Die Teillisten werden durch einen rekursiven Aufruf von Mergesort sortiert und anschließend in einem Mischschritt zu einer sortierten Liste zusammengesetzt. Um dieses Prinzip umzusetzen, sollen Sie folgende Funktionen definieren: a) Eine Funktion init : a list -> a list list. Der Aufruf init [x 1 ; x 2 ;... ; x n ] soll die Liste [[x 1 ]; [x 2 ];... ; [x n ]] liefern. b) Die Funktion merge : a list -> a list -> a list soll den Mischschritt implementieren. Als Argumente erhält sie bereits sortierte Listen l1 und l2. Als Ergebnis liefert sie die sortierte Liste aller Elemente aus l1 und l2 zurück. Beispiel: merge [1; 5; 9] [2; 3; 11] = [1; 2; 3; 5; 9; 11] c) Eine Funktion merge_list : a list list -> a list list. Der Aufruf soll sich zu der Liste falls n gerade ist und zu der Liste andernfalls auswerten. Beispiel: merge_list [l 1 ; l 2 ;... ; l n ] [merge l 1 l 2 ; merge l 3 l 4 ;... ; merge l n 1 l n ] [merge l 1 l 2 ; merge l 3 l 4 ;... ; merge l n 2 l n 1 ; l n ] merge_list (merge_list [[1; 5; 9]; [2; 3; 11]; [4; 7; 8]]) =merge_list [[1; 2; 3; 5; 9; 11]; [4; 7; 8]] =[[1; 2; 3; 4; 5; 7; 8; 9; 11]] d) Definieren Sie schließlich die Funktion mergesort : a list -> a list mit Hilfe der obigen Funktionen. Lösungsvorschlag 6.4 l e t i n i t l = L i s t. map ( fun x > [ x ] ) l l e t rec merge l 1 l 2 = match ( l1, l 2 ) with ( [ ], l ) ( l, [ ] ) > l ( x : : xs, y : : ys ) > i f x <= y then x : : ( merge xs l 2 )

10 y : : ( merge l 1 ys ) l e t rec m e r g e _ l i s t = f u n c t i o n [ ] > [ ] [ l ] > [ l ] l 1 : : l 2 : : l s > ( merge l 1 l 2 ) : : ( m e r g e _ l i s t l s ) ( A l t e r n a t i v e m e r g e _ l i s t F u n k t i o n ) l e t rec m e r g e _ l i s t acc = f u n c t i o n [ ] > acc [ l ] > l : : acc l 1 : : l 2 : : l s > m e r g e _ l i s t ( merge l 1 l 2 : : acc ) l s l e t m e r g e _ l i s t l = m e r g e _ l i s t [ ] l ( A l t e r n a t i v e m e r g e _ l i s t F u n k t i o n ) l e t rec m e r g e s o r t l = match l with [ ] > [ ] [ x ] > x _ > m e r g e s o r t ( m e r g e _ l i s t l ) l e t m e r g e s o r t l = m e r g e s o r t ( i n i t l ) ( Eine andere M o e g l i c h k e i t, d i e n i c h t i n der A u f g a b e n s t e l l u n g b e s c h r i e b e n i s t. ) l e t rec s p l i t ( l1, l 2 ) = f u n c t i o n x : : y : : l > s p l i t ( x : : l1, y : : l 2 ) l [ x ] > ( x : : l1, l 2 ) _ > ( l1, l 2 ) l e t s p l i t l = s p l i t ( [ ], [ ] ) l l e t rec s o r t l = match l with [ ] [ _ ] > l _ > l e t ( l1, l 2 ) = s p l i t l in l e t ( l1, l 2 ) = ( s o r t l1, s o r t l 2 ) in merge l 1 l 2