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

Dies ist eine alte Version des Dokuments!


forum

Lösungsversuch

Aufgabe 1 - Wissensfragen (10P)

a) Falsch, alle Throwables können mit catch abgefangen werden, das heißt auch java.lang.Error und davon abgeleitete Klassen.
Ob ein Abfangen sinnvoll ist oder unter Umständen fehlschlagen kann (beispielsweise bei einem OutOfMemoryError unter Umständen denkbar), ist an dieser Stelle nicht gefragt.

b) Richtig, das Argument für die VM lautet „-ea“ (für „enable assertions“).

c) Richtig, Beweis siehe Vorlesung.

d)

  • f ∈ O(log n)
  • g ∈ O(n log n);

e) Richtig, denn ohne wahlfreien Zugriff muss die verkettete Liste bis zum gesuchten Element durchlaufen werden. Dass sie sortiert ist, ändert daran nichts, da besser Suchverfahren wie Binary Search wahlfreien Zugriff voraussetzen.

f) Falsch, im worst-case werden alle Felder nur genau einmal besucht, die Komplexität liegt also in O(n)

g) Richtig

h) Falsch, UML ist nicht Java-spezifisch. In andere Programmiersprachen wie beispielsweise C++ ist die Mehrfachvererbung möglich.

i) Richtig

Datei zum selber Testen: :pruefungen:bachelor:aud:rack.java.txt

Zusatzinfo:
Frage: Habe gelesen, dass man bei Generics nur die Methoden von Object aufrufen kann, hier wird aber .getTitle() aufgerufen. Ist das nicht ein Fehler? Antwort: Man kann alle Methoden die der generische Typ hat Aufrufen. Im Fall von <T> waere das in der Tat nur Methoden von Object (weil in Java alle Klassen von Object automatisch erben). Hier steht aber <T extends Book>, d.h. es koennen auch Methoden der Klasse Book aufgerufen werden, da der generische Typ von Book erben muss.

Aufgabe 2 - Bäume (20P)

a)

Adjazenzmatrix
A B C D E F G
A - + - - - - +
B + - - + + + -
C - - - + - - -
D - + + - - - -
E - + - - - - -
F - + - - - - -
G + - - - - - -
Graphische Darstellung

b)

A B C D E F G
0 1 3 2 2 2 1

c)

  • *Mengenschreibweise X = (V, E, r) mit Knotenmenge V , Kantenmenge E und Wurzel r V = {A, B, C, D, E, F, G} E = {(A,B), (A,G), (B,D), (B,E), (B,F), (D,C)} r = A d) Zunächst einmal muss man sich klar machen, dass ein Graph genau dann ungerichtet ist, wenn die Adjazenzmatrix sowohl den Eintrag (A,B) als auch einen Eintrag (B,A) aufweist. Das heißt: Die Adjazenzmatrix ist an der Diagonale symmetrisch (vergleiche Adjazenzmatrix oben). Grundlegende Idee für die Funktion isUndirected:
    Die Matrix komplett durchgehen und überprüfen, ob jeder Eintrag matrix[i][j] mit dem an der Diagonale gespiegeltem Wert matrix[j][i] identisch ist. Sollte das nicht der Fall sein, ist der zugehörige Graph gerichtet. <code java> public boolean isUndirected(boolean[][] amx) { for(int i = 0; i < amx.length; i++) { Zeilen for(int j = 0; j < amx[0].length; j++) { Spalten if(amx[i][j] != amx[j][i]) return false; } } return true; } </code> Geringfügig optimierte Version, die nur eine Dreiecksmatrix durchiteriert: <code java> public boolean isUndirected(boolean[][] amx) { for(int i = 0; i < amx.length; i++) { Zeilen for(int j = 0; j < i; j++) { Spalten if(amx[i][j] != amx[j][i]) return false; } } return true; } </code> Programm zum selber Testen: :pruefungen:bachelor:aud:graph.java.txt
    e) <code java> public static boolean allReachable(boolean[][] ug, int node) { boolean[] visited = new boolean[ug.length]; visited[node] = true; visitAll(ug, visited, node); for(int i = 0; i < visited.length; i++) { if(!visited[i]) return false; } return true; } private static void visitAll(boolean[][] ug, boolean[] visited, int node) { for(int i = 0; i < ug.length; i++) { if(ug[node][i]) { if(!visited[i]) { visited[i] = true; visitAll(ug, visited, i); } } } } </code> Programm zum selber Testen: :pruefungen:bachelor:aud:graph.java.txt === Aufgabe 3 === a) 96 oder kleiner b) * von Vorne nach Hinten: Falsch * von Hinten nach Vorne: Richtig c) ^ Stelle ^ Reihung ^^^^^ | - | de | com | es | net | ch | ee | | 3 | de | es | ch | ee | com | net | | 2 | de | ee | net | ch | com | es | | 1 | ch | com | de | ee | es | net | d) <code java> public static char getChar(String str, int pos){ return (pos < str.length()) ? (str.charAt(pos)) : (char) 96; } public static void radixSort(String[] array){ ArrayList<String>[] buckets = (ArrayList<String> []) new ArrayList[27]; for(int i = 0; i < 3; ++i){ for(int j = 0; j < 27; ++j){ buckets[j] = new ArrayList<String>(); } for(int j = 0; j < array.length; ++j){ buckets[(int)getChar(array[j],2-i) - 96].add(array[j]); } int k = 0; for( int j = 0; j < 27; ++j){ for(String str : buckets[j]){ array[k++] = str; } } } } </code> === Aufgabe 4 === === Aufgabe 5 - ADT (11 Punkte) === a) getPublishDate(createPost(„Hallo“, 24.02.2011, false) = 24.02.2011
    FIXME ist mit „vereinfachen“ wirklich die Normalform (Ergebnis) gemeint?
    b) 01.01.1970 c) createPost(s,d,v) d) F4: getUrl(publish(P , id, F )) = getURL(F); e) <code> F falls id1 == id2 F6: revoke(id1 , publish(P , id2 , F )) = publish(P,id2,revoke(id1, F) sonst </code> f) <code> publish(setSeen(P,true), id2, F) falls id1 = id2 F8: markSeen(id1 , publish(P , id2 , F )) = publish(P, id2, markSeen(id1,F)) sonst </code> === Aufgabe 6 === a) A –> [B,9] –> [C,6] B –> A,9 –> E,3 –> C,21 F –> E,4 –> K,2 –> G,10 Z –> H,5 –> K,3 b) | A ^ B ^ C ^ D ^ E ^ F ^ G ^ H ^ K ^ Z^ ^(0) | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞| ^0 | 9 | (6) | ∞ | ∞ | ∞ | ∞ | ∞ | ∞ | ∞| ^0 | 9 | 6 | ∞ | ∞ | ∞ | (9) | ∞ | ∞ | ∞| ^0 | (9) | 6 | 15| ∞ | 19| 9 | ∞ | ∞ | ∞| ^0 | 9 | 6 | 15| (12)| 19| 9 | ∞ | ∞ | ∞| ^0 | 9 | 6 | (15)| 12| 16| 9 | ∞ | ∞ | ∞| ^0 | 9 | 6 | 15| 12| (16)| 9 | 17| ∞ | ∞| ^0 | 9 | 6 | 15| 12| 16| 9 | (17)| 18| ∞| ^0 | 9 | 6 | 15| 12| 16| 9 | 17| (18)| 22| ^0 | 9 | 6 | 15| 12| 16| 9 | 17| 18| 21| c) Für diese Aufgabe sollte man die angegebene Entfernungstabelle benutzen.
    Lösung: D-H, F-K, B-E, C-G, K-Z, D-E, E-F, A-C, D-G
    Wie viele Meter Kabel werden verlegt?
    33 === Aufgabe 7 === a) Rechts oben ist richtig, da in der Schleife und aus der Schleife der Invariante die Nachbedingung sein muss Die Schleife berechnet die Summer der Betraege jedes a's es können nur die rechten sein, da die linken nur die Summe zum betrag berechnet. Rechts unten kann man direkt wegfallen lassen, da i irgendwann = n sein muss, da sonst die Schleife nie terminiert b) <code> s einsetzen, s = 0 wp(„n=a.length; s=0; i=0;I) 0=|ai|^0⇐n –> 0=0^0⇐n –> stimmt! </code> c)**
I∧b --> wp(A,I)
wp("if/else;i=i+1,I)  ---> [b∧wp(Ai,I)]...
-->[a[i]>0∧wp("s=s + a[i]", s=(Summenzeichen) ∧ c <=n)
a[i] <= 0 ∧ wp("s = s-a[i], s = (Summenzeichen) ∧ i <= n)]

--> a[i] >0 s + a[i] = (Summenzeichen) |aj| ∧ 1+1| sn) ....
kp wie das weiter funktioniert
Ende: (ai > 0 ∧ s = (Summenzeichen)|ai| ∧ i + 1 <= n)) (umgedrehtes  ∧) (ai <= 0 0 ∧ s = (Summenzeichen)|ai| ∧ i + 1 <= n))

I ∧ b => wp(a,I)
s = (Summenzeichen)|aj| ∧ i + 1 <= n ∧ i < n) --> s = (Summenzeichen)|aj| ∧ i + 1 <= n)
daraus sieht man: A --> A  ist korrekt!

Aufgabe 8

class Firma{
 
	String name;
	Person geschaeftsfuehrer;
	Person[] mitarbeiter;
 
	Integer gibAnzahlMitarbeiter() { //Objekt vom Typ Integer, nicht der Datentyp int 
	}
 
}
 
class Person {
 
	String name;
	Integer gebJahr; 
 
	Person vorgesetzter;
	Person[] unterstellteMitarbeiter;
 
	Person[] gibAlleUnterstelltenMitarbeiter() {
	}
 
}