Fakultät für Mathematik und Informatik Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann FernUniversität in Hagen D-58084 Hagen (Name, Vorname) (Straße, Nr.) (PLZ) (Wohnort) (Land, falls außerhalb Deutschlands) Kurs 1618 SS 2006 Einführung in die objektorientierte Programmierung Klausur am 29.07.2006 Klausurdauer: 3 Stunden Lesen Sie zuerst die Hinweise auf der Rückseite! Matrikelnummer: Geburtsdatum:.. Klausurort:... Aufgabe 1 2 3 4 5 6 7 Summe habe bearbeitet maximal 17 18 20 10 15 10 10 100 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 Nachklausur findet am 23.09.2006 statt. Hagen, den im Auftrag 2006 FernUniversität in Hagen
Hinweise zur Bearbeitung 1. Prüfen Sie die Vollständigkeit Ihrer Unterlagen. Die Klausur umfasst: 1 Deckblatt, 7 Aufgaben auf Seite 1 bis Seite 10. Geben Sie diese Unterlagen zusammen mit Ihren Lösungen später bitte vollständig ab, einschließlich Aufgabenstellung. 2. Füllen Sie jetzt bitte zuerst das Deckblatt aus: Name, Vorname und Adresse, Matrikelnummer, Geburtsdatum und Klausurort. 3. Schreiben Sie Ihre Lösungen mit Kugelschreiber oder Füllfederhalter (kein Bleistift) auf eigenes Papier. Kreuzen Sie die bearbeiteten Aufgaben auf dem Deckblatt an. Schreiben Sie unbedingt auf jedes Blatt Ihrer Lösungen die Aufgabennummer, Ihren Namen und Ihre Matrikelnummer. 4. Es sind keine Hilfsmittel zugelassen. 5. Lesen Sie vor der Bearbeitung einer Aufgabe den gesamten Aufgabentext sorgfältig durch. 6. Achten Sie darauf, dass Sie bei Programmieraufgaben Ihre Lösungen sinnvoll kommentieren; es könnten Ihnen sonst Punkte abgezogen werden. 7. Es sind maximal 100 Punkte erreichbar. Wenn Sie mindestens 40 Punkte erreichen, haben Sie die Klausur mit Sicherheit bestanden. 8. Sie erhalten die korrigierte Klausur zurück zusammen mit einer Bescheinigung für das Finanzamt und ggf. dem Übungsschein. 9. Legen Sie jetzt noch Ihren Studentenausweis und einen amtlichen Lichtbildausweis bereit, dann kann die Arbeit beginnen. Viel Erfolg!
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 1 Aufgabe 1: Objektorientierte Grundkonzepte (17 Punkte) a) Erläutern Sie das Grundmodell der Objektorientierten Programmierung. (4 Punkte) b) Erläutern Sie die Begriffe Klassifikation, Klasse und Vererbung, sowie deren Zusammenhang. (4 Punkte) c) Erläutern Sie die Begriffe Abstraktion und Spezialisierung im Zusammenhang mit Klassenhierarchien. (3 Punkte) d) Legen Sie anhand von mindestens drei Charakteristika den Unterschied zwischen Wert und Objekt dar. (3 Punkte) e) Was versteht man unter Kapselung? (3 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 2 Aufgabe 2: Fortgeschrittene objektorientierte Konzepte (18 Punkte) a) Erklären Sie die Begriffe Typ und Typhierarchie. (4 Punkte) b) Erklären Sie das Substitutionsprinzip. (2 Punkte) c) Vergleichen Sie Subtyping mit Vererbung. (4 Punkte) d) Erklären Sie die Begriffe Polymorphismus und dynamische Bindung, sowie deren Zusammenhang. (4 Punkte) e) Erläutern Sie die Begriffe Kontra- und Kovarianz. (4 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 3 Aufgabe 3: Quickies in Java (20 Punkte) a) Der Einstiegspunkt in ein Java-Programm ist üblicherweise die folgende Methode: public static void main( String[] args ) Erklären Sie kurz die Bestandteile public, static und void der Methodensignatur. (3 Punkte) b) Erläutern Sie den Unterschied zwischen implements und extends in Java. (3 Punkte) c) Welche zwei grundlegend verschiedene Arten von Exceptions gibt es in Java? Diskutieren Sie für jede Art eine Ihnen bekannte Exception aus der Standardbibliothek und wie man diese Ausnahmen in einem Java-Programm behandelt. (4 Punkte) d) Kompiliert folgendes Programm? public interface SomeInterface { public class SomeClass implements SomeInterface { public class Main { public void donothing() { SomeInterface foo = new SomeClass(); SomeClass bar = foo; Begründen Sie ihre Antwort und korrigieren Sie gegebenenfalls das Programm. (2 Punkte) e) Was bedeutet das Schlüsselwort final und wo kann es überall vorkommen? (3 Punkte) f) Was bedeutet der Aufruf super(..) und wo kann er vorkommen? (2 Punkte) g) Was bedeutet der Modifier synchronized? (3 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 4 Aufgabe 4: Vererbung und Polymorphismus (10 Punkte) a) Gegeben sei die folgende Klasse Auto: public class Auto { protected double neuwagenpreis; protected int baujahr; protected String modell; public Auto(double neuwagenpreis, int baujahr, String modell) { this.neuwagenpreis = neuwagenpreis; this.baujahr = baujahr; this.modell = modell; public double getpreis() { return preis; Erweitern Sie diese Klasse so, dass eine neue Klasse GebrauchtAuto entsteht, die zusätzlich die bereits gefahrenen Kilometer speichert. Schreiben Sie den dazu notwendigen Konstruktor und überschreiben Sie die Methode double getpreis() so, dass nach jeweils 20000 gefahrenen Kilometern der Neuwagenpreis des Wagens um 10% sinkt. Beachten Sie, dass der Händler einen Mindestpreis von 2000 für jeden Gebrauchtwagen angesetzt hat. (6 Punkte) b) Gegeben sei nun die folgende main()-methode: public class AutoHaendler { public static void main ( String[] args ) { GebrauchtAuto auto1 = new GebrauchtAuto(20000, 2002, "Audi TT", 70000); System.out.println("Preis:"+ auto1.getpreis()); Auto auto2 = auto1; System.out.println("Preis:"+ auto2.getpreis()); Geben Sie an, welche Methoden-Implementierungen bei auto1.getpreis() und bei auto2.getpreis() aufgerufen werden und wie die Ausgabe aussieht. Begründen Sie Ihre Antwort. (4 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 5 Aufgabe 5: Rekursive Programmierung (15 Punkte) a) Der binäre Baum ist eine besondere Baumstruktur. Er definiert sich dadurch, dass jeder Knoten (= Element des Baums) maximal zwei Nachfolger haben darf. Beim binären Baum unterscheidet man zwischen der Wurzel, den inneren und äußeren Knoten. Die Wurzel ist der Grundknoten des Baumes, da sie keinen Vorgänger besitzt. Wenn der Zeiger auf die Wurzel leer ist, ist der Baum leer. Äußere Knoten nennt man jene, welche keine Nachfolger haben. Diese Knoten befinden sich auf der untersten Ebene eines Baumes und die Referenzen auf den linken und rechten Nachfolgeknoten sind bei diesen Knoten leer. (10 Punkte) class Binaerbaum { protected Knoten wurzel=null; protected class Knoten { Element wert; Knoten links, rechts; Knoten (Element wert, Knoten links, Knoten rechts) { this.wert = wert; this.links = links; this.rechts = rechts; public String tostring() { return wert.getvalue(); public boolean isempty() { return (wurzel==null); class Element { private int value; Element(int value) { this.value = value; public int compareto(element e) { if ( e.getvalue() < this.value) { return 1; else if ( e.getvalue() > this.value) { return -1; else { return 0; public int getvalue() { return value; Implementieren Sie eine Methode public boolean insert(element e), die Elemente in den Baum einfügt. Eine Instanz e 1 der Klasse Element wird als neuer Knoten im linken Teilbaum eines bestehenden Knotens, welcher eine Instanz e 2 der Klasse Element beinhaltet, eingefügt, wenn e 1.getV alue() < e 2.getV alue(). Im Falle von e 1.getV alue() > e 2.getV alue() wird das Element e 1 im rechten Teilbaum eingefügt.
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 6 Herrscht Gleichheit, so soll die Funktion false zurückliefern. Als Grundlage benutzen Sie obigen Code. b) Ein binärer Baum kann auf verschiedene Arten durchlaufen werden, so dass jeder Knoten genau einmal besucht wird. Die wohl wichtigste Durchlaufart ist die sogenannte Inorder- Traversierung, welche folgender Definition folgt: Für jeden Knoten k: Besuche den linken Teilbaum des Knotens k. Besuche k. Besuche den rechten Teilbaum des Knotens k. Implementieren Sie auf Basis des obigen Codes eine Methode public String printinorder(), die die im Binärbaum gespeicherten Werte als String in einer Inorder-Reihenfolge zurückliefert. (5 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 7 Aufgabe 6: I/O mit Java (10 Punkte) Schreiben Sie ein Java-Programm, um zu bestimmen, ob zwei aufeinander folgende, per Tastatur eingegebene Zeilen Palindrome voneinander darstellen, d.h. dieselben Zeichen in umgekehrter Reihenfolge enthalten. Groß- und Kleinschreibung soll hierbei ignoriert werden. Nachdem das Ergebnis ausgegeben wurde, beendet sich das Programm. Bekannte Beispiele für Palindrome sind Otto oder Regal und Lager. Hinweis: Für diese Aufgabe stehen Ihnen insbesondere die im Anhang aufgeführten Klassen zur Verfügung. Natürlich können Sie auch andere Ihnen bekannte Klassen aus dem JDK benutzen.
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 8 Aufgabe 7: Sortieren mit Java (10 Punkte) Schreiben Sie ein Java-Programm, welches eine Datei einliest, die Zeilen in aufsteigender Reihenfolge sortiert und in eine neue Datei schreibt. Ein- und Ausgabedatei werden als Parameter an das Programm übergeben. Benutzen Sie eine Klasse Line, die das Verwalten von eingelesenen Zeilen übernimmt, d.h. eine Instanz dieser Klasse speichert eine Zeile der Eingabedatei. Die Klasse Line soll das Interface Comparable implementieren, also die Methode int compareto(object l) zur Verfügung stellen. Seien l 1 und l 2 Instanzen der Klasse Line, so muss die Methode int compareto(object l), aufgerufen durch l 1.compareT o(l 2 ), folgendes Verhalten zeigen. Groß- und Kleinschreibung soll hierbei ignoriert werden. a) Seien l 1 und l 2 gleichlang, dann ist l 1 größer als l 2, wenn das erste Zeichen von l 1, in dem sich l 1 von l 2 unterscheidet, weiter hinten im Alphabet zu finden ist. b) Seien l 1 und l 2 gleichlang, dann ist l 1 kleiner als l 2, wenn das erste Zeichen von l 1, in dem sich l 1 von l 2 unterscheidet, weiter vorne im Alphabet zu finden ist. c) Seien l 1 und l 2 gleichlang, dann ist l 1 gleich l 2, wenn sich l 1 und l 2 nicht voneinander unterscheiden. d) Sei l 1 länger als l 2, dann ist l 1 größer als l 2, wenn das erste Zeichen von l 1, in dem sich l 1 von l 2 unterscheidet, weiter hinten im Alphabet zu finden ist oder l 2 vollständig als Präfix in l 1 enthalten ist. Andernfalls ist l 1 kleiner als l 2. e) Sei l 1 kürzer als l 2, dann ist l 1 größer als l 2, wenn das erste Zeichen von l 1, in dem sich l 1 von l 2 unterscheidet, weiter hinten im Alphabet zu finden ist. Andernfalls ist l 1 kleiner als l 2. Beispielsweise gilt Abc < abd, Aaa < aaaa oder aaaabaaa < aaaac. Hinweis: Für diese Aufgabe stehen Ihnen insbesondere die im Anhang aufgeführten Klassen zur Verfügung. Natürlich können Sie auch andere Ihnen bekannte Klassen aus dem JDK benutzen.
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 9 ANHANG package java.io; public class BufferedReader extends java.io.reader { //Erzeugt einen neuen BufferedReader, der seine Daten aus in bezieht. //Der Puffer hat eine voreingestellte Größe von 8.192 Zeichen. public BufferedReader(Reader in); //Schließt den Stream. //Exception: IOException public void close(); //Liest ein Zeichen und liefert es in der Unicode-Codierung zurück. //Der Rückgabewert ist -1, falls das Ende des Streams erreicht ist. //Exception: IOException public int read(); //Liest eine Textzeile aus dem Stream. Als Zeilenende-Sequenz //wird \r, \n (UNIX) oder "\r\n" (Windows) akzeptiert. public String readline(); package java.io; public class InputStreamReader extends java.io.reader { //Erzeugt einen neuen InputStreamReader, der die aus in gelesenen Bytes nach der //standardmäßigen Codierung der Plattform in Unicode-Zeichen konvertiert. public InputStreamReader(InputStream in); package java.lang; public interface Comparable { //Vergleicht dieses Objekt mit o. Der Rückgabewert ist kleiner als null, null oder größer als null, //je nachdem, ob dieses Objekt im Sinne der Ordnung kleiner, gleich oder größer als o ist. //Die Implementierung muss Asymmetrie und Transitivität sicherstellen, d. h.: //* Wenn a < b, dann nicht a > b //* Wenn a < b und b < c, dann auch a < c. public int compareto(object o); package java.lang; public final class String { //Liefert das Zeichen aus dem String, das an der Position index steht. // index wird hierbei von Null an gezählt. public char charat(int index); //Liefert die Länge des Strings. public int length(); //Liefert einen neuen String, in dem alle Großbuchstaben gemäß den //länderspezifischen Einstellungen in Kleinbuchstaben umgewandelt sind. public String tolowercase(); //Liefert einen neuen String, in dem alle Kleinbuchstaben gemäß den //länderspezifischen Einstellungen in Großbuchstaben umgewandelt sind. public String touppercase();
Klausur zum Kurs 1618 im Sommersemester 2006 am 29.07.2006 10 package java.io; public class File { // Erzeugt eine neue Instanz der Klasse File, mit der Datei, die unter pathname zu finden ist. public File(String pathname); package java.io; public class FileWriter { //Erzeugt eine neue Instanz der Klasse FileWriter, die in die über filename referenzierte Datei schreibt. // append gibt an, ob Daten an die bestehende Datei angehängt werden sollen //oder ob die Datei überschrieben wird FileWriter(String filename, boolean append); package java.io; public class FileReader { //Erzeugt eine neue Instanz der Klasse FileReader, die aus der in file referenzierten Datei liest. FileReader(File file); package java.util; public class Collections { //Sortiert die Einträge in der Liste list. Dazu wird die compareto-methode benutzt. public static void sort(list list);