Unterlagen und Hilfsmittel sind nicht zugelassen. Kommunikation während der Klausur ist nur mit dem Dozenten erlaubt, der Mißverständnisse und Unklarheiten klären kann. Schreiben Sie die Lösungen auf diese Blätter bzw. auf ein numeriertes leeres Blatt mit Ihrem Namen; kennzeichnen Sie die Aufgabennummer eindeutig. Geben Sie alle Blätter (auch die Schmierblä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, daß 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 Orientierungder Anzahl der Programmzeilen in der Musterlösung. In den letzten 15 Minuten werden keine Fragen mehr beantwortet. Jede Aufgabe ist 40 Punkte wert.

Klausurtermin: 22. Januar 2000

Die Klausurnote (rot) wird abwärts gerundet. Sie ergibt mit der Übungsnote (blau) gemittelt die Endnote (gelb):


Aufgabe 1. (ca. 20 Programmzeilen): Eine Liste aus Ganzzahlelementen zu normalisieren bedeutet, alle ihre Elemente auf Werte zwischen –n und n zu setzen (n ist Parameter der Normalisierung, z.B. 100) so, dass das Verhältnis der Elemente zueinander (bis auf den Rest der Ganzzahldivision) bleibt. Dies kann in zwei Schritten durchgeführt werden: Zuerst muss das Element mit dem maximalen absoluten Wert (d.h. ohne Vorzeichen) gefunden werden, dann müssen alle Elemente mit n multipliziert und mit diesem (positiven) Wert dividiert werden. Beispielsweise ergibt die Liste {1543, -5683, -10000, 328} auf 100 normalisiert {15, -56, -100, 3} (multipliziert mit 100 und dividiert durch das maximale Element 10000).

Erweitern Sie nun die Klasse GanzWSReihung aus der Übung um die Methode

public void normalisieren(int n);

Die Datenstruktur der Klasse ist:

public class GanzWSReihung {
	protected int[] inhalt;
	protected int aeltestes, juengstes, anzahl;
	...

Aufgabe 2. Zeichnen Sie das Einfügen in eine verkettete Liste nach einem gegebenen Knoten:

public class Liste {
	public class Knoten {
		private Object wert;
		private Knoten verbindung;
		public Knoten(Object w, Knoten v) { wert = w; verbindung = v;	}
	}
	private Knoten anker; ...
	public void einfuegen (Knoten wohin, final Element wert) {
		Knoten neu = new Knoten(wert, wohin.verbindung);
		wohin.verbindung = neu;
	}
}

Ihre Zeichnung soll den Zustand der Liste vor und nach dem Einfügen darstellen. Bedenken Sie auch den Fall

wohin.verbindung == null

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 Die Datei iostream.h enthält ein C++-Modul.
( ) Falsch

Grund:

( ) Richtig Die Knoten-Klasse einer rückwärts verketteten Liste kann auch für eine doppelt verkettete
( ) Falsch Liste benutzt werden.

Grund:

( ) Richtig Die Anzahl der Elemente in der Reihung-Implementierung eines Multibehälters kann
( ) Falsch nach der Erzeugung des Multibehälter-Objekts nicht mehr verändert werden.

Grund:

( ) Richtig In C++ kann man Objekte auch ohne new erzeugen.
( ) Falsch

Grund:

( ) Richtig Eine for-Schleife (in Java und in C++) ist garantiert keine Endlosschleife.
( ) Falsch

Grund:

( ) Richtig Operanden von Operatoren können in Java nur Variablen, in C++ auch Objekte sein.
( ) Falsch

Grund:

( ) Richtig Durch die Vereinbarung int[] reihung; entsteht keine Reihung.
( ) Falsch

Grund:

( ) Richtig Zwei String-Objekte referiert durch z1 und z2 können die gleiche Zeichenkette enthalten,
( ) Falsch auch wenn der Vergleich z1 == z2 das Ergebnis false liefert.

Grund:


Aufgabe 4. (4 Programmzeilen): Erweitern Sie die Schnittstelle lehrbuch.kapitel8.PositionierbareListe (es ist nicht notwendig, sie zu kennen) um Operationen, mit denen die Summe und die Differenz zweier Listen errechnet werden kann.


Aufgabe 5. (4 Programmzeilen): Die folgende fehlerhafte Funktion soll die Summe der ersten n Zahlen berechnen:

public int summe(final int n) {
	return n + summe(n-1);
}

Beschreiben Sie den Fehler und korrigieren Sie die Funktion.