Präsenzübung Programmierung WS 2017/2018

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

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

Präsenzübung Programmierung WS 2016/2017

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

Klausur Programmierung WS 2011/2012

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

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

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

Klausur Programmierung WS 2012/2013

Aufgabe 1 (Programmanalyse):

Aufgabe 1 (Programmanalyse):

Programmierung

Klausur Programmierung WS 2011/2012

Klausur Programmierung WS 2017/2018

Tutoraufgabe 1 (Verifikation):

Klausur Programmierung WS 2016/2017

Semestralklausur Informatik I - Programmierung

Klausur Programmierung WS 2014/2015

Klausur Programmierung WS 2017/2018

Wie man das Problem der Macht des Mondes in Java löst (Programmierung)

Aufgabe 1 (Programmanalyse):

Prüfungsklausur Programmierung

2. Klausur Programmierung WS 2014/2015

Tutoraufgabe 1 (Hoare-Kalkül):

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

Aufgabe 1 (Programmanalyse):

Übung zur Vorlesung Programmierung

Anzahl Punkte Erreichte Punkte Aufgabe 1 10 Aufgabe 2 14 Aufgabe 3 16 Aufgabe 4 26 Aufgabe 5 15 Aufgabe 6 19 Summe 100

Aufgabe 1 (Programmanalyse, Punkte)

Diplomvorprüfung / Zwischenprüfung Informatik I - Programmierung

Prüfungsklausur Programmierung

Tutoraufgabe 1 (Typcasting):

Aufgabe 1 (Programmanalyse):

Prüfung Softwareentwicklung II (IB)

Tutoraufgabe 1 (Pilze):

A.y = 5.0; b1.f (2.0 f); System. out. println (A.y); // OUT : [ ]

Wiederholungsblatt Einführung in die Programmierung Lösungen

Wiederholungsblatt Einführung in die Programmierung Lösungen

Klausur Einführung in die Programmierung

Aufgabe 1 (Programmanalyse):

Aufgabe 1 (Programmanalyse):

Klausur Programmierung WS 2018/2019

Anzahl Punkte Erreichte Punkte Aufgabe 1 11 Aufgabe 2 14 Aufgabe 3 15 Aufgabe 4 26 Aufgabe 5 16 Aufgabe 6 18 Summe 100

Tutoraufgabe 1 (Klassenhierarchie):

Präsenzübung Datenstrukturen und Algorithmen SS 2014

Allgemeine Hinweise:

II.4.4 Exceptions - 1 -

Aufgabe 1 (Programmanalyse):

Prüfungsklausur Programmierung

System. out. println (ab.x + " " + ab.y); // OUT : [ ] [ ] B b1 = new B (); System. out. println (b1.x + " " + b1.y); // OUT : [ ] [ ]

Erste Java-Programme (Scopes und Rekursion)

12 Abstrakte Klassen, finale Klassen und Interfaces

Anzahl Punkte Erreichte Punkte Aufgabe 1 11 Aufgabe 2 14 Aufgabe 3 15 Aufgabe 4 26 Aufgabe 5 16 Aufgabe 6 18 Summe 100

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

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2009/10

Probeklausur zur Vorlesung

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

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

Programmiermethodik 1. Klausur

Dies ist eine Probeklausur, die keine formalen Schlüsse auf die Form, die Struktur oder den Inhalt der endgültigen Klausur zulässt.

II.4.5 Generische Datentypen - 1 -

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Aufgabe 1 (Programmanalyse):

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

2 Programmieren in Java I noch ohne Nachbearbeitung

14 Abstrakte Klassen, finale Klassen, Interfaces

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Übung Informatik I - Programmierung - Blatt 8

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

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

Klausur Software-Entwicklung März 01

Tutoraufgabe 1 (Programmanalyse):

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

Wiederholung der Endklausur am 24. September 2013

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

Prüfung Softwareentwicklung I (IB)

pue13 January 28, 2017

Endklausur 25. September 2012

