Unterlagen und Hilfsmittel sind nicht zugelassen. Kommunikation während der Klausur ist nur mit dem Dozenten erlaubt, der Missverständnisse und Unklarheiten klären kann. Schreiben Sie die Lösungen auf diese Blätter, bzw. auf ein nummeriertes leeres Blatt mit Ihrem Namen; kennzeichnen Sie die Aufgabennummer eindeutig. Geben Sie alle Blätter ab. Für falsche oder nicht einleuchtende Lösungen bekommen Sie grundsätzlich keine Punkte. Wenn aber aus Ihren Notizen oder Bemerkungen ersichtlich ist, dass Ihr Gedankengang richtig war, können Sie Teilpunkte bekommen. Sie verlieren jedoch diese Möglichkeit, wenn Abschreiben oder Kommunikation während der Klausur nachgewiesen werden kann. Der Kern der Fragen wurde kursiv gesetzt.
In den letzten 15 Minuten werden keine Fragen mehr beantwortet.Klausurtermin: 11. Juli 2007 ● Rückgabe am 18. Juli 2007 in der Vorlesung
Die Klausurnote (rot) wird abwärts gerundet. Sie ergibt mit der Übungsnote (blau) gemittelt die Endnote (gelb):
Aufgabe 1. (ca. 8 Programmzeilen): Sortieren Sie Ihren tabellenartigen XML-Familienbaum (aus der Übungsaufgabe 5) nach Vornamen. Benutzen Sie dazu die Sortiermethode
static void shellSort(Comparable[] s)
aus der Vorlesung (Sie müssen diese nicht programmieren, nur aufrufen). Dazu müssen Sie alle XML-Elemente <person> des Document-Objekts (mit getDocumentElement() und getElementsByTagName(String)) zuerst in eine NodeList, dann (mit einer Zählschleife) in eine Reihung übertragen. Nach dem Sortieren sollen Sie sie in der neuen Reihenfolge im DocumentElement mit appendChild umhängen (kein removeChild ist nötig).
Um die Reihung shellSort übergeben zu können, müssen ihre Elemente Comparable implementieren. Benutzen Sie hierzu die Klasse
class Person implements Comparable<Person> { private Element person; public Person(Element person) { this.person = person; } // Konstruktor public int compareTo(Person that) { … } } // vergleicht nach <vorname> im Element
Sie müssen diese Klasse auch nicht programmieren, nur verwenden. Sie sollen also eine main-Methode schreiben, in der das DOM-Objekt mit
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(args[0]));
eingelesen wurde. Ausnahmen und import-Anweisungen können Sie vernachlässigen.
Die XML-Struktur ist dieselbe wie in der Übung: Das Wurzelelement ist <familie>; diese enthält eine Reihe von <person>-Elementen (ihre Reihenfolge soll verändert, sortiert werden), die ihrerseits unter anderen je ein <vorname>-Element enthalten (nach diesem wird sortiert, indem die obige compareTo diese vergleicht).
Die für die Lösung nötigen Methoden sind:
class Document { Element getDocumentElement(); … } class Element extends Node { NodeList getElementsByTagName(String name); … } class NodeList { int getLength(); Node item(int index); … } class Node { void appendChild(Node newNode); … }
Aufgabe 2: Programmieren Sie die Methode alleEntfernen(Element e) eines generischen Stapels (als verkettete Liste), die aus dem Stapel alle Vorkommnisse des Elements e entfernt. Die Klasse hat eine globale Variable anker vom Typ Knoten (mit den globalen Variablen Element wert und Knoten verbindung). Tipp: In einer lokalen Knoten-Variable führen Sie die Adresse des vorherigen Knotens, um den aktuellen aushängen zu können.
Aufgabe 3: Kreuzen Sie die richtigen Antworten an und geben Sie Ihre Begründung mit Stichworten dazu. Ohne Begründung gilt Ihre Antwort als falsch.
( ) Richtig In einem
generischen Multibehälter sind immer alle Elemente vom selben Typ.
( ) Falsch
Grund:
( ) Richtig Aus
Referenzgleichheit folgt Objektgleichheit.
( ) Falsch
Grund:
( ) Richtig Im MVC-Konzept
benachrichtigt Model die View-Klasse bei Veränderung von Daten,
( ) Falsch damit sie sie anzeigt.
Grund:
( ) Richtig Filterströme haben
keinen parameterlosen Konstruktor.
( ) Falsch
Grund:
( ) Richtig In einem DTD kann
definiert werden, wie XML-Daten dargestellt werden.
( ) Falsch
Grund:
( ) Richtig Nebenläufige
Prozesse in Java können ohne die Klasse
Thread nicht programmiert werden.
( ) Falsch
Grund:
( ) Richtig In einem Objekt
der Klasse java.util.Stack kann
immer nur
( ) Falsch das zuletzt eingetragene Element gelesen werden.
Grund:
( ) Richtig Shell-Sort ist
immer schneller als Bubble-Sort.
( ) Falsch
Grund:
Aufgabe 4: Eine Lösung der Übungsaufgabe 1 (WarteschlangeReihung generisch) hat folgende Datenkomponenten:
private int juengstes, aeltestes, anzahl; private Element[] inhalt;
Sie erhalten im Konstruktor die Anfangswerte groesse-1 (Konstruktorparameter), 0, 0 sowie (Element[])new Object [groesse], und sie werden durch die Mutatoren eintragen bzw. entfernen verändert:
anzahl++; juengstes = (juengstes + 1) % inhalt.length; inhalt[juengstes] = element; anzahl--; aeltestes = (aeltestes + 1) % inhalt.length;
Zeichnen Sie nun das Objektdiagramm (mit allen Objekten und Variablen) nach dem Ablauf des Programmausschnitts
WarteschlangeReihung<Integer> w = new WarteschlangeReihung<Integer>(5); w.eintragen(1); w.eintragen(2); w.eintragen(3); w.entfernen(); w.entfernen(); w.eintragen(4); w.eintragen(5); w.eintragen(6); w.entfernen();
Aufgabe 5: Programmieren Sie die eintragen-Methode einer dehnbaren Warteschlange als Reihung. Sie wirft keine VollAusnahme bei voller Reihung, sondern verdoppelt seinen Datenspeicher bei Bedarf. Die Daten und die Funktionsweise entnehmen Sie aus der Aufgabe 4.