Tutoraufgabe 1 (Programmanalyse):

Ähnliche Dokumente
Tutoraufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Programmanalyse): Programmierung WS17/18 Übungsblatt 5 (Abgabe ) Allgemeine Hinweise:

Tutoraufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Verifikation):

Tutoraufgabe 1 (Hoare-Kalkül):

Tutoraufgabe 1 (Seiteneekte):

Tutoraufgabe 1 (Seiteneekte):

Tutoraufgabe 1 (Casting): Programmierung WS17/18 Übungsblatt 2 (Abgabe ) Allgemeine Hinweise:

Tutoraufgabe 1 (Vollständige Induktion): Tutoraufgabe 2 (Rotationen): Datenstrukturen und Algorithmen SS15 Übungsblatt 5 (Abgabe 3.6.

Tutoraufgabe 1 (Listen):

Tutoraufgabe 1 (Auswertungsstrategie):

Tutoraufgabe 1 (Überladen von Methoden):

Tutoraufgabe 1 (2 3 4 Bäume):

Tutoraufgabe 1 (SCC):

Tutoraufgabe 1 (Werkzeugkasten): Programmierung WS18/19 Übungsblatt 4 (Abgabe Freitag, den um 12:00) Allgemeine Hinweise:

Tutoraufgabe 1 (Starke Zusammenhangskomponenten):

Tutoraufgabe 1 (Code-Analyse):

Tutoraufgabe 1 (Fibonacci-Zahlen):

Humboldt-Universität zu Berlin Wintersemester 2010/11 Institut für Informatik Grundlagen der Programmierung. 6. Übungsblatt

Übung Programmierung WS 2007/08 - Blatt 6

Tutoraufgabe 1 (Klassenhierarchie):

Programmierung WS14/15 Lösung - Präsenzübung C. Aschermann, F. Frohn, J. Hensel, T. Ströder

Tutoraufgabe 1 (Fraktale): Programmierung WS18/19 Übungsblatt 5 (Abgabe Freitag, den um 12:00) Allgemeine Hinweise:

Tutoraufgabe 1 (Das Herz):

Programmierung WS12/13 Lösung - Präsenzübung M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Tutoraufgabe 1 (Fibonacci-Zahlen):

Tutoraufgabe 1 (Implementierung eines ADTs):

Tutoraufgabe 1 (Verikation mit Arrays):

Aufgabenblatt 5. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

JAVA für Nichtinformatiker - Probeklausur -

Aufgabenblatt 2. Kompetenzstufe 2. Allgemeine Informationen zum Aufgabenblatt:

Erste Java-Programme (Scopes und Rekursion)

Vorname: Nachname: Matrikelnummer: Studiengang (bitte ankreuzen): Informatik Bachelor Informatik Lehramt Mathematik Bachelor Sonstige:

Aufgabe 1 (Programmanalyse):

Aufgabe 1 (Programmanalyse, Punkte)

Tutoraufgabe 1 (Pilze):

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

Tutoraufgabe 1 (Typen):

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Aufgabe 2 (Unendliche Listen in Haskell):

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Übung Informatik I - Programmierung - Blatt 8

Sommersemester Jewgeni Rose. Technische Universität Braunschweig

Aufgabenblatt 3. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

Programmierung für Mathematik (HS13)

Probeklausur zur Vorlesung

Präsenzübung Programmierung WS 2016/2017

Programmieren in Java -Eingangstest-

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

Übung Informatik I - Programmierung - Blatt 6

int x = 3; int y = 11; public A () { this.x = z; y *= z;

Tutoraufgabe 1 (Überladen und Überschreiben):

Klausur Software-Entwicklung März 01

Tutoraufgabe 1 (Klassenhierarchie):

Klausur Programmierung WS 2012/2013

Tutoraufgabe 1 (Verikation mit Arrays):

Globalübungsaufgabe1 (Rucksackproblem):

Fakultät IV Elektrotechnik/Informatik

OOP Aufgabenblatt 7 6. Dezember 2013

Tutoraufgabe 1 (Klassenhierarchien):

Programmierung

pue13 January 28, 2017

Programmiertechnik Übungen zu Klassen & -methoden

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015. Musterlösung

Tag 8 Repetitorium Informatik (Java)

Informatik B von Adrian Neumann

Programmierung WS18/19 Lösung - Präsenzübung

Klausur Grundlagen der Programmierung

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Präsenzübung Programmierung WS 2017/2018

Tutoraufgabe 1 (Rekursive Datenstrukturen): Programmierung WS17/18 Übungsblatt 6 (Abgabe ) Allgemeine Hinweise:

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Arbeitsblatt zu Methoden

Programmierstarthilfe SS 2009 Fakultät für Ingenieurwissenschaften und Informatik 4. Blatt Für die Woche vom bis zum 22.5.

Programmierung WS17/18 Lösung - Präsenzübung 09./

Tutoraufgabe 1 (Seiteneffekte):

Universität zu Lübeck Institut für Telematik. Prof. Dr. Stefan Fischer

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren I. 5. Übungsblatt

Übung zur Vorlesung Programmierung

Prüfungsklausur Programmierung

Probeklausur Informatik 2 Sommersemester 2013

2. Klausur Programmierung WS 2014/2015

Beuth Hochschule Parameter-Übergabe-Mechanismen WS17/18, S. 1

Programmierung für Mathematik HS11

1. Teilklausur Gruppe A. Bitte in Druckschrift leserlich ausfüllen!

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

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

Programmierstarthilfe SS 2010 Fakultät für Ingenieurwissenschaften und Informatik 6. Blatt Für die Woche vom bis zum 4.6.

Aufgabe 2 (Collections):

Programmierkurs Java

5. Tutorium zu Programmieren

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

Informatik II (D-ITET) Informatik II (D-ITET) Übungsstunde 1. Distributed Systems Group, ETH Zürich

Repetitorium Informatik (Java)

Tag 4 Repetitorium Informatik (Java)

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2008/09

Tutoraufgabe 1 (Werkzeugkasten):

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

Musterlösung Stand: 5. Februar 2009

Transkript:

Prof. aa Dr. J. Giesl Programmierung WS14/15 C. Aschermann, F. Frohn, J. Hensel, T. Ströder Allgemeine Hinweise: Die Hausaufgaben sollen in Gruppen von je 2 Studierenden aus der gleichen Kleingruppenübung (Tutorium) bearbeitet werden. Namen und Matrikelnummern der Studierenden sind auf jedes Blatt der Abgabe zu schreiben. Heften bzw. tackern Sie die Blätter! Die Nummer der Übungsgruppe muss links oben auf das erste Blatt der Abgabe geschrieben werden. Notieren Sie die Gruppennummer gut sichtbar, damit wir besser sortieren können. Die Lösungen müssen bis Mittwoch, den 26.11.2014 um 15:00 Uhr in den entsprechenden Übungskasten eingeworfen werden. Sie nden die Kästen am Eingang Halifaxstr. des Informatikzentrums (Ahornstr. 55). Alternativ können Sie die Lösungen auch vor der Abgabefrist direkt bei Ihrer Tutorin/Ihrem Tutor abgeben. In einigen Aufgaben müssen Sie in Java programmieren und.java-dateien anlegen. Drucken Sie diese aus und schicken Sie sie per E-Mail vor Mittwoch, dem 26.11.2014 um 15:00 Uhr an Ihre Tutorin/Ihren Tutor. Stellen Sie sicher, dass Ihr Programm von javac akzeptiert wird, ansonsten werden keine Punkte vergeben. Aufgaben, die mit einem markiert sind, sind Sonderaufgaben mit erhöhtem Schwierigkeitsgrad. Sie tragen nicht zur Summe der erreichbaren Punkte bei, die für die Klausurzulassung relevant ist, jedoch werden Ihnen die in solchen Aufgaben erreichten Punkte ganz normal gutgeschrieben. Tutoraufgabe 1 (Programmanalyse): Lösen Sie die folgende Aufgabe ohne Einsatz eines Computers. Bedenken Sie, dass Sie in einer Prüfungssituation ebenfalls keinen Computer zur Verfügung haben. Betrachten Sie das folgende kurze Programm: public class A { private Integer i; private double d; public A () { this.i = 1; this.d = 4; public A( Integer x, double y) { this.i = x; this.d = y; public A( int x, double y) { this.i = 3; this.d = x + y; public int f ( Integer x) { return this.i + x; 1

public int f ( double i) { this.d = i; return this.i; public static void main ( String [] args ) { A a1 = new A (); System. out. println ( a1.f (5)); System. out. println ( a1.d ); System. out. println ( a1.f( new Long (2))); A a2 = new A (1,1); System. out. println ( a2.i ); System. out. println ( a2.d ); Geben Sie die Ausgabe dieses Programms an. Begründen Sie Ihre Antwort. Aufgabe 2 (Programmanalyse): (10 Punkte) Lösen Sie die folgende Aufgabe ohne Einsatz eines Computers. Bedenken Sie, dass Sie in einer Prüfungssituation ebenfalls keinen Computer zur Verfügung haben. Betrachten Sie das folgende kurze Programm: public class B { private Integer i1 ; private int i2 ; private double d; private Float f; public B( int a, int b, int c, int d) { this. i1 = a ; this. i2 = b ; this.d = d; this.f = ( float )c; public B( Integer a, int b, double c, Float d) { this. i1 = a ; this. i2 = b ; this.d = c; this.f = d; public int f ( Float x, int y) { return 11; public int f ( double x, int y) { return 12; 2

public Integer f( double x, Long y) { return 13; public double g( long x) { return 7. 0; public Float g( Integer x) { return 8f; public static void main ( String [] args ) { B b1 = new B (1,2,3,4); System. out. println ( b1.d ); System. out. println ( b1.f (5,6)); System. out. println ( b1.f (7f,8)); System. out. println ( b1.f (10 f,17 L )); B b2 = new B( b1.i1, 5, 6, 9); System. out. println ( b2.f ); System. out. println ( b2.f( b1.f, b1. i2 )); B b3 = new B( b2.i1, 14, 15, 16 f ); System. out. println ( b3.d ); System. out. println ( b3.g( new Long (18))); System. out. println ( b3.g( b1. i1 )); System. out. println ( b3.f( b2.g (19), 21)); Geben Sie die Ausgabe dieses Programms an. Begründen Sie Ihre Antwort. Tutoraufgabe 3 (Einfache Rekursion): Betrachten Sie folgende Methode: public static int gauss ( int n) { int res = 0; int i = 1; while (i <= n) { res += i; i ++; return res ; Schreiben Sie eine statische Methode gaussrecursive, welche eine int-zahl erhält und eine int-zahl zurückliefert, sodass für jede int-zahl x die Aufrufe gauss(x) und gaussrecursive(x) das gleiche Ergebnis liefern. Sie dürfen in dieser Aufgabe keine Schleifen verwenden. Die Verwendung von Rekursion ist hingegen erlaubt. 3

Aufgabe 4 (Einfache Rekursion): Betrachten Sie folgende Methode: (4 Punkte) public static int arraysum ( int [] a) { int res = 0; for ( int i = 0; i < a. length ; i ++) { res += a[i ]; return res ; Schreiben Sie eine statische Methode arraysumrecursive, welche ein int-array erhält und eine int-zahl zurückliefert, sodass für jedes int-array a die Aufrufe arraysum(a) und arraysumrecursive(a) das gleiche Ergebnis liefern. Sie dürfen in dieser Aufgabe keine Schleifen verwenden. Die Verwendung von Rekursion ist hingegen erlaubt (inklusive der Denition von Hilfsmethoden). Tutoraufgabe 5 (Fraktale): In dieser Aufgabe geht es darum, eine fraktale Struktur grasch darzustellen. Die Struktur besteht aus Quadraten, die nach einem bestimmten Vorgehen angeordnet werden. Das Vorgehen lässt sich rekursiv beschreiben: Im ersten Level besteht die Struktur aus nur einem Quadrat. Die Struktur des n-ten Levels entsteht dadurch, dass erst ein Quadrat und danach auf dessen vier Ecken jeweils eine verkleinerte Variante des (n 1)-ten Levels der Struktur gezeichnet wird. Hierbei haben die gröÿten Quadrate des (n 1)-ten Levels die halbe Kantenlänge des gröÿten Quadrates des n-ten Levels. In folgendem Bild sind die ersten fünf Level der fraktalen Struktur dargestellt. Verwenden Sie zur graphischen Darstellung die Klasse Canvas, welche in der Datei Canvas.java deniert ist. Sobald ein Objekt der Klasse Canvas erzeugt wird, wird dieses in einem Fenster auf dem Bildschirm angezeigt. Die Klasse Canvas stellt (unter anderem) die Methoden move und square zur Verfügung, die ein bzw. zwei double-zahlen als Parameter bekommen und Zeichenoperationen in dem angezeigten Fenster ausführen. Sie können die einzelnen Zeichenschritte über die Schaltächen Vor und Zurueck nacheinander ansehen. Die Schaltächen Anfang und Ende zeigen die leere Fläche bzw. das fertige Bild. Sei c ein Objekt der Klasse Canvas. Dann bewegt beispielsweise der Aufruf c.move(3, 4) die aktuelle Zeichenposition (d. h. die Position, an der als nächstes gezeichnet wird) um 3 Einheiten nach rechts und 4 Einheiten nach unten. Ein Aufruf c.square(5) zeichnet ein gefülltes Quadrat mit einer Seitenlänge von 5 Einheiten, wobei der Mittelpunkt des Quadrats auf der aktuellen Zeichenposition liegt. Implementieren Sie die statische Methode paintfractal in der Klasse Squares, welche eine Referenz c auf ein Objekt der Klasse Canvas, eine int-zahl level und eine double-zahl length übergeben bekommt und mit Hilfe des Canvas Objekts c die beschriebene fraktale Struktur des level-ten Level zeichnet, wobei die Kantenlänge des gröÿten Quadrats length beträgt. Sie dürfen in dieser Aufgabe keine Schleifen verwenden. Die Verwendung von Rekursion ist hingegen erlaubt. Der folgende Aufruf eignet sich dazu, Ihr Programm zu testen. java Squares 5 100 4

Aufgabe 6 (Fraktale): (15 + 4 Punkte) Auch in dieser Aufgabe soll eine fraktale Struktur mithilfe der Klasse Canvas gezeichnet werden. Diesmal geht es um sogenannte Pythagoras Bäume. Ein Pythagoras Baum im ersten Level ist wiederum nur ein Quadrat einer vorgegebenen Basislänge. Ein Pythagoras Baum des n-ten Levels besteht aus einem Quadrat und zwei Pythagoras Unterbäumen des (n 1)-ten Levels. Die jeweils ersten Quadrate dieser beiden Unterbäume werden oberhalb des Quadrates im n-ten Level nebeneinander positioniert. Dabei wird das linke Quadrat um einen Winkel α gegen den Uhrzeigersinn und das rechte Quadrat um einen Winkel β im Uhrzeigersinn rotiert, sodass die drei Quadrate zwischen sich ein leeres Dreieck formen. Beide Winkel müssen positiv und kleiner als 90 sein und dürfen in Summe nicht mehr als 120 ergeben. Basierend auf der Länge des Quadrates im n-ten Level und diesen beiden Winkeln müssen die Längen der beiden Quadrate in den beiden Unterbäumen berechnet werden. Die folgende Grak zeigt die ersten vier Level eines Pythagoras Baums mit den Winkeln α = 45 und β = 45 (oben) sowie α = 30 und β = 45 (unten). Zur Berechnung der jeweils nächsten Quadratlängen eignet sich der Sinussatz. Sei l die Länge des unteren Quadrats. Dann folgt aus dem Sinussatz, dass die Länge des linken Quadrats genau und die sin(α) l sin(180 α β) sin(β) l sin(180 α β) Länge des rechten Quadrats genau ist. Um den Sinus eines Winkels angle (angegeben in Grad) in Java zu berechnen, können Sie den Ausdruck Math.sin(Math.toRadians(angle)) verwenden. Die Klasse Canvas bietet neben den bereits aus der vorigen Aufgabe bekannten Methoden move und square zusätzlich eine Methode rotate an, welche einen Winkel in Grad übergeben bekommt. Diese Methode rotiert die Ausrichtung für alle weiteren Zeichenoperationen um den übergebenen Winkel im Uhrzeigersinn (bei negativen Winkeln entsprechend gegen den Uhrzeigersinn). Sei c ein Objekt der Klasse Canvas. Dann zeichnen beispielsweise die aufeinander folgenden Aufrufe c.rotate(45) und c.square(5) ein um 45 rotiertes Quadrat mit Seitenlänge 5 mit der aktuellen Position als Mittelpunkt. Analog wird die aktuelle Position durch die aufeinander folgenden Aufrufe c.rotate(90) und c.move(1,0) um eine Einheit nach unten statt nach rechts verschoben. Durch rotate wird also das gesamte Koordinatensystem rotiert. Auÿerdem bietet die Klasse Canvas zwei Farben BROWN und GREEN als statische Attribute an, welche mittels der Methode choosecolor ausgewählt werden können. Der Aufruf c.choosecolor(canvas.brown) führt also im obigen Beispiel dazu, dass alle weiteren Zeichenoperationen mit brauner Farbe durchgeführt werden. Diese Farben sollen dazu genutzt werden, groÿe Quadrate braun und kleine Quadrate grün zu färben, damit die grasche Qualität der Pythagoras Bäume erhöht wird. Wie in der vorigen Aufgabe dürfen Sie in dieser Aufgabe keine Schleifen verwenden. Die Verwendung von Rekursion ist hingegen erlaubt. a) Implementieren Sie die statische Methode paintpythagorastree in der Klasse Pythagoras, welche folgende Parameter erhält: eine Referenz c auf ein Canvas Objekt eine int-zahl level, welche das gewünschte Level des Pythagoras Baums angibt einen double-wert length, welcher die Länge des ersten Quadrats des Pythagoras Baums angibt 5

eine int-zahl leftangle, welche dem Winkel α entspricht eine int-zahl rightangle, welche dem Winkel β entspricht eine int-zahl switchlength, welche die maximale Länge von Quadraten angibt, welche grün gezeichnet werden sollen Diese Methode soll einen Pythagoras Baum des spezizierten Levels zeichnen, wobei das erste Quadrat die übergebene Länge hat und die beiden jeweils folgenden Quadrate wie oben beschrieben um die Winkel α und β rotiert werden. Auÿerdem sollen Quadrate mit einer Seitenlänge gröÿer als switchlength in braun und alle anderen Quadrate in grün gezeichnet werden. Zum Testen Ihrer Implementierung eignen sich die folgenden Aufrufe Ihres Programms (daneben nden Sie Abbildungen, die Sie als Ergebnis zu diesen Aufrufen erhalten sollten): java Pythagoras 7 100 45 45 20 java Pythagoras 10 100 30 45 10 java Pythagoras 7 50 60 60 b) Um die grasche Qualität weiter zu verbessern, sollten die leeren Dreiecke zwischen den Quadraten gefüllt werden. Modizieren Sie die Methode paintpythagorastree so, dass sie dieses Verhalten zeigt (falls Sie diese Teilaufgabe lösen, genügt natürlich die Abgabe der Version mit gefüllten Dreiecken zur Lösung beider Teilaufgaben). Nutzen Sie zum Zeichnen lediglich die bereits von der Klasse Canvas bereitgestellten Methoden. Die drei Testaufrufe aus der vorigen Teilaufgabe liefern dann folgende Bilder: Hinweise: Die Höhe eines beliebigen Dreiecks von der Hypothenuse mit Länge c aus berechnet sich durch 2(a2 b 2 +a 2 c 2 +b 2 c 2 ) (a 4 +b 4 +c 4 ) 2c, wobei a und b die Längen der beiden Katheten des Dreiecks sind. Die Wurzel lässt sich in Java mittels der Methode Math.sqrt ziehen. 6