Klausur Pr22 SS'07

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. Bei manchen Aufgaben steht als Orientierung der Anzahl der Programmzeilen in der Musterlösung. In den letzten 15 Minuten werden keine Fragen mehr beant­wor­tet.

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 <per­son> 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 Stich­worten 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 Funktions­wei­se entnehmen Sie aus der Aufgabe 4.