Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Prüfungen im Bachelor-Studium (1. - 5. Semester) » aud » Forendiskussionen

Dies ist eine alte Version des Dokuments!


Forendiskussionen

Lösungsversuch

Aufgabe 1 - Wissensfragen

a) Falsch, der finally-Block wird immer ausgeführt (abgesehen von einigen extrem konstruierten Ausnahmen, siehe hier)

b) Antwort RO ist richtig: Stark zusammenhängend

c) 2. Antwort ist richtig: Preorder

d) Richtig

e) Richtig, beispielsweise wenn sich die Werte für BucketSort eignen

f) (unsicher)

  • f ist linear rekursiv
  • g ist iterativ

g) Antwort RO und LU sind richtig

h) Falsch, dies ist die grundlegende AVL-Eigenschaft

Aufgabe 2 - Graphen

a)

Adjazenzmatrix
S A B C D E
S - + + - - -
A - - - + + -
B - - - - + -
C - - - - - +
D - - - + - +
E - - - - - -
Graphische Darstellung

:pruefungen:bachelor:aud:02-12-graph.png

Als Reihung
0 1 2 3 4 5 6 7 8 9 10 11 12 13
6 8 10 11 12 14 1 2 3 4 4 5 3 5

b)

Tiefensuche: S → A → C → E → D → B

Breitensuche: S → A → B → C → D → E

c)

Vorüberlegungen:
Die Aufgabenstellung ist das Färben eines Graphen mit den Farben schwarz und grau. Die Farbe weiß bedeutet lediglich, dass dieser Knoten noch gar nicht gefärbt wurde. Bei dem Verfahren soll Breitensuche verwendet werden.

Elementare Erkenntnis hierbei:
Hat ein Knoten zwei (oder mehr) Nachbarn, die verschiedene Farben haben, so kann der aktuelle Knoten nicht gefärbt werden, ohne dass er die gleiche Farbe wie mindestens ein Nachbarknoten erhält.
Das bedeutet: Hat ein Knoten mindestens einen Nachbarn, der grau ist und mindestens einen, der schwarz ist, so lässt sich der Graph nicht färben und das Verfahren soll mit dem Rückgabewert „false“ terminieren.

// Solange es noch unbesuchte Knoten gibt
while(!q.isEmpty()) {
	// Aktuellen Knoten aus der Queue entnehmen:
	// Dieser Knoten ist noch WHITE und soll nun korrekt gefärbt werden
	Node current = q.removeFirst();
 
	// Variable für die Farbe der Nachbarn, zunächst WHITE (d.h. uninitialisiert)
	Color neighborColor = WHITE;
 
	// Gehe alle Nachbarknoten einmal durch
	for(Node n : neighbors) {
 
		// Ist der aktuelle Nachbarknoten WHITE, dann wurde er noch nicht besucht
		// -> Füge ihn der Queue hinzu
		if(n.color == WHITE) {
			q.addLast(n);
 
		// Ist der aktuelle Knoten nicht WHITE, dann wurde er schon besucht
		// und ist entweder BLACK oder GRAY
		} else {
			// Ist die Variable für die Farbe der Nachbarn noch nicht
			// gesetzt (d.h. WHITE), dann initialisiere sie
			if(neighborColor == WHITE)
				neighborColor = GRAY;
 
			// Hat der aktuelle Knoten eine andere Farbe, als die bisher
			// betrachteten Nachbarknoten, dann ist der Graph nicht färbbar
			if(n.color != neighborColor)
				return false;
		}
 
		// Färbe den Knoten korrekt ein und markiere ihn so als besucht
		// Die Farbe muss das Gegenteil der Farbe der Nachbarn sein!
		// Gab es keine Färbung der Nachbar, so wird der Knoten BLACK
		current.color = (neighborColor == BLACK) ? GRAY : BLACK;
	}
}

Aufgabe 3 - Schreibtischlauf

ad.a bd.b gd.a be.a ee.a
AA 12 AA 12 AE
ad.f(91) bd.f(92) gd.f(93) be.f(95) ee.f(96)
23 92 23 95 CE
gd.g(83)
FC
gd.g(„YC“)
GC

Programm zum selber Testen: Walkthrough.java

Aufgabe 4 - Sortieren

a)

private void versickern(Knoten k) {
	Knoten groesser = null;
 
	if(links == null && rechts == null)
		return;
 
	if(links != null && rechts != null)
		groesser = (links.wert > rechts.wert) ? links : rechts;
 
	if(links != null) {
		groesser = links;
	} else {
		groesser = rechts;
	}
 
	if(k.wert > groesser.wert)
		return;
 
	if(groesser == null) {
		return;
	}
 
	vertausche(k, groesser);        
	versickern(groesser);
}

b)

private void erzeugeHalde(Knoten k) {
 
       if(k.left != null){
           erzeugeHalde(k.left);
       }
 
       if(k.right !=null){
           erzeugeHalde(k.right);
       }
 
       versickern (k);
 
} 

c)

public Knoten inListeSortieren() {
    // Kann leere Halde nicht sortieren
    if (wurzel == null)
        return null;
 
    // Max-Heap-Eigenschaft herstellen
    erzeugeHalde(wurzel);
 
    // Wurzel entnehmen und zum Kopf unserer Liste machen
    Knoten kopf = entferneMax();
    Knoten schlepp = kopf;
 
    // Wiederholt Wurzel entnehmen und an Liste anhängen
    while(wurzel != null) {
        Knoten tmp = entferneMax();
        schlepp.rechts = tmp;
        schlepp = tmp;
    }
 
    // Kopf unserer Liste zurückgeben
    return kopf;
} 

Aufgabe 5 - ADT

a)

double letzte(String lort){
   Table next = this;
 
   while(next.ort != lort){
      next = next.naechster;
   }
 
   if (next.ort == lort){
      return next.wert;
   }
   return 0;
}''

b)

ops

meth: → Double

axs

meth(leer) = 0

meth(in(tab, ort, wert)) = meth(tab)+wert

c)

ops

filter: Tabelle x String → Tabelle

axs

filter (leer, ort) = leer

filter (in (tab, ort, wert), ort2) = entweder a oder b:

a) filter (tab, ort2) für ort != ort2

b) in (filter (tab, ort2), ort2, wert) sonst

Aufgabe 6 - UML

a) Komposition

b)

class Buch {
    protected static int medienZaehler;
    public String name;
    private String autor;
    public void Buch(String name, String autor) { }
    public static int gibMedienZaehler() { }
    public String gibAutor() { }
}

c) TODO

d) TODO

Aufgabe 7 - Formale Verifikation

a)

rechts oben: 
ret = Ω_i && i <= n
//gruesse Gaku :)

b)

P => I
 
wp (" ret = 1; i = 1; " , ret = Ω_i && i < = n )
= wp (" ret = 1; " , ret = Ω_1 && 1 < = n )
= (ret = 1 && 1 < = n)
=> True
//gruesse Gaku :)

c)

I & nicht b => Q
 
[ ret = Ω_i && i <= n ]  & ( i >= n) 
= [ ret = Ω_i && i = n ]
= [ ret = Ω_n ]
= Q
Bei der Lösung bin ich mir aber nicht 100% sicher. Inhaltlich stimmt sie schon, aber ob das auch so gefragt war?
//gruesse Gaku :)

d)

'V = - i + n'
Da i steigt => monotonfallend!
Da i immer < = n ist = > ungleich null!
//gruesse Gaku :)