Sie sind auf Seite 1von 16

Datenstrukturen, Algorithmen und Programmierung 1

Klausur (180 min/1.3.2008)

Name: ____________________________ Matr.-Nr.: ________________________

Aufgabe 1 2 3 4 5 6 7 8 9 10 11 12 13 Gesamt
Punkte

Note: _____

Hinweis: Im Anhang zu dieser Klausur finden Sie den Programmcode der aus der Vorlesung
bekannten Klassen Knoten, Element und die in verschiedenen Aufgaben genannten
Ausnahmeklassen.

Aufgabe 1 [2 Punkte]
Das folgende Feld repräsentiert einen Heap gemäß der in der Vorlesung vorgegebenen Definition.
Geben Sie zu diesem Feld die zugehörige Baumdarstellung an.

3 12 10 20 18 11 24 22 31 19
0 1 2 3 4 5 6 7 8 9 10

1/16
Aufgabe 2 [4 Punkte]
Geben Sie die Zeichenfolge an, die durch die Methode test erzeugt wird.

public class Ober {


public void gg (Ober o) { System.out.print("A "); }
public void gg (Unter o) { System.out.print("B "); }
}

public class Unter extends Ober {


public void gg (Object o) { System.out.print("K "); }
public void gg (Ober o) { System.out.print("L "); }
public void gg (Unter u) { System.out.print("X "); }
}

public class Prog {


public static void test() {
Ober oo = new Ober();
Ober ff = new Unter();
Unter uu = new Unter();

oo.gg(ff);
oo.gg(uu);
ff.gg(ff);
ff.gg(uu);
uu.gg(ff);
uu.gg(oo);
}
}

Ausgabe: ___ ___ ___ ___ ___ ___

2/16
Aufgabe 3 [4 Punkte]
a) Überführen Sie die folgende while-Schleife in eine for-Schleife mit gleichem Ablauf,
indem Sie den vorgegebenen Programmcode ergänzen.

int i=7;
while (i>=0) {
i--;
doWork(i);
}

Ergänzen Sie hier innerhalb der Klammern:

for ( ) doWork(i);

b) Überführen Sie die folgende rekursive Methode rek in eine Methode it, die ohne einen
rekursiven Aufruf auskommtso dass für alle Eingaben e gilt: rek(e)==it(e).

public static int rek (int x) {


if (x == 0) {
return 5;
} else if (x < 0) {
return -x + rek(x+1);
} else {
return 2 * x + rek(x-1);
}
}

Ergänzen Sie hier:

public static int it (int x) {

3/16
Aufgabe 4 [6 Punkte]
a) Vervollständigen Sie die Methode fib. Die Methode fib soll folgendes leisten:
Falls die Länge des als Parameter übergebenen Feldes arr größer als 2 ist, sollen die beiden
ersten Elemente jeweils mit dem Wert 1 und in einer Schleife jedes weitere Element mit der
Summe der Werte seiner beiden Vorgänger gefüllt werden. Sonst soll arr unverändert
bleiben. In beiden Fällen wird arr zurückgegeben.

public static int[] fib (int[] arr) {

return arr;
}

b) Vervollständigen Sie die Methode skal.


Alle Elemente des Feldes arr sollen so geändert werden, dass jedes Element durch das
Produkt seines Wertes mit dem Wert der Variablen mult ersetzt wird.

public static int[][] skal (int[][] arr, int mult) {

return arr;
}

4/16
Aufgabe 5 [4 Punkte]
Implementieren Sie die rekursive Methode met, die zwei Parameter besitzt. Die Methode met
soll folgendes leisten:
• Sind einer oder beide Parameterwerte kleiner als 0, ist das Ergebnis 0,
• haben beide Parameter den Wert 0, ist das Ergebnis 0,
• wenn nur einer der beiden Parameter den Wert 0 besitzen, so ist das Ergebnis der Wert
des anderen Parameters,
• in allen anderen Fällen wird met erneut aufgerufen: Dabei erhält p1 den kleineren der
beiden Parameterwerte, p2 die Differenz zwischen dem größeren und dem kleineren
Wert.

public static int met (int p1, int p2) {

5/16
Aufgabe 6 [8 Punkte]
a) Vervollständigen Sie die Klasse Person durch die folgenden drei Methoden, deren
Signaturen schon vorgegeben sind:
• einen Konstruktor, der die Attribute name und nummer auf die entsprechenden Para-
meterwerte und das Attribut partner auf null setzt,
• eine Methode equals, die dann true liefert, wenn das Attribut nummer den
gleichen Wert wie das des Parameters besitzt, sonst false,
• eine Methode setPartner, die die entsprechende Referenz setzt und deren Rück-
gabewert den Erfolg des Setzens beschreibt. Da keine Person ihr eigener Partner sein
kann, wird in diesem Fall keine Zuweisung vorgenommen und false geliefert. Sonst
wird das Attribut partner gesetzt und true geliefert.

public class Person {


private String name;
private int nummer;
private Person partner;

public Person (String name, int nummer) {

public boolean equals(Person p) {

public boolean setPartner(Person p) {

}
}

6/16
b) Vervollständigen Sie die Klasse Studierende durch einen Konstruktor, dessen Signatur
schon vorgegeben ist, und eventuell benötigte Attribute. Der Konstruktor soll die Attribute
name, nummer und partner auf die entsprechenden Parameterwerte setzten und das
Attribut matNr auf einen intern verwalteten, eindeutigen Wert. Diese Werte sollen bei
1000 beginnen und für jedes Objekt fortlaufend um 1 erhöht vergeben werden.

public class Studierende extends Person {


private int matNr;

public Studierende (String name, int nummer, Person partner) {

}
}

Aufgabe 7 [8 Punkte]
Vervollständigen Sie die Methoden test und set.
a) Die Methode test soll true zurückgeben, falls der Wert von arr[0] größer ist als der
Wert von x, sonst soll false zurückgegeben werden. Gilt arr==null oder hat das Feld
arr die Länge 0, soll eine EmptyException geworfen werden.

static boolean test (int[] arr, int x)

7/16
b) Die Methode set soll das erste Element des Feldes arr auf das Doppelte des Wertes von
x setzen, wenn die Methode test(arr,x) das Ergebnis true liefert.
• Gilt arr==null oder hat das Feld arr die Länge 0, so soll eine UnsetException
geworfen werden.
• Die Methode test muss in der Methode set aufgerufen werden.

static void set (int[] arr, int x)

Aufgabe 8 [4 Punkte]
a) Gegeben ist der folgende binäre Suchbaum. Geben Sie alle Blätter des Baums und den
Preorder-Durchlauf an.

14
Blätter: __________________________________

8 32
Preorder: _________________________________
12 22 40

8/16
b) Fügen Sie die beiden Werte 3 und 16 in dieser Reihenfolge in jeden der unten angegebenen
binären Suchbäume ein, indem Sie die Zeichnungen entsprechend ergänzen.

8 4

6 15 22

7 9 10 23

20 1

17 32 4

19 25 40 17

Aufgabe 9 [4 Punkte]
Gegeben ist der folgende Kostengraph mit seiner – als Tabelle angegebenen – Kostenfunktion.

Kante Kosten
AB 127
B
AE 412
A AG 283
C BC 95
BD 518
D BE 452
E F BF 156
BG 194
CD 488
CE 632
G
CF 135
CG 181
EG 98
FG 282

Geben Sie die Kanten des minimalen Gerüsts in der Reihenfolge an, in der sie diesem bei der Aus-
führung des Algorithmus von Kruskal hinzugefügt werden:

_____________________________________________________________________

9/16
Aufgabe 10 [20 Punkte]
Ergänzen Sie die aus der Vorlesung bekannte Klasse Liste. Gehen Sie bei der Implementierung
davon aus, dass in der Klasse Liste keine anderen Methoden zur Verfügung stehen.
a) Implementieren Sie die Methode alleGeradenZahlen(), die alle in der Liste enthaltenen
geraden Zahlen in der Reihenfolge des Vorkommens mit System.out.println ausgibt.

class Liste {
private Element kopf, fuss;
public void alleGeradenZahlen () {

}
}

b) Implementieren Sie die Methode fuegeEin(int n, int i), die ein neues Element mit
dem Wert i in die Liste einfügt. Hat die Liste mehr als n Elemente, so soll das Einfügen
hinter dem n-ten Element erfolgen, sonst am Ende der Liste.

class Liste {
private Element kopf, fuss;
public void fuegeEin (int n, int i) {

}
}

10/16
c) Implementieren Sie die Methode loescheMaximum(), die das Element mit dem größten
in der Liste enthaltenen Wert löscht. Ist die Liste leer, geschieht nichts.

class Liste {
private Element kopf, fuss;
public void loescheMaximum() {

}
}

11/16
Aufgabe 11 [20 Punkte]
Ergänzen Sie die aus der Vorlesung bekannte Klasse BST, die einen binären Suchbaum realisiert.
Gehen Sie bei der Implementierung der geforderten Methoden davon aus, dass Ihnen in der Klasse
BST keine anderen Methoden zur Verfügung stehen.
a) Implementieren Sie die Methode alleGeradenZahlen(Knoten k), die alle im
Teilbaum mit der Wurzel k enthaltenen geraden Zahlen in absteigender Folge mit
System.out.println ausgibt.

class BST {
private Knoten wurzel;
public void alleGeradenZahlen (Knoten k) {

}
}

b) Implementieren Sie eine Methode kantenzahl(Knoten k), die die Anzahl der Kanten in
dem Teilbaum mit der Wurzel k zurückgibt.

class BST {
private Knoten wurzel;
public int kantenzahl (Knoten k) {

}
}

12/16
c) Der Abstand eines Knotens k zu einem Blatt b ist für alle Blätter definiert, zu denen ein Pfad
von k zu b existiert. Dann ist der Abstand gleich der Zahl der Kanten zwischen k und b auf
diesem Pfad. Ist der Knoten selbst ein Blatt, so hat der Abstand den Wert 0.

Die Methode minimalerAbstand(Knoten k) soll zurückgeben, wie groß für den als
Parameter übergebenen Knoten k der Abstand zu seinen Blättern mindestens ist. Es soll also
der Abstand zwischen dem Knoten und dem nächstgelegenen Blatt ermittelt werden. Falls
k==null gilt, so wird -1 zurückgegeben.

Implementieren Sie die Methode minimalerAbstand.

class BST {
private Knoten wurzel;
int minimalerAbstand(Knoten k) {

}
}

13/16
Aufgabe 12 [8 Punkte]
Gegeben sind das Interface Betrag und die Klasse Preis. Programmieren Sie eine Klasse
Rabatt, die jedes Objekt dekorieren kann, das zu einer Klasse gehört, die Betrag implementiert.
Die Klasse Rabatt soll einen ganzzahligen Prozentsatz verwalten, der beim Aufruf der Methode
berechneBetrag von dem berechneten Betrag des dekorierten Objekts abgezogen wird.

public interface Betrag {


int berechneBetrag();
}

public class Preis implements Betrag {


int derPreis;
public Preis(int p) { derPreis = p>=0 ? p : 0; }
public int berechneBetrag() { return derPreis; }
}

public class Rabatt

14/16
Aufgabe 13 [8 Punkte]
Gegeben ist das Interface Dynamic.
Programmieren Sie die Klasse Adapter, die das Interface Dynamic implementiert.
• Die Klasse Adapter nutzt das vorgegebene Feld der Klasse Object.
• Die Methode get liefert die Referenz an der Position i von f.
• Die Methode set setzt die Referenz t an der Position i von f.
• Wird beim Aufruf der Methode set ein zu großer Index i benutzt, so soll das
vorhandene Feld durch ein neues Feld mit genau der benötigten Größe ersetzt und mit
den vorhandenen Werten gefüllt werden, so dass set ausgeführt werden kann.
• In allen anderen Fällen, in denen der Index i beim Aufruf von get und set die
Grenzen des Feldes f verletzen würde, wird eine IndexException geworfen.

public interface Dynamic<T> {


T get(int i) throws IndexException;
void set(int i, T t) throws IndexException;
}

Ergänzen Sie hier:


public class Adapter

{
Object[] f = new Object[0];

15/16
Anhang – Ausnahmeklassen:
public class EmptyException extends Exception {}
public class UnsetException extends Exception {}
public class IndexException extends Exception {}

Anhang – Programmcode der Klasse Knoten

class Knoten {
private int wert;
private Knoten links, rechts;
public Knoten(int i) { wert = i; links = rechts = null; }
public void setzeWert(int i) { wert = i; }
public int gibWert() { return wert; }
public void setzeLinks(Knoten k) { links = k; }
public Knoten gibLinks() { return links; }
public void setzeRechts(Knoten k) { rechts = k; }
public Knoten gibRechts() { return rechts; }
}

Anhang – Programmcode der Klasse Element

class Element {
private int wert;
private Element weiter;
public Element(int i) { wert = i; weiter = null; }
public Element(int i, Element e) { wert = i; weiter = e; }
public void setzeWert(int i) { wert = i; }
public int gibWert() { return wert; }
public void setzeWeiter(Element e) { weiter = e; }
public Element gibWeiter() { return weiter; }
}

16/16