Tutoraufgabe 1 (Seiteneekte):

Ähnliche Dokumente
Tutoraufgabe 1 (Überladen von Methoden):

Übung Programmierung WS 2007/08 - Blatt 6

Tutoraufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Hoare-Kalkül):

Tutoraufgabe 1 (Listen):

Tutoraufgabe 1 (Überladen von Methoden):

Tutoraufgabe 1 (Programmanalyse):

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 (2 3 4 Bäume):

Tutoraufgabe 1 (Klassenhierarchie):

Tutoraufgabe 1 (Fibonacci-Zahlen):

Tutoraufgabe 1 (SCC):

Tutoraufgabe 1 (Starke Zusammenhangskomponenten):

Übung Informatik I - Programmierung - Blatt 6

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

Tutoraufgabe 1 (Klassenhierarchie):

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

Aufgabe 2 (Unendliche Listen in Haskell):

Tag 4 Repetitorium Informatik (Java)

Übung Informatik I - Programmierung - Blatt 8

Tutoraufgabe 1 (Das Herz):

Einstieg in die Informatik mit Java

Einführung in die Informatik. Lösung zu Übungsblatt 6

Musterübung 09: Vererbung und Dynamische Bindung

Tutoraufgabe 1 (Entwerfen von Klassenhierarchien):

Tutoraufgabe 1 (Verikation mit Arrays):

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

Programmieren in Java -Eingangstest-

Programmieren in Java

Institut für Informatik

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

Folienpaket 7 Themenschwerpunkte: Methoden in OOP /2016 Dr. Daniel Haase - Vorkurse Informatik V3/V4

Tag 4 Repetitorium Informatik (Java)

Tutoraufgabe 1 (Seiteneffekte):

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Tutoraufgabe 1 (Pilze):

Tag 7 Repetitorium Informatik (Java)

Erste Java-Programme (Scopes und Rekursion)

JAVA für Nichtinformatiker - Probeklausur -

Informatik Hochschule Mainz Geoinformatik und Vermessung. Wiederholung. Frohes Fest und Guten Rutsch!

Programmieren, Wintersemester 13/14 Übungsleiter: Sebastian Ebers Aufgabenblatt 3

Übungsblatt 1. Java Vorkurs (WS 2017)

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

Objektorientierung. Programmierstarthilfe WS 2010/11 Fakultät für Ingenieurwissenschaften und Informatik

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Tutoraufgabe 1 (Überladen und Überschreiben):

Tutoraufgabe 1 (Fibonacci-Zahlen):

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

Programmiertechnik Klassenvariablen & Instantiierung

Sommersemester Jewgeni Rose. Technische Universität Braunschweig

Inhaltsverzeichnis. Grundlagen und Einführung (1. Band) 1

Martin Unold INFORMATIK. Geoinformatik und Vermessung

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Universität Paderborn Prof. Dr. Heike Wehrheim. Betreutes Arbeiten. Ab diese Woche: freitags, 14 16, E-Pool (während Tutorium Knopf) GPI, WS 07/08

Implementieren von Klassen

Präsenzübung Programmierung WS 2017/2018

Tag 8 Repetitorium Informatik (Java)

Einführung in die Programmierung für NF MI. Übung 07

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

Repetitorium Informatik (Java)

Aufgabe 1 (Programmanalyse, Punkte)

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Aufrufe von Objektmethoden

EPROG 2.Teilprüfung. Aufgabe 1:

Basispruefung Herbst 2016/ Einführung in die Programmierung

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Methoden und Wrapperklassen

Grundlagen der Objektorientierten Programmierung - Methoden -

Javakurs für Anfänger

Vorbereitende Aufgaben

Felder - Arrays. Typ feldname[] = new Typ[<ganze Zahl >]; Beispiel: double vektor[] = new double[5]; auch eine Initialisierung ist möglich.

Klausur zur Vorlesung Einführung in die Programmierung

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

Semestralklausur Informatik I - Programmierung