Tutoraufgabe 1 (Überladen und Überschreiben):

Tutoraufgabe 1 (Klassenhierarchien):

Nachholklausur zur Vorlesung: Einführung in die objektorientierte Programmierung mit Java WS1415

Algorithmen und Datenstrukturen

Allgemeine Hinweise:

Programmierkurs Java

Programmieren in Java -Eingangstest-

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

Abschlussklausur Lösung. Bitte in Druckschrift leserlich ausfüllen!

Objektorientierte Programmierung

Allgemeine Informatik II SS :30-13:30 Uhr

Tutoraufgabe 1 (Überladen von Methoden):

1 Abstrakte Klassen, finale Klassen und Interfaces

Name:... Matr.-Nr... Bearbeitungszeit: 120 Minuten

Klausur Grundlagen der Programmierung

Allgemeine Informatik II SS :30-11:30 Uhr

Transkript:

Prof. aa Dr. J. Giesl M. Hark, J. Hensel, D. Korzeniewski Vorname: Präsenzübung Programmierung WS 2017/2018 Nachname: Studiengang (bitte genau einen markieren): Informatik Bachelor Informatik Lehramt (Bachelor) Sonstiges: Mathematik Bachelor Informatik Lehramt (Staatsexamen) Anzahl Punkte Aufgabe 1 16 Aufgabe 2 17 Aufgabe 3 10 Aufgabe 4 32 Summe 75 Erreichte Punkte Allgemeine Hinweise: Auf alle Blätter (inklusive zusätzliche Blätter) müssen Sie Ihren Vornamen, Ihren Nachnamen und Ihre Matrikelnummer schreiben. Geben Sie Ihre Antworten in lesbarer und verständlicher Form an. Schreiben Sie mit dokumentenechten Stiften, nicht mit roten oder grünen Stiften und nicht mit Bleistiften. Bitte beantworten Sie die Aufgaben auf den Aufgabenblättern (benutzen Sie auch die Rückseiten). Geben Sie für jede Aufgabe maximal eine Lösung an. Streichen Sie alles andere durch. Andernfalls werden alle Lösungen der Aufgabe mit 0 Punkten bewertet. Werden Täuschungsversuche beobachtet, so wird die Übung mit 0 Punkten bewertet. Geben Sie am Ende der Übung alle Blätter zusammen mit den Aufgabenblättern ab. Mit meiner Unterschrift bestätige ich, dass ich mich gesund und in der Lage fühle, an der Übung teilzunehmen. Unterschrift 1

Aufgabe 1 (Programmanalyse): (11.5 + 4.5 = 16 Punkte) a) Geben Sie die Ausgabe des Programms für den Aufruf java M an. Tragen Sie hierzu jeweils die ausgegebenen Zeichen in die markierten Stellen hinter OUT: ein. Achten Sie darauf, dass Gleitkommazahlen in der Form 5.0 und nicht als 5 ausgegeben werden. public class A { public static double x = 2; public int y; public A() { this.x ++; this.y = 1; public A( double x) { this.y = ( int ) x; this.x += this.y; public int f( long x) { return 2; public int f( float x) { return 3; public class B extends A { public int x = 3; public B( int x) { super (x); this.x = x; public int f( int x) { return 4; public int f( long x) { return 5; public int f( Float x) { return 7; public class M { public static void main ( String [] args ) { A aa = new A (1.5); System. out. println (aa.x + " " + aa.y); // OUT : [ ] [ ] int retaa = aa.f (1); System. out. println ( retaa ); // OUT : [ ] B bb = new B (6); A ab = bb; System. out. println (bb.x); // OUT : [ ] System. out. println (ab.x + " " + ab.y); // OUT : [ ] [ ] int retbb = bb.f(1f); System. out. println ( retbb ); // OUT : [ ] int retab = ab.f (1); System. out. println ( retab ); // OUT : [ ] retab = ab.f( Float. valueof (3. f )); System. out. println ( retab ); // OUT : [ ] retab = bb.f( Integer. valueof (1)); System. out. println ( retab ); // OUT : [ ] 2

b) Wir schreiben zusätzlich zu A und B eine neue Klasse C. Welche drei Fehler treten beim Compilieren auf? Begründen Sie Ihre Antwort kurz. 1 public class C extends A { 2 public int z; 3 public C() { 4 z = 3; 5 6 7 private int f( long x) { 8 return 42; 9 10 11 public static int main ( String [] args ) { 12 Double x = 2. 0; 13 14 A ab = new B (); 15 16 int ret = ab.f(x); 17 18 for ( Integer i = 0; i < 10; ++ i) { 19 ret += ab.f(i); 20 21 return ret ; 22 23 3

Aufgabe 2 (Hoare-Kalkül): (13 + 3 = 16 Punkte) Gegeben sei folgendes Java-Programm P, das zu zwei nicht negativen Eingaben x = a und y = b den Wert max(0, a b) berechnet. x 0 y 0 x = a y = b (Vorbedingung) while (y > 0) { if (x > 0) { x = x - 1; y = y - 1; x = max(0, a b) (Nachbedingung) Hinweise: Sie dürfen in beiden Teilaufgaben beliebig viele Zusicherungs-Zeilen ergänzen oder streichen. In der Musterlösung werden allerdings genau die angegebenen Zusicherungen benutzt. Bedenken Sie, dass die Regeln des Kalküls syntaktisch sind, weshalb Sie semantische Änderungen (beispielsweise von x+1 = y +1 zu x = y) nur unter Zuhilfenahme der Konsequenzregeln vornehmen dürfen. Klammern dürfen und müssen Sie jedoch eventuell bei der Anwendung der Zuweisungsregel setzen. Beachten Sie, dass die Nachbedingung der if Anweisung auch aus der Vorbedingung der if Anweisung und der negierten if Bedingung folgen muss. Sie müssen bei der Verwendung der Regel hierfür aber keinen expliziten Beweis angeben. a) Vervollständigen Sie die Verifikation des Algorithmus P auf der folgenden Seite im Hoare-Kalkül, indem Sie die unterstrichenen Teile ergänzen. Hierbei dürfen zwei Zusicherungen nur dann direkt untereinander stehen, wenn die untere aus der oberen folgt. Hinter einer Programmanweisung darf nur eine Zusicherung stehen, wenn dies aus einer Regel des Hoare-Kalküls folgt. 4

x 0 y 0 x = a y = b while (y > 0) { if (x > 0) { x = x - 1; y = y - 1; x = max(0, a b) 5

b) Beweisen Sie die Terminierung des Algorithmus P mit Hilfe des Hoare-Kalküls. if (x > 0) { x = x - 1; y = y - 1; 6

Aufgabe 3 (Klassenhierarchie): Ziel dieser Aufgabe ist die Erstellung einer Hierarchie zur Verwaltung von Kunstwerken. (6 + 4 = 10 Punkte) Ein Kunstobjekt wurde von einen Künstler erschaffen, der durch einen String repräsentiert wird. Eine Malerei ist ein Kunstobjekt und zeichnet sich durch ihren Untergrund aus, welcher als String gespeichert wird. Ein Portrait ist eine Malerei, deren Alter (in Jahren) von Interesse ist. Eine Zeichnung ist ein Kunstobjekt, bei dem die Breite ihrer Linien wichtig ist, welche in Millimetern angegegeben wird. Eine Bildhauerei ist ein Kunstobjekt, das sich durch das verwendete Material auszeichnet, welches als String dargestellt wird. Eine Skulptur ist eine Bildhauerei, die mit einem Werkzeug herausgeschlagen wird. Hier ist der Name des Werkzeugs von Interesse. Eine Plastik ist eine Bildhauerei, die gegossen wird. Hier ist das Volumen (in Litern) der Plastik von Bedeutung. Portraits und Zeichnungen lassen sich an der Wand befestigen. Dazu stellen sie die Methode void aufhaengen() zur Verfügung. Bildhauereien lassen sich an ihren Platz rücken und bieten dazu die Methode void verruecken() an. Jedes Kunstobjekt ist entweder eine Malerei, eine Zeichnung oder eine Bildhauerei. Eine Bildhauerei muss nicht zwangsläufig eine Skulptur oder Plastik sein. a) Entwerfen Sie unter Berücksichtigung der Prinzipien der Datenkapselung eine geeignete Klassenhierarchie für die oben aufgelisteten Arten von Kunstwerken. Notieren Sie keine Konstruktoren oder Selektoren. Sie müssen nicht markieren, ob Attribute final sein sollen. Achten Sie darauf, dass gemeinsame Merkmale in Oberklassen bzw. Interfaces zusammengefasst werden und markieren Sie alle Klassen als abstrakt, bei denen dies sinnvoll ist. Verwenden Sie hierbei die folgende Notation: «abstract» AbstrakteKlasse - int intattribut - long longattribut + void dosomething(int) «interface» Interface + int somefunction(long) Klasse - Object value + int otherfunction(float) + Object getvalue() Eine Klasse wird hier durch einen Kasten beschrieben, in dem der Name der Klasse sowie Attribute und Methoden in einzelnen Abschnitten beschrieben werden. Weiterhin bedeutet der Pfeil B A, dass A die Oberklasse von B ist (also class B extends A bzw. class B implements A, falls A ein Interface ist). Benutzen Sie -, um private abzukürzen, und + für alle anderen Sichtbarkeiten (wie z. B. public). 7

b) Schreiben Sie eine Java-Methode mit der folgenden Signatur: public static void galerieeinrichten(kunstobjekt[] kunstobjekte) Diese Methode soll alle Kunstobjekte, die sich an einer Wand befestigen lassen, aufhängen und alle Bildhauereien an ihren Platz rücken. Nehmen Sie dazu an, dass das übergebene Array kunstobjekte nicht null ist. 8

Aufgabe 4 (Programmieren in Java): (5 + 7 + 8 + 7 + 5 = 32 Punkte) Die Klasse DoppelListe<T> dient zur Repräsentation von Listen. Jedes Listenelement wird als Objekt der Klasse DoppelListe dargestellt. Es enthält einen Wert vom generischen Typen T, einen Verweis auf den direkten Nachfolger und zusätzlich einen Verweis auf den übernächsten Nachfolger. Der Wert wird in dem Attribut wert gespeichert, das Attribut next zeigt auf das nächste Element der Liste und das Attribut doppel zeigt auf das übernächste Element der Liste. Das letzte Element der Liste hat keinen Nachfolger, so dass dessen Attribut next auf null zeigt. Aus dem gleichen Grund zeigen die doppel-attribute des letzten und vorletzten Listenelements ebenfalls auf null. Die leere Liste stellen wir als null dar. public class DoppelListe <T > { T wert ; DoppelListe <T > next = null ; DoppelListe <T > doppel = null ; In der folgenden Graphik ist dargestellt, wie eine Liste mit den Werten A, B, C, D, E mit der Klasse DoppelListe repräsentiert wird. doppel next next next next A B C D E doppel doppel Objekte der Klasse DoppelListe sind als Kreise dargestellt, die den im wert-attribut gespeicherten Wert enthalten. Die Elemente dieser Liste sind jeweils durch das Attribut next (durchgezogene Pfeile) mit dem direkten Nachfolger verbunden. Das Attribut doppel (gestrichelte Pfeile) verbindet jedes Listenelement mit dem übernächsten Listenelement. Attribute, deren Wert null ist, werden in der Graphik nicht gezeigt. Die doppel-attribute der DoppelListe-Objekte mit den Werten D und E zeigen beide auf null, da für die entsprechenden Listenelemente kein übernächstes Element existiert. Wir definieren also, dass ein Objekt x vom Typ DoppelListe<T> eine korrekte DoppelListe ist, falls folgende beiden Eigenschaften gelten: Wenn x.next == null, dann auch x.doppel == null. Wenn x.next!= null, dann x.doppel == x.next.next. Hinweis: wird. Sie dürfen in allen Teilaufgaben davon ausgehen, dass nur auf azyklischen Listen gearbeitet 9

a) Implementieren Sie einen Konstruktor für die Klasse DoppelListe, der als erstes Argument einen Wert vom Typ T und als zweites Argument eine weitere DoppelListe<T> bekommt. Der Konstruktor soll ein neues DoppelListe-Objekt erzeugen, dessen wert-attribut auf den Wert des ersten Arguments gesetzt wird und dessen direkter Nachfolger die im zweiten Argument übergebene DoppelListe ist. Schreiben Sie den Konstruktor so, dass auch das doppel-attribut entsprechend obiger Erklärung richtig gesetzt wird. Beachten Sie hierbei bitte, dass das zweite Argument auch null sein kann! b) Implementieren Sie die nicht-statische Methode finde in der Klasse DoppelListe<T>, die ein Argument vom Typ T übergeben bekommt. Der Rückgabewert der Methode ist das erste DoppelListe-Objekt in der aktuellen DoppelListe, dessen Wert gleich dem übergebenen Wert ist. Falls kein solches Element in der DoppelListe existiert, soll null zurückgegeben werden. Verwenden Sie dazu ausschließlich Schleifen und keine Rekursion. Verändern Sie die DoppelListe nicht durch Schreibzugriffe. Verwenden Sie für den Vergleich die in der Klasse Object vordefinierte Methode boolean equals(object obj). Hinweise: Sie dürfen davon ausgehen, dass sowohl die in der DoppelListe gespeicherten Werte als auch der übergebene Wert nicht null sind. Für diese Aufgabe brauchen Sie das doppel-attribut nicht zu verwenden! 10

c) Implementieren Sie die nicht-statische Methode pruefe in der Klasse DoppelListe<T> ohne Argumente und ohne Rückgabewert, die überprüft, ob die aktuelle DoppelListe korrekt ist (wie am Anfang der Aufgabe definiert). Falls sie nicht korrekt ist, soll eine Exception der Klasse StrukturFehlerException mit der folgenden Deklaration geworfen werden. public class StrukturFehlerException extends Exception { Verwenden Sie keine Schleifen, sondern ausschließlich Rekursion. d) Implementieren Sie die nicht-statische Methode rueckwaerts ohne Argumente in der Klasse DoppelListe<T>, die eine DoppelListe<T> zurückgibt. Das Ergebnis der Methode soll eine DoppelListe sein, die die Elemente der aktuellen DoppelListe in umgekehrter Reihenfolge enthält. Verändern Sie die aktuelle DoppelListe nicht durch Schreibzugriffe, sondern erzeugen Sie für die Rückgabe bei Bedarf eine neue DoppelListe. Hinweise: Falls Sie Ihre Lösung mit einer Schleife implementieren, so empfiehlt es sich, die Ergebnisliste schrittweise zu erzeugen, während Sie die vorderen Elemente der Eingabeliste abarbeiten. Verwenden Sie den Konstruktor aus Aufgabenteil a). 11

e) Implementieren Sie eine nicht-statische Methode filtern in der Klasse DoppelListe<T>, die eine LinkedList<T> aus dem Java-Collections Framework als Argument bekommt und eine ganze Zahl zurück gibt. Die Methode soll einen Iterator der LinkedList nutzen, um die LinkedList zu durchlaufen. Dabei sollen alle Elemente aus der LinkedList entfernt werden, die auch in der aktuellen DoppelListe vorhanden sind. Zum Entfernen der Elemente muss die Methode remove des Iterators genutzt werden. Anschließend soll die Methode zurück geben, wie viele Elemente entfernt wurden. Hinweise: Verwenden Sie die Methode finde aus Aufgabenteil b). 12