Techniken der Programmentwicklung (TPE) Informatik/Bachelor Sommersemester 2006 Prof. Dr. Wolfgang Schramm Name: .......................................................................................... Vorname: .......................................................................................... Matrikel-Nr.: .......................................................................................... Unterschrift: .......................................................................................... Hinweise: 1.) Schreiben Sie Ihren Namen und Ihre Matrikelnummer zu Beginn auf das Deckblatt der Klausur. Überprüfen Sie, ob die Klausur vollständig ist. 2.) Bearbeiten Sie die Aufgaben möglichst auf den jeweiligen Blättern. Der Platz auf dem Aufgabenblatt ist so bemessen, daß er für die Lösung der Aufgabe ausreicht. Andernfalls verwenden Sie die Rückseite oder ein mit Ihrem Namen, Ihrer Matrikelnummer und der Aufgabennummer gekennzeichnetes separates Blatt. 3.) Als Hilfsmittel ist, außer einem Schreibgerät, nichts zugelassen. 4.) Schreiben Sie mit dokumentenechten Stiften. Mit Bleistiften, Tintenkiller o.ä. erstellte Lösungen sind ungültig! Rotschreibende Stifte sind ebenfalls verboten! Schreiben Sie bitte leserlich! Aufgabe 1 2 3 4 5 6 Σ Erreichbare Punkte 10 6 18 34 14 38 120 Erreichte Punkte Viel Erfolg !!! Note: Name: Matrikelnr.: Aufgabe 1 Klassen und Objekte 10 (6 + 4) Punkte Ein Java−Programm enthalte folgende Klassenhierarchie: class A { void x() { y(); z(); } void y() { System.out.print("yA"); } void z() { System.out.print("zA"); } } class B extends A { void y() { System.out.print("yB"); } void z() { y(); } } class C extends B { void x() { y(); z(); } void y() { System.out.print("yC"); } } a) Welche Ausgabe erzeugen die folgenden Programmfragmente? A a = new A(); a.x(); B b = new B(); b.x(); C c = new C(); c.x(); b) Welche Programmfragmente sind korrekt, welche führen zu einem Fehler ? A B A B a b a b = = = = new new new new B(); A(); C(); C c = (C)a; C(); C c = b; 2 Name: Aufgabe 2 Objektinitialisierung / Konstruktoren Matrikelnr.: 6 Punkte Betrachten Sie folgendes Programmfragment: class SingleValue { protected int value1; public SingleValue(int value1) { this.value1 = value1; this.print(); } public void print() { System.out.println("value = " + value1); } } class ValuePair extends SingleValue { protected int value2; public ValuePair(int value1, int value2) { super(value1); this.value2 = value2; } public void print() { System.out.println ("value = (" + value1 + "," + value2 + ")"); } } public class ExCapM { public static void main(String[] args) { new ValuePair(20,10); } } Was wird ausgegeben? 3 Name: Aufgabe 3 Vererbungshierarchie, abstrakte Klassen Matrikelnr.: 18 Punkte In dieser Aufgabe wird das Angebot eines Restaurants durch Java-Klassen modelliert. Das Angebot beschränkt sich zwar auf Bier und Steaks, soll aber vernünftig modelliert werden, um spätere Erweiterungen zu erlauben. a) Schreiben Sie eine abstrakte Klasse Ware, welche eine abstrakte Methode preis definiert, die den Preis der Ware in Cent berechnet (als int-Wert). b) Schreiben Sie zwei von Ware abgeleitete abstrakte Klassen Getraenk und Essen. Die Klasse Getraenk soll eine abstrakte Methode menge definieren, welche die Menge in Litern (als double-Wert) angibt. Die Klasse Essen soll keine weiteren Eigenschaften haben. c) Schreiben Sie eine nicht abstrakte Klasse Bier, die von Getraenk abgeleitet ist. Diese Klasse soll einen Wahrheitswert als Attribut haben, der angibt, ob es ein kleines oder eine großes Bier ist. Das Attribut soll nicht von außen zugreifbar sein. Schreiben Sie einen Konstruktor, welcher das Attribut angemessen initialisiert. Definieren sie die geerbten abstrakten Methoden. Dabei gilt: eine großes Bier hat eine Menge von 0.5 Litern und kostet 3.00 EUR, eine kleines Bier hat 0.33 Liter und kostet 1.80 EUR. d) Schreiben Sie nun eine Klasse Steak, die von Essen abgeleitet ist. Sie hat als Eigenschaft ein Gewicht in Gramm, das über einen geeigneten Konstruktor initialisiert werden soll und nicht von außen zugreifbar ist. Der Preis pro Gramm wird als weitere Eigenschaft ebenfalls über den Konstruktor initialisiert. Der Preis für ein Steak wird durch die Methode preis berechnet. 4 Name: Matrikelnr.: Aufgabe 3 (Fortsetzung) Vererbungshierarchie, abstrakte Klassen 18 Punkte 5 Name: Aufgabe 4 Interfaces, Ausnahmen Matrikelnr.: 34 (6 + 16 + 6 + 6) Punkte a) Geben Sie ein Interface Stack für die Realisierung eines Stacks an. Die beiden Methoden zum Ablegen (push) auf dem Stack bzw. Entfernen (pop) eines beliebigen Objekts vom Stack sollen eine Ausnahme auslösen, wenn beim Einfügen kein Platz mehr auf dem Stack ist (overflow) bzw. wenn beim Entfernen der Stack schon leer ist (underflow). b) Deklarieren Sie eine Klasse MyStack, welche das Interface Stack implementiert. Die im Stack abzulegenden Objekte sollen in einem Array verwaltet werden, dessen Größe entweder dem Konstruktor übergeben wird oder das eine Standardgröße von 10 Elementen hat. Überlegen Sie genau, welche Methoden Sie dazu brauchen. 6 Name: Matrikelnr.: c) Geben Sie auch die Klassen für die Ausnahmebehandlung (overflow und underflow) an. Bei einem overflow soll das Element, welches nicht mehr eingefügt werden konnte gespeichert werden, so dass man es beim Auftreten der Ausnahme ausgeben kann. d) Geben Sie ein Programmfragment an, in welchem Sie ein Objekt vom Typ Stack erzeugen und in dem Sie jeweils ein Element (hier können Sie einfach int-Objekte nehmen) auf dem Stack ablegen bzw. vom Stack entfernen, jeweils unter Beachtung der möglichen Fehlersituation. 7 Name: Matrikelnr.: 14 (6 + 8 ) Punkte Aufgabe 5 Ausnahmebehandlung a) Betrachten Sie folgenden Programmausschnitt: void m1 () { xxx try { ... m2(); ... } catch (E1 e) { ... } catch (E2 e) { ... } ... } void m2 () { ... m3(); ... if (...) throw new E2(); } void m3 () { ... try { if (...) throw new E1(); else throw new E2(); ... } catch (E2 e) { ... } ... } Tragen Sie in den Programmcode die Änderungen ein, damit die Ausnahmebehandlung korrekt ist. b) Gegeben sei folgende Situation: In der Klasse C wirft die Methode m eine Ausnahme der (Exception-) Klasse E: class C { void m (. . .) throws E {. . .} . . .} Die Methode m wird in der Unterklasse CU von C überschrieben. class CU extends C { void m (. . .) throws ?___? {. . .} . . .} Welche Ausnahmen dürfen in der throws-Anweisung von m (in CU) an der Stelle ?____? stehen? Begründen Sie Ihre Antwort! 8 Name: Aufgabe 6 Threads Matrikelnr.: 38 (15 + 20 + 3) Punkte a) Modellieren Sie ein Parkhaus. Für den Zustand des Parkhauses ist lediglich die Anzahl der freien Parkplätze relevant. Verschiedene Threads, welche die Autos darstellen, können die Methoden passieren (Einfahrt in das Parkhaus) und verlassen (Ausfahrt aus dem Parkhaus) aufrufen. Beim Einfahren wird die Anzahl der freien Plätze um eins vermindert, beim Ausfahren entsprechend um eins erhöht. Allerdings kann die Anzahl der freien Plätze nicht um eines vermindert werden, wenn sie bereits null ist. Ist das Parkhaus voll belegt, dann wartet das Auto (vor dem Parkhaus), bis wieder ein Platz frei ist. 9 Name: Matrikelnr.: b) Realisieren Sie die Klasse Auto als Thread für verschiedene Autos. Als Datenelemente haben die Autos einen Namen und das Parkhaus-Objekt. Jedes Auto fährt in das Parkhaus rein bleibt dort eine bestimmte Zeit (was tut der Thread da?) und fährt dann wieder aus dem Parkhaus raus. Das Hauptprogramm sieht aus wie folgt: public class Parkhausbetrieb { public static void main(String[] args) { Parkhaus parkhaus = new Parkhaus(10); for(int i = 1; i <= 40; i++) { Auto a = new Auto("Auto " + i, parkhaus); } } } 10 Name: Matrikelnr.: c) Ergänzen Sie folgendes Programm an der angegebenen Stelle: class X extends Thread { /* nicht näher interessant */ } class Y { public static void main(String[] args) throws Exception { X einX = new X(); einX.start(); /* nicht näher interessant */ //warten auf das Ende des gestarteten Threads //(bitte ergänzen, try/catch ist nicht nötig) } } 11