






Besser lernen dank der zahlreichen Ressourcen auf Docsity
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Prüfungen vorbereiten
Besser lernen dank der zahlreichen Ressourcen auf Docsity
Download-Punkte bekommen.
Heimse Punkte ein, indem du anderen Studierenden hilfst oder erwirb Punkte mit einem Premium-Abo
Community
Finde heraus, welche laut den Docsity-Nutzern die besten Unis deines Landes sind
Kostenlose Leitfäden
Lade unsere Leitfäden mit Lernmethoden, Hilfen zur Angstbewältigung und von Docsity-Tutoren erstellte Tipps zum Verfassen von Haus- und Abschlussarbeiten kostenlos herunter
Musterlösung - Übung Programmierung Prof. Giesl
Art: Übungen
1 / 12
Diese Seite wird in der Vorschau nicht angezeigt
Lass dir nichts Wichtiges entgehen!
RHEINISCH-WESTF¨ALISCHE TECHNISCHEHOCHSCHULE AACHEN
LEHR- UND FORSCHUNGSGEBIET INFORMATIK 2 RWTH Aachen · D-52056 Aachen · GERMANY http://programmierung.rwth-aachen.de/ Prof. Dr. J¨urgen Giesl
LuFG Informatik II
Prof. Dr. J¨urgen Giesl Carsten Fuhs, Peter Schneider-Kamp, Stephan Swiderski
Vorname:
Nachname:
Matrikelnummer:
Studiengang (bitte ankreuzen):
◦ Informatik Bachelor ◦ Informatik Diplom ◦ Informatik Lehramt ◦ Mathematik Bachelor ◦ Mathematik Diplom ◦ CES Bachelor ◦ CES Diplom ◦ Werkstoffinformatik ◦ Computermathematik
◦ Sonstige:
Anzahl Punkte Erreichte Punkte Aufgabe 1 14 Aufgabe 2 12 Aufgabe 3 14 Aufgabe 4 26 Summe 66 Prozentzahl
2
Aufgabe 1 (Programmanalyse, 8 + 6 Punkte)
a) Geben Sie die Ausgabe des Programms f¨ur den Aufruf java M an. Schreiben Sie hierzu jeweils die ausgegebenen Zeichen hinter den Kommentar “OUT:”.
public class A { public static double x = 1; public A() { this(4); } public A(double x) { A.x += x; } public void f(double x) { x += 2*x; } }
public class B extends A { public int y = 3; public B(int x) { super(); y++; } public void f(int x) { A.x += x; } public void f(double x) { A.x -= x; y--; } }
public class M { public static void main(String[] args) { A a = new A(A.x); System.out.println(a.x); // OUT: a.f(10); System.out.println(a.x); // OUT: B b = new B(10); System.out.println(b.x+" "+b.y); // OUT: b.f(10); System.out.println(b.x); // OUT: a = b; a.f(1.0); System.out.println(a.x+" "+b.y); // OUT: a.f(10); System.out.println(a.x); // OUT: } }
4
Aufgabe 2 (Verifikation, 10 + 2 Punkte)
Der Algorithmus P berechnet f¨ur ein Array a der L¨ange n die Summe
∑n− 1 k=0 2
k (^) ∗ a[k], wobei a
aus den Zahlen a[0],... , a[n − 1] besteht.
a) Vervollst¨andigen Sie die folgende Verifikation des Algorithmus P im Hoare-Kalk¨ul, indem Sie die unterstrichenen Teile erg¨anzen. Hierbei d¨urfen zwei Zusicherungen nur dann direkt untereinander stehen, wenn die untere aus der oberen folgt. Hinter einer Programmanwei- sung darf nur eine Zusicherung stehen, wenn dies aus einer Regel des Hoare-Kalk¨uls folgt.
Algorithmus: P Eingabe: Ein Array a der L¨ange n, das die Zahlen a[0],... , a[n − 1] enth¨alt Ausgabe: res Vorbedingung: n ≥ 0 Nachbedingung: res =
∑n− 1 k=0 2
k (^) ∗ a[k]
〈 n ≥ 0 〉
〈 〉
i = 0; 〈 〉
res = 0; 〈 〉
z = 1; 〈 〉
〈 〉
while (n > i) { 〈 〉
〈 〉
res = res + z ∗ a[i]; 〈 〉
z = z ∗ 2; 〈 〉
i = i + 1; 〈 〉
} 〈 〉
〈 res =
∑n− 1 k=0 2 k (^) ∗ a[k] 〉
5
b) Beweisen Sie die Terminierung des Algorithmus P.
7
8
b) Implementieren Sie in Java eine Methode saubereOefen. Die Methode bekommt als Pa- rameter ein Array von ¨Ofen und einen double-Wert maxCO (^) ¨ubergeben. Sie soll ein Array von denjenigen ¨Ofen aus dem gegebenen Array zur¨uckliefern, die keine Abgase haben oder deren Abgase einen CO-Anteil haben, der h¨ochstens maxCO ist. Das ¨ubergebene Array soll dabei nicht modifiziert werden. Das Array, das Sie zur¨uckgeben, soll keine null-Werte enthalten. Gehen Sie dabei davon aus, dass das ¨ubergebene Array nicht der null-Wert ist, dass es keine null-Werte enth¨alt und dass f¨ur alle Attribute geeignete Selektoren existieren. Verwenden Sie f¨ur den Zugriff auf die ben¨otigten Attribute die passenden Selektoren und kennzeichnen Sie die Methode mit dem Schl¨usselwort ”
static“, falls angebracht.
10
a) Die Methode loesche der Klasse Graph l¨oscht einen Knoten aus dem Graphen. Danach kann es vorkommen, dass einige Knoten vom Wurzelknoten aus nicht mehr erreichbar sind, so dass diese ebenfalls automatisch gel¨oscht sind. Sie brauchen diese nicht mehr erreichbaren Knoten nicht manuell zu l¨oschen. Beachten Sie, dass, wenn der Wurzelknoten gel¨oscht wird, der Graph danach leer sein muss. Nutzen Sie bei der Implementierung aus, dass die Nachbarschaftsbeziehung symmetrisch ist. (Sie m¨ussen daher den zu l¨oschenden Knoten nicht im Graph suchen, sondern Sie k¨onnen direkt vom zu l¨oschenden Knoten ausgehen und von dort aus seine Nachbarn erreichen.) Implementieren Sie die Methode loesche mit der Signatur public void loesche(Knoten knoten) in der Klasse Graph.
11
b) Die Methode anwenden der Klasse Graph wendet einen Besucher auf den Graph an. Ein Besucher ist ein Objekt einer Klasse, welche das Interface Besucher implementiert.
public interface Besucher { void besuche(Knoten knoten); }
Die Methode besuche des Besuchers soll durch die Methode anwenden auf jeden Knoten genau einmal angewendet werden. Sie k¨onnen hier das Attribut besucht der Klasse Knoten verwenden, indem Sie es bei einem besuchten Knoten auf true setzen. Sie k¨onnen davon ausgehen, dass das Attribut besucht vor dem Aufruf von anwenden in jedem Knoten des Graphen auf false steht. Sorgen Sie daf¨ur, dass das Attribut besucht jedes Knotens nach Verlassen der Methode anwenden wieder auf false steht. Implementieren Sie die Methode anwenden mit der Signatur public void anwenden(Besucher besucher) in der Klasse Graph. Verwenden Sie dabei ausschließlich Rekursion. Sie d¨urfen aber eine for-Schleife verwenden, um ein Array zu durchlaufen.