Computeranwendung und Programmierung (CuP)

Klausur Software-Entwicklung März 01

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Matrikelnummer: 1 Aufgabe 1: Quickies (30 Punkte) a) Wird das folgende Programm von einem Java-Übersetzer ohne Beanstandungen übersetzt? Falls nicht,

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

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 19.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 19.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. Tutoraufgabe 1 (Seiteneekte): Betrachten Sie das folgende Programm: public class TSeiteneffekte { public static void main ( String [] args ) { Wrapper [] ws = new Wrapper [ 2]; ws [0] = new Wrapper (); ws [1] = new Wrapper (); ws [0]. i = 2; ws [1]. i = 1; f( ws [1], ws [1], ws [0]); public static void f( Wrapper w1, Wrapper... ws ) { int sum = 0; for ( int j = 0; j < ws. length ; j ++) { Wrapper w = ws [j ]; sum += w.i; w.i = j + 2; w1 = ws [1]; w1.i = - sum ; public class Wrapper { public int i; 1

Es wird nun die Methode main ausgeführt. Stellen Sie den Speicher (d.h. alle (implizit) im Programm vorkommenden Arrays (auÿer args) und alle Objekte sowie die zu dem Zeitpunkt existierenden Programmvariablen) an folgenden Programmstellen graphisch dar: nach der Deklaration von sum in dem Aufruf der Methode f nach der Schleife in der Methode f vor Ende der main Methode Aufgabe 2 (Seiteneekte): Betrachten Sie das folgende Programm: (6 Punkte) public class HSeiteneffekte { public static void main ( String [] args ) { Wrapper w1 = new Wrapper (); Wrapper w2 = w1 ; w1.i = 1; w2.i = 2; int x = 3; int [] a = { 4, 5 ; int [] b = a; f(w2, x, b ); f(w1, x, b [0], a [1]); a = new int []{ 4, 5 ; f(w2, x, b ); public static void f( Wrapper w, int x, int... a) { x = a [0]; a [1] = w.i; w.i = x; public class Wrapper { public int i; Es wird nun die Methode main ausgeführt. Stellen Sie den Speicher (d.h. alle (implizit) im Programm vorkommenden Arrays (auÿer args) und alle Objekte sowie die zu dem Zeitpunkt existierenden Programmvariablen) am Ende jeder Ausführung der Methode f graphisch dar. 2

Tutoraufgabe 3 (Kreise): In dieser Aufgabe soll eine Klasse erstellt werden, mit der sich Kreise repräsentieren lassen. Ein solcher Kreis lässt sich mit den Koordinaten x und y für den Mittelpunkt und der Länge radius beschreiben, wobei x, y und radius ganze Zahlen sind. Der Radius eines Kreises darf nicht negativ sein. Ihre Implementierung sollte mindestens die folgenden Methoden beinhalten. Sie sollten dabei die Konzepte der Datenkapselung berücksichtigen. Hilfsmethoden müssen als private deklariert werden. In dieser Aufgabe dürfen Sie die in der Klasse Utils zur Verfügung gestellten Hilfsfunktionen, aber keine Bibliotheksfunktionen verwenden. a) Erstellen Sie eine Klasse Circle mit den Attributen x, y und radius. b) Erstellen Sie die folgenden öentlichen Methoden, um Objekte des Typs Circle erzeugen zu können. Entscheiden Sie dabei selbst, welche Methoden Sie als statisch deklarieren: Circle newcircle ( int x, int y, int radius ) Circle clone () Die Methode newcircle soll einen Kreis erzeugen, dessen Attribute jeweils die von den entsprechenden Parametern angegebenen Werte haben. Falls eines der Argumente einen unzulässigen Wert hat, muss eine geeignete Fehlermeldung ausgegeben und null zurückgeliefert werden. Zur Ausgabe einer Fehlermeldung kann die Methode Utils.error(String msg) genutzt werden. Die Methode clone soll einen Kreis kopieren. c) Erstellen Sie die folgenden öentlichen Selektoren, um die Koordinaten und den Radius eines Kreises setzen und auslesen zu können. Entscheiden Sie dabei selbst, welche Methoden Sie als statisch deklarieren: int getx () void setx ( int x) int gety () void sety ( int y) int getradius () void setradius ( int radius ) Falls ein Attribut auf einen unzulässigen Wert gesetzt werden soll, darf der Wert des Attributes nicht verändert werden. Stattdessen muss eine geeignete Fehlermeldung ausgegeben werden. Hierzu kann die Methode Utils.error(String msg) genutzt werden. d) Erstellen Sie die folgenden öentlichen Methoden, mit denen man Eigenschaften von Kreisen überprüfen kann. Entscheiden Sie dabei selbst, welche Methoden Sie als statisch deklarieren und begründen Sie Ihre Entscheidung kurz: boolean contains ( Circle... others ) double size ( Circle... circles ) Bei den in diesem Aufgabenteil geforderten Methoden muss der Aufrufer (und nicht Sie als Implementierer der Klasse Circle) sicherstellen, dass die Parameter, mit denen die Methoden aufgerufen werden, nicht den Wert null haben bzw. enthalten. Die Methode contains(circle... others) prüft, ob alle in others enthaltenen Kreise vollständig innerhalb des Kreises liegen, auf dem die Methode aufgerufen wird. Hinweis: Es empehlt sich, eine Hilfsmethode zu implementieren, um zu überprüfen, ob ein Kreis in einem anderen enthalten ist. Die Methode size(circle... circles) gibt die Summe der Flächen aller Kreise in circles zurück. Hinweis: Es empehlt sich, eine Hilfsmethode zu implementieren, die die Gröÿe eines Kreises berechnet. 3

e) Erstellen Sie ebenfalls eine Implementierung für die öentliche Methode String tostring () Entscheiden Sie dabei selbst, ob Sie die Methode als statisch deklarieren. Die Methode tostring() erstellt eine textuelle Repräsentation eines Kreises, aus der die Koordinaten und der Radius hervorgehen. Zum Beispiel stellt der String (10 11),12 den Kreis mit den Koordinaten 10 und 11 und dem Radius 12 dar. f) Dokumentieren Sie alle Methoden, die als public markiert sind, indem Sie die Implementierung mit Javadoc-Kommentaren ergänzen. Diese Kommentare sollten eine allgemeine Erklärung der Methode sowie weitere Erklärungen jedes Parameters und des return-wertes enthalten. Verwenden Sie innerhalb des Kommentars dafür die Javadoc-Anweisungen @param und @return. Benutzen Sie das Programm javadoc, um Ihre Javadoc-Kommentare in das HTML-Format zu übersetzen. Überprüfen Sie mit einem Browser, ob das gewünschte Ergebnis generiert wurde. g) Auf unserer Homepage nden Sie eine Klasse XCircle. Diese Klasse stellt Instanzen der Klasse Circle in einer graphischen Benutzeroberäche dar. Die graphische Benutzeroberäche bietet die Möglichkeit, den dargestellten Kreis mit Hilfe der Pfeiltasten zu verschieben. Auÿerdem bietet sie die Möglichkeit, den dargestellten Kreis mit Hilfe von zwei Buttons zu vergröÿern bzw. zu verkleinern. Damit die graphische Benutzeroberäche benutzt werden kann, müssen Sie ein enum mit dem Namen CircleAction erstellen. Dieses enum muss die folgenden Elemente enthalten: UP, DOWN, LEFT und RIGHT repräsentieren das Verschieben des Kreises. BIGGER repräsentiert das Vergröÿern des Kreises. SMALLER repräsentiert das Verkleinern des Kreises. Auÿerdem müssen Sie in der Klasse Circle die Methode public void performaction ( CircleAction action ) implementieren. Je nach Argument verringert bzw. vergröÿert diese Methode den Radius des Kreises um den Wert 10 oder sie verschiebt den Kreis um den Wert 10 in die entsprechende Richtung. Benutzen Sie zur Implementierung der Methode performaction eine switch-anweisung, um zu testen, welche Aktion das Argument repräsentiert. Ergänzen Sie auch für diese Methode einen geeigneten Javadoc-Kommentar. Achten Sie bei Ihrer Implementierung darauf, dass Kreise nicht beliebig klein werden können. Nachdem Sie die Implementierung vervollständigt und alle Klassen mit javac kompiliert haben, können Sie die graphische Benutzeroberäche mit java XCircle starten. Aufgabe 4 (Rechtecke): (1 + 2 + 4 + 6 + 2 + 4 + 4 = 23 Punkte) In dieser Aufgabe soll eine Klasse erstellt werden, mit der sich Rechtecke repräsentieren lassen. Ein solches Rechteck lässt sich mit den Koordinaten x und y für die linke obere Ecke, der Breite width und der Höhe height beschreiben, wobei x, y, width und height ganze Zahlen sind. Die Breite und die Höhe eines Rechtecks können nicht negativ sein. Ihre Implementierung sollte mindestens die folgenden Methoden beinhalten. Sie sollten dabei die Konzepte der Datenkapselung berücksichtigen. Hilfsmethoden müssen als private deklariert werden. In dieser Aufgabe dürfen Sie die in der Klasse Utils zur Verfügung gestellten Hilfsfunktionen, aber keine Bibliotheksfunktionen verwenden. a) Erstellen Sie eine Klasse Rectangle mit den Attributen x, y, width und height. b) Erstellen Sie die folgenden öentlichen Methoden, um Objekte des Typs Rectangle erzeugen zu können. Entscheiden Sie dabei selbst, welche Methoden Sie als statisch deklarieren: Rectangle newrectangle ( int x, int y, int width, int height ) Rectangle copy ( Rectangle tocopy ) 4

Die Methode newrectangle soll ein Rechteck erzeugen, dessen Attribute jeweils die von den entsprechenden Parametern angegebenen Werte haben. Falls eines der Argumente einen unzulässigen Wert hat, muss eine geeignete Fehlermeldung ausgegeben und null zurückgeliefert werden. Zur Ausgabe einer Fehlermeldung kann die Methode Utils.error(String msg) genutzt werden. Die Methode copy soll ein Rechteck kopieren. c) Erstellen Sie die folgenden Selektoren, um die Koordinaten, die Breite und die Höhe eines Rechtecks setzen und auslesen zu können. Entscheiden Sie dabei selbst, welche Methoden Sie als statisch deklarieren: int getx () void setx ( int x) int gety () void sety ( int y) int getwidth () void setwidth ( int width ) int getheight () void setheight ( int height ) Falls ein Attribut auf einen unzulässigen Wert gesetzt werden soll, darf der Wert des Attributes nicht verändert werden. Stattdessen muss eine geeignete Fehlermeldung ausgegeben werden. Hierzu kann die Methode Utils.error(String msg) genutzt werden. d) Erstellen Sie die folgenden Methoden. Entscheiden Sie dabei selbst, welche Methoden Sie als statisch deklarieren und begründen Sie Ihre Entscheidung kurz: Rectangle union ( Rectangle... rectangles ) Rectangle intersection ( Rectangle... rectangles ) Bei den in diesem Aufgabenteil geforderten Methoden muss der Aufrufer (und nicht Sie als Implementierer der Klasse Rectangle) sicherstellen, dass die Parameter, mit denen die Methoden aufgerufen werden, nicht den Wert null haben bzw. enthalten. Die Methode union(rectangle... rectangles) soll ein neues Rechteck zurückgeben, das durch die Vereinigung aller Rechtecke in rectangles entsteht. Wenn rectangles leer ist, soll null zurückgegeben werden. Hinweise: Die Vereinigung zweier Rechtecke ist das kleinste Rechteck, das die beiden anderen vollständig abdeckt. Es empehlt sich, eine Hilfsmethode zu implementieren, die die Vereinigung zweier Rechtecke berechnet. Die Methode intersection(rectangle... rectangles) gibt das gröÿte Rechteck zurück, das vollständig in allen als Argument übergebenen Rechtecken enthalten ist. Wenn rectangles leer ist, soll null zurückgegeben werden. Falls der Schnitt der Rechtecke leer ist, soll ebenfalls null zurückgegeben werden. Hinweis: Es empehlt sich, eine Hilfsmethode zu implementieren, die den Schnitt zweier Rechtecke berechnet. e) Erstellen Sie ebenfalls eine Implementierung für die öentliche Methode String tostring () Entscheiden Sie dabei selbst, ob Sie die Methode als statisch deklarieren. Die Methode tostring() erstellt eine textuelle Repräsentation des aktuellen Rechtecks. Zum Beispiel stellt der String 5

das Rechteck mit den Koordinaten 5 und 3, der Breite 3 und der Höhe 4 dar. Achten Sie darauf, dass Teile des Rechtecks aus dem sichtbaren Bereich verschwinden, wenn die x- oder die y-koordinate negativ ist. Anmerkung: Auf dem ursprünglichen Blatt war das Beispiel leider fälschlicherweise um einen Punkt nach links oben verschoben. f) Dokumentieren Sie alle Methoden, die als public markiert sind, indem Sie die Implementierung mit Javadoc-Kommentaren ergänzen. Diese Kommentare sollten eine allgemeine Erklärung der Methode sowie weitere Erklärungen jedes Parameters und des return-wertes enthalten. Verwenden Sie innerhalb des Kommentars dafür die Javadoc-Anweisungen @param und @return. Benutzen Sie das Programm javadoc, um Ihre Javadoc-Kommentare in das HTML-Format zu übersetzen. Überprüfen Sie mit einem Browser, ob das gewünschte Ergebnis generiert wurde und senden Sie die HTML-Dateien an Ihren Tutor bzw. Tutorin. Bitte drucken Sie die generierten Dateien, der Umwelt zuliebe, nicht aus. g) Auf unserer Homepage nden Sie eine Klasse XRectangle. Diese Klasse stellt Instanzen der Klasse Rectangle in einer graphischen Benutzeroberäche dar. Die graphische Benutzeroberäche bietet die Möglichkeit, das dargestellte Rechteck mit Hilfe der linken bzw. rechten Pfeiltasten zu rotieren. Auÿerdem bietet sie die Möglichkeit, das dargestellte Rechteck mit Hilfe von vier Buttons zu vergröÿern bzw. zu verkleinern. Damit die graphische Benutzeroberäche benutzt werden kann, müssen Sie ein enum mit dem Namen RectangleAction erstellen. Dieses enum muss folgende Elemente enthalten: ROTATE_RIGHT repräsentiert Rotieren nach rechts. ROTATE_LEFT repräsentiert Rotieren nach links. NARROW repräsentiert Verringern der Breite. WIDEN repräsentiert Vergröÿern der Breite. LOWER repräsentiert Verringern der Höhe. RAISE repräsentiert Vergröÿern der Höhe. Auÿerdem müssen Sie in der Klasse Rectangle die Methode public void performaction ( RectangleAction action ) implementieren. Je nach Argument verringert bzw. vergröÿert diese Methode die Höhe bzw. Breite des Rechteckes um den Wert 10. Beachten Sie, dass das Rechteck nicht beliebig klein werden kann. Falls das Argument eine Rotationsaktion repräsentiert, hat die Methode keinen Eekt. Benutzen Sie zur Implementierung der Methode performaction eine switch-anweisung, um zu testen, welche Aktion das Argument repräsentiert. Ergänzen Sie auch für diese Methode einen geeigneten Javadoc-Kommentar. Nachdem Sie die Implementierung vervollständigt und alle Klassen mit javac kompiliert haben, können Sie die graphische Benutzeroberäche mit java XRectangle starten. 6