Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann _________________________________________________________ (Name, Vorname) _________________________________________________________ _________________________________________________________ (Straße, Nr.) ______________ (PLZ) ________________________________________ (Wohnort) _________________________________________________________ (Land, falls außerhalb Deutschlands) Kurs 01618 Einführung in die objektorientierte Programmierung (Kursdurchführung des Sommersemester 2016) Nachklausur am 18.03.2017 Zweistündige Klausur (10.00 – 12.00 Uhr) Lesen Sie zuerst die Hinweise auf der folgenden Seite! Matrikelnummer: Geburtsdatum: . . Klausurort: _________________________ Aufgabe 1 2 3 4 5 6 7 8 Summe 10 10 10 10 10 10 10 10 80 habe bearbeitet maximal erreicht Korrektur ○ Herzlichen Glückwunsch, Sie haben die Klausur bestanden. Note: .......... ○ Sie haben die Klausur leider nicht bestanden. Für den nächsten Versuch wünschen wir Ihnen viel Erfolg. Die nächste Klausur findet im Sommersemester 2017 statt. Hagen, den 29.03.2017 Im Auftrag © 2016 FernUniversität in Hagen Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Hinweise zur Bearbeitung 1. Prüfen Sie die Vollständigkeit Ihrer Unterlagen. Die Klausur umfasst auf insgesamt 18 Seiten: 1 Deckblatt Diese Hinweise zur Bearbeitung Eine Bescheinigung zur Vorlage beim Finanzamt auf Seite 3 8 Aufgaben auf Seite 4-16 Zwei zusätzliche Seiten 17 und 18 für weitere Lösungen 2. Füllen Sie jetzt bitte zuerst das Deckblatt und (sofern gewünscht) die Bescheinigung zur Vorlage beim Finanzamt aus: Name, Vorname und Adresse Matrikelnummer, Geburtsdatum und Klausurort 3. Schreiben Sie Ihre Lösungen mit Kugelschreiber oder Füllfederhalter (kein Bleistift) direkt in den bei den jeweiligen Aufgaben gegebenen, umrahmten Leerraum. Benutzen Sie auf keinen Fall die Rückseiten der Aufgabenblätter. Versuchen Sie, mit dem vorhandenen Platz auszukommen; Sie dürfen auch stichwortartig antworten. Sollten Sie wider Erwarten nicht mit dem vorgegebenen Platz auskommen, benutzen Sie bitte die beiden dieser Klausur angefügten Leerseiten. Es werden nur Aufgaben gewertet, die sich auf dem offiziellen Klausurpapier befinden. Eigenes Papier ist nur für Ihre persönlichen Notizen erlaubt. 4. Kreuzen Sie die bearbeiteten Aufgaben auf dem Deckblatt an. Schreiben Sie unbedingt auf jedes Blatt Ihrer Klausur Ihren Namen und Ihre Matrikelnummer, auf die Zusatzblätter auch die Nummer der Aufgabe. 5. Geben Sie die gesamte Klausur ab. Lösen Sie die Blätter nicht voneinander. 6. Es sind keine Hilfsmittel zugelassen. 7. Lesen Sie vor der Bearbeitung einer Aufgabe den gesamten Aufgabentext sorgfältig durch. 8. Es sind maximal 80 Punkte erreichbar. Wenn Sie mindestens 40 Punkte erreichen, haben Sie die Klausur bestanden. 9. Sie erhalten die korrigierte Klausur zurück, zusammen mit einer Bescheinigung für das Finanzamt und ggf. dem Übungsschein. 10. Legen Sie jetzt noch Ihren Studierendenausweis und einen amtlichen Lichtbildausweis bereit, dann kann die Arbeit beginnen. Viel Erfolg! Seite 2 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann BESCHEINIGUNG (zur Vorlage beim Finanzamt) Herr / Frau ________________________________________________ Matrikelnummer ________________________________________________ geboren am ________________________________________________ hat am 18. März 2017 in ________________________________________________ an der Klausur zur Lehrveranstaltung „Einführung in die objektorientierte Programmierung“ (01618) teilgenommen. gez. Sarah Lang Seite 3 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 1: Klassenimplementierung (10 Punkte) Gegeben sei das folgende Programmfragment: public class UniDemo { public static void main(String[] args) { Universitaet fernUni = new Universitaet("Hagen", 3); Mitarbeiter max = new Mitarbeiter("Max"); Mitarbeiter martina = new Mitarbeiter("Martina"); Kurs derKurs = new Kurs(1234); derKurs.betreutDurch(max); derKurs.geschriebenVon(martina); fernUni.kursAnbieten(0, derKurs); } } Geben Sie Implementierungen für die Klassen Universitaet, Mitarbeiter und Kurs an, sodass dieses Programmfragment kompiliert und bei Terminierung der main(.)-Methode das folgende Objektgeflecht erzeugt und im Speicher abgelegt wurde. Die Belegungen der Attribute sollen hierbei selbstverständlich durch die oben gezeigten Methodenaufrufe vorgenommen werden. (Fortsetzung der Aufgabe auf der folgenden Seite) Seite 4 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (Fortsetzung von Aufgabe 1) Seite 5 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Nachklausur zum Kurs 01618 im Sommersemester 2016 Aufgabe 2: Kontrollstrukturen (10 Punkte) Vervollständigen Sie das folgende Java Programm, sodass bei Terminierung der main-Methode die folgenden Zeilen auf der Konsole ausgegeben werden: Hänschen Hänschen Hänschen Hänschen klein klein klein klein Implementieren ging ging ging ging Sie allein... allein... allein... allein... dazu vier verschiedene Schleifen, die innerhalb der Methode schreiben(List<String> liste) über die Elemente des Parameters liste iterieren, und zwar: jeweils einmal mit den beiden Varianten einer for-Schleife und jeweils einmal mit den beiden Varianten einer while-Schleife. Hinweis: Jeweils eine Variante der beiden Schleifenimplementierungen nutzt aus, dass das Interface List<T> einen indizierten Zugriff ermöglicht, während die andere Variante ausnutzt, dass das Interface List<T> das Interface Iterable<T> erweitert (also Iterable<T> ein Supertyp von List<T> ist.). import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class SchleifenDemo { public static void main(String[] args) { List<String> eineListe = new ArrayList<String>(); eineListe.add("Hänschen"); eineListe.add("klein"); eineListe.add("ging"); eineListe.add("allein"); eineListe.add("..."); schreiben(eineListe); } static void schreiben(List<String> liste) { // for-Schleife mit indiziertem Zugriff auf die Elemente. (2,5 Punkte) System.out.println(); (Fortsetzung der Aufgabe auf folgender Seite) Seite 6 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (Fortsetzung von Aufgabe 2) // for-Schleife, die Iterable<String> ausnutzt. (2,5 Punkte) System.out.println(); // while-Schleife mit indiziertem Zugriff auf die Elemente. (2,5 Punkte) System.out.println(); // while-Schleife, die Iterable<String> ausnutzt. (2,5 Punkte) } } Seite 7 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 3: Überladen und Überschreiben (10 Punkte) Gegeben sei das folgende Java-Programm: class Ort {} class Weg {} class Trampelpfad extends Weg {} abstract class Sportler { void sportTreiben(Weg weg) { System.out.println("Sportler treibt Sport auf Weg."); } void gemeinsamSportTreiben(Weg weg, Läufer nachbar) { System.out.println("Sportler und Läufer treiben Sport auf Weg."); } void gemeinsamSportTreiben(Trampelpfad ort, Fahrradfahrer nachbar) { System.out.println("Sportler und Fahrradfahrer treiben Sport auf Trampelpfad."); } } class Fahrradfahrer extends Sportler { void sportTreiben(Trampelpfad pfad) { System.out.println("Fahrradfahrer treibt Sport auf Trampelpfad."); } } class Mountainbiker extends Fahrradfahrer { void sportTreiben(Trampelpfad weg) { System.out.println("Mountainbiker treibt Sport auf Trampelpfad."); void gemeinsamSportTreiben(Weg weg, Läufer nachbar) { System.out.println("Mountainbiker und Läufer treiben Sport auf Weg."); } } } class Läufer extends Sportler { void gemeinsamSportTreiben(Trampelpfad weg, Sportler nachbar) { System.out.println("Läufer und Sportler treiben Sport auf Trampelpfad."); } class Sprinter extends Läufer { void sportTreiben(Trampelpfad weg) { System.out.println("Sprinter treibt Sport auf Trampelpfad."); } } } public class VonSportlern { public static void main(String[] args) { Mountainbiker mountainbiker = new Mountainbiker(); Sprinter sprinter = new Sprinter(); Fahrradfahrer fahrradfahrer = mountainbiker; Läufer läufer = sprinter; Trampelpfad pfad = new Trampelpfad(); Weg weg = pfad; /* [1] */ } } (Fortsetzung der Aufgabe auf folgender Seite) Seite 8 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (Fortsetzung von Aufgabe 3) An der mit /* [1] */ markierten Stelle werden nun (einzeln und nacheinander) die folgenden Befehle eingefügt. Kann das Programm nun kompiliert werden? Wenn ja, geben Sie die durch diese Anweisung ausgegebene Zeile an; wenn nein: Warum nicht? mountainbiker.sportTreiben(pfad); (1 Punkt) fahrradfahrer.sportTreiben(pfad); (1 Punkt) läufer.sportTreiben(pfad); (1 Punkt) fahrradfahrer.gemeinsamSportTreiben(pfad, fahrradfahrer); (1 Punkt) mountainbiker.gemeinsamSportTreiben(weg, läufer); (1 Punkt) sprinter.gemeinsamSportTreiben(weg, läufer); (2 Punkte) läufer.gemeinsamSportTreiben(pfad, läufer); (3 Punkte) Seite 9 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 4: (Beschränkt) Parametrische Polymorphie(10 Punkte) Gegeben sei die Implementierung der folgenden main-Methode: public class TupelDemo { public static void main(String[] args) { Tupel<String, Long> t1 = new Tupel<String, Long>("Zeichenkette", 42L); System.out.println(t1.toString()); // Liefert „(Zeichenkette, 42)“. String t1ErsterWert = t1.ersterWert(); Long t1ZweiterWert = t1.zweiterWert(); Tupel<Character, Boolean> t2 = new Tupel<Character, Boolean>('?', true); System.out.println(t2.toString()); // Liefert „(?, true)“. Character t2ErsterWert = t2.ersterWert(); Boolean t2ZweiterWert = t2.zweiterWert(); } } Geben Sie eine Implementierung für die Klasse Tuple<S, T> an, sodass diese Implementierung kompiliert werden kann und durch die System.out.println(…)-Aufrufe die in den Kommentaren angegebenen Zeichenketten auf die Konsole geschrieben werden. (5 Punkte) (Fortsetzung der Aufgabe auf der folgenden Seite) Seite 10 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (Fortsetzung von Aufgabe 6) Die Klasse Tupel soll nun so verändert werden, dass 1. der erste und der zweite Wert des Tupels vom selben Typ sind; 2. die Objekte dieses Typs sortierbar sind (also miteinander verglichen werden können); 3. die in den Kommentaren angedeuteten Aufrufe der toString()-Methode die angegebenen Rückgaben erzeugen würden. (Die Kommentare sind so zu verstehen, dass ein Aufruf von ti.toString() nach der Initialisierung der Variablen ti bzw. nach dem Aufruf von ti.sortiere() die angegebene Zeichenkette zurückgäbe.) public static void main(String[] args) { Tupel<Long> t1 = new Tupel<Long>(1L, 2L); // t1.toString() gäbe „(1, 2)“ t1.sortiere(); // t1.toString() gäbe „(1, 2)“ Tupel<Long> t2 = new Tupel<Long>(4711L, 42L); // t2.toString() gäbe „(4711, 42)“ t2.sortiere(); // t2.toString() gäbe „(42, 4711)“ Tupel<String> t3 = new Tupel<String>("xy", "ab"); // t3.toString() gäbe „(xy, ab)“ t3.sortiere(); // t3.toString() gäbe „(ab, xy)“ } Hinweis: Verwenden Sie das Interface java.lang.Comparable: public interface Comparable<T> { /** Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. */ public int compareTo(T o); } (5 Punkte) Seite 11 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Aufgabe 5: Polymorphie Welche vier Arten von Polymorphie kennen Sie? Charakterisieren Sie jede Art kurz! Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (10 Punkte) (2 Punkte) (jeweils 2 Punkte) Seite 12 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 6: Lokale und anonyme Klassen (10 Punkte) Geben Sie eine kompilierbare Java-Klasse an, in der eine lokale Klasse deklariert, eine Instanz von ihr erzeugt und diese einer Variablen zugewiesen wird. (2 Punkte) Geben Sie eine kompilierbare Java-Klasse an, in der eine Instanz einer anonymen Klasse erzeugt und einer Variablen zugewiesen wird. (2 Punkte) In welchem Kontext werden anonyme Klassen in Java häufig verwendet? Warum eignen sie sich hier besonders gut? (2 Punkte) Welche Gemeinsamkeiten und welche wesentlichen Unterschiede bestehen zwischen einer lokalen und einer anonymen Klasse? (4 Punkte) Seite 13 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Nachklausur zum Kurs 01618 im Sommersemester 2016 Aufgabe 7: Threads (10 Punkte) Gegeben sei folgendes Java-Programm. import java.util.LinkedList; public class ThreadDemo { public static void main(String[] args) { Kühlschrank kühlschrank = new Kühlschrank(); kühlschrank.hineinlegen("Joghurt"); kühlschrank.hineinlegen("Käse"); kühlschrank.hineinlegen("Milch"); kühlschrank.hineinlegen("Butter"); Verbraucher Verbraucher Verbraucher Verbraucher v1 v2 v3 v4 = = = = new new new new Verbraucher(kühlschrank); Verbraucher(kühlschrank); Verbraucher(kühlschrank); Verbraucher(kühlschrank); v1.start(); v2.start(); v3.start(); v4.start(); } } class Kühlschrank { LinkedList<Object> inhalt = new LinkedList<Object>(); public Object entnehmen() { Object letztes = inhalt.getLast(); inhalt.removeLast(); return letztes; } public void hineinlegen(Object gegenstand) { inhalt.addLast(gegenstand); } } class Verbraucher extends Thread { Kühlschrank kühlschrank; Verbraucher(Kühlschrank kühlschrank){ this.kühlschrank = kühlschrank; } public void run() { Object gegenstand = kühlschrank.entnehmen(); System.out.println(gegenstand); } } (Fortsetzung der Aufgabe auf folgender Seite) Seite 14 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (Fortsetzung von Aufgabe 6) Nach einer Ausführung des Programms erscheinen die folgenden Zeilen auf der Konsole. Butter Butter Käse Joghurt Erläutern Sie, wie es hierzu gekommen ist. Hinweis: Beachten Sie, dass in der Ausgabe Butter zwei Mal, Milch hingegen gar nicht ausgegeben wird. (5 Punkte) An welcher Stelle im Programmcode liegt das Problem? (3 Punkte) Geben Sie eine alternative Implementierung an, die dieses Problem vermeidet. (2 Punkte) Seite 15 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Aufgabe 8: Programmgerüste Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (10 Punkte) Wodurch zeichnen sich Programmgerüste aus? Nennen Sie die wesentlichen Merkmale und erläutern Sie sie anhand eines Ihnen bekannten Beispiels. Seite 16 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Zusätzlicher Platz für Ihre Lösungen Ergänzung zu Aufgabe Nr. Ergänzung zu Aufgabe Nr. Seite 17 von 18 Nachklausur zum Kurs 01618 im Sommersemester 2016 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Zusätzlicher Platz für Ihre Lösungen Ergänzung zu Aufgabe Nr. Ergänzung zu Aufgabe Nr. Seite 18 von 18