Techniken der Programmentwicklung (TPE) Prof. Dr. Wolfgang

Werbung
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
Herunterladen