Algorithmen und Datenstrukturen 4. Übung

Werbung
Algorithmen und Datenstrukturen
Sommersemester 2010
FAU, Informatik 2, AUD-Team
[email protected]
4. Übung
Abgabe bis 24.05.2010, 10:00 Uhr
Aufgabe 4.1: Referenzen
16 Punkte
Geben Sie Ihre Lösung als Referenzen.pdf ab.
a) Führen Sie einen Schreibtischlauf des folgenden Java-Programms durch. Es werden insgesamt
drei Instanzen der Klasse Counter erzeugt. Notieren Sie in tabellarischer Form die Objekte
(Instanzen), auf die die Referenzvariablen a - e sowie globalCounter an den durch “<x>”
gekennzeichneten Stellen zeigen. Notieren Sie des Weiteren den Wert der Variable count der
jeweiligen Objekte.
Beispiel:
Pos.
<1>
<2>
...
a
Obj0
Obj0
...
b
Obj1
...
c d
- - ... ...
e globalCoutner
null
null
...
...
Obj0.count
4
2
...
Obj1.count
...
Obj2.count
...
b) Notieren Sie die Konsolenausgabe des Programms.
c) Begründen Sie in höchstens zwei kurzen Sätzen das Ergebnis des Vergleichs e ==
Counter.getGlobal() in Zeile 18.
d) Erläutern Sie in höchstens drei kurzen Sätzen welche Bedingungen ein übergebenes Objekt
erfüllen muß, damit die Methode equals der Klasse Counter true zurückgibt.
1 p u b l i c c l a s s App {
2
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
3
C o u n t e r a = new C o u n t e r ( 4 ) ;
4
/ / <1>
5
C o u n t e r b = new C o u n t e r ( 2 ) ;
6
/ / <2>
7
Counter c = a ;
8
Counter d = Counter . getGlobal ( ) ;
9
Counter e = b ;
10
/ / <3>
11
b = null ;
12
d . inc ( ) ;
13
e . inc ( ) ;
14
a . inc ( ) ;
15
/ / <4>
16
Counter . getGlobal ( ) . inc ( ) ;
17
/ / <5>
18
System . o u t . p r i n t l n ( e == C o u n t e r . g e t G l o b a l ( ) ) ;
19
System . o u t . p r i n t l n ( e . e q u a l s ( C o u n t e r . g e t G l o b a l ( ) ) ) ;
20
}
21 }
Fortsetzung auf Seite 2!
-1-
Algorithmen und Datenstrukturen
Sommersemester 2010
FAU, Informatik 2, AUD-Team
[email protected]
1 c l a s s Counter {
2
p r i v a t e f i n a l s t a t i c i n t GLOBAL_COUNTER_START = 1 ;
3
4
private s t a t i c Counter globalCounter = null ;
5
6
private int count ;
7
8
public s t a t i c Counter getGlobal ( ) {
9
i f ( g l o b a l C o u n t e r == n u l l )
10
g l o b a l C o u n t e r = new C o u n t e r (GLOBAL_COUNTER_START ) ;
11
return globalCounter ;
12
}
13
14
public Counter ( i n t s t a r t ) {
15
t h i s . count = s t a r t ;
16
}
17
18
public int getCount ( ) {
19
return t h i s . count ;
20
}
21
22
public void inc ( ) {
23
++ t h i s . c o u n t ;
24
}
25
26
public boolean e q u a l s ( Object obj ) {
27
i f ( o b j == n u l l ) {
28
return f a l s e ;
29
} e l s e i f ( obj instanceof Counter ) {
30
r e t u r n ( ( C o u n t e r ) o b j ) . g e t C o u n t ( ) == g e t C o u n t ( ) ;
31
} else {
32
return f a l s e ;
33
}
34
}
35
36
public String t o S t r i n g ( ) {
37
return S t r i n g . valueOf ( t h i s . count ) ;
38
}
39 }
Aufgabe 4.2: Überladen
8 Punkte
In einer Java-Klasse können verschiedene Methoden mit gleichem Bezeichner enthalten sein. Es ist
die folgende Methode gegeben:
(∗) public
f l o a t maximum ( f l o a t a , f l o a t b )
Überprüfen Sie nun für die folgenden Methoden, ob es sich jeweils um eine zulässige Überladung
der Methode (∗) handelt und begründen Sie Ihre Antwort jeweils kurz. Geben Sie Ihre Lösungen
als Overloading.pdf ab.
-2-
Algorithmen und Datenstrukturen
Sommersemester 2010
(a)
(b)
(c)
(d)
(e)
(f)
(g)
(h)
public
public
public
public
float
float
char
float
float
private long
public
float
public
float
maximum ( i n t
maximum ( )
maximum ( f l o a t
maximum ( f l o a t
maximum ( f l o a t
maximum ( f l o a t
maximum ( f l o a t
maximum ( char
Aufgabe 4.3: Fahrzeuge
FAU, Informatik 2, AUD-Team
[email protected]
x , int
y)
a,
x,
i,
i,
i,
i,
b)
y)
j)
j)
j , float k)
j)
float
float
float
float
float
float
36 Punkte
Laden Sie sich zunächst die Vorgabe Fahrzeuge.zip herunter und entpacken Sie diese. Übersetzen Sie nun die Datei VehicleTest.java. Das Testprogramm sollte fehlerfrei übersetzen, zeigt
aber noch keine sinnvolle Ausgabe an.
a) Implementieren Sie zunächst einen weiteren Konstruktor für die Klasse Vehicle. Dieser soll
den Fahrzeugtyp (also beispielsweise UNKOWN, PKW, LKW) als int entgegennehmen und in das
entsprechende Feld der Klasse schreiben. Eine Überprüfung des übergebenen Fahrzeugtyps
ist nicht vorgesehen.
b) Implementieren Sie anschließend für jede Unterklasse von Vehicle einen Konstruktor, der
den Superkonstruktor der Klasse Vehicle aufruft und den entsprechenden Fahrzeugtyp übergibt. Verwenden Sie hierzu die Konstanten aus der Klasse Vehicle. Anschließend sollte
VehicleTest folgende Ausgabe erzeugen:
-- (1; --, --)
-- (2; --, --)
c) Überschreiben Sie die Methoden honk(), fuel() und typeName() in den Klassen Pkw
und Lkw. Das Hupen des Lkw’s soll dem String “moeoep” entsprechen, das des Pkw’s dem
String “tuuut”. Der Lkw tankt “Diesel” während der Pkw “Bleifrei” tankt. Die Typ-Namen
der beiden Fahrzeugklassen entsprechen genau den Namen der jeweiligen Konstanten in der
Klasse Vehicle. Anschließend sollte java VehicleTest folgende Ausgabe erzeugen:
PKW (1; tuuut, Bleifrei)
LKW (2; moeoep, Diesel)
d) Da wir in der Klasse Vehicle einen extra Konstruktor implementiert haben, der das Feld
type initialisiert, benötigen wir den Standard-Konstruktor nicht mehr. Entfernen Sie diesen,
Ihr Program sollte nach wie vor kompilieren!
e) Die Klasse Vehicle selbst sollte nie direkt instanziiert werden. Um das auch in unserem
Quelltext wiederzuspiegeln, ändern Sie den verbliebenen Konstruktor der Klasse Vehicle
so ab, dass dieser nur noch von den Unterklassen der Klasse Vehicle aufgerufen werden
kann.
-3-
Algorithmen und Datenstrukturen
Sommersemester 2010
FAU, Informatik 2, AUD-Team
[email protected]
f) Da die Methoden fuel(), honk() und typeName() nun in den Unterklassen von Vehicle
implementiert wurden, können die entsprechenden Stubs (Stümpfe) dieser Methoden in der
Klasse Vehicle in abstrakte Methoden umgewandelt werden. Führen Sie die nötigen Änderungen durch. Ändern Sie auch den Kopf der Klasse entsprechend, wenn nötig.
g) Wir wollen die möglichen Fahrzeugtypen nun um den Monstertruck erweitern. Erstellen
Sie eine Klasse Monstertruck die von Vehicle erbt. Legen Sie des weiteren eine neue
Konstante für diesen Fahrzeugtyp namens MONSTERTRUCK an. Ein Aufruf der Methode
toString() der Klasse Monstertruck muss in folgender Ausgabe resultieren:
MONSTERTRUCK (3; roar, Kerosin)
Die toString() Methoden dürfen hierzu nicht verändert oder überladen werden!
h) Verschiedene Fahrzeuge können natürlich auch mit unterschiedlichen Komponenten geliefert werden. Zunächst müssen Schnittstellen zu möglichen Komponenten definiert werden. Erstellen Sie hierzu eine Schnittstelle namens NavigationSystem. Diese Schnittstelle erlaubt den Zugriff auf ein Navigationssystem. Die Schnittstelle NavigationSystem
enthält die Methode void setDeparture(String location) und die Methode void
setDestination(String destination). Definieren Sie diese Schnittstelle in der Datei
NavigationSystem.java.
i) Wir werden jetzt einen neuen Pkw einführen der über ein Navigationssystem verfügt. Dieser
wird in der Klasse PkwWithNavi implementiert, die wiederum von Pkw erbt und die Schnittstelle NavigationSystem implementiert. Die Orte, die den Methoden setDeparture()
und setDestination() übergeben werden, sollen in Feldern der Klasse PkwWithNavi
gespeichert werden. Legen Sie hierzu die Felder departure und destination mit korrektem Typ an. Die Felder müssen so geschützt werden, dass nur Methoden der Klasse
PkwWithNavi darauf zugreifen können. Implementieren Sie die genannten Erweiterungen
in der Datei PkwWithNavi.java.
j) Ändern Sie den Quelltext in der Datei VehicleTest.java so ab, dass zusätzlich ein
PkwWithNavi und ein Monstertruck instanziiert werden. Setzen Sie anschließend eine
Navigationsroute von “Hamburg” nach “Berlin” für die Instanz der Klasse PkwWithNavi.
Abschließend sollen beide Objekte mittels toString ausgegeben werden.
k) Zu guter Letzt soll ein Aufruf der toString() Methode eines Objekts der Instanz
PkwWithNavi den momentanen Navigationsstatus ausgeben. Überschreiben Sie dazu die
toString() Methode in der Klasse PkwWithNavi, sodass diese folgenden Text zurückgibt
(für die Route Hamburg - Berlin):
PKW (1; tuuut, Bleifrei): Navigiere von Hamburg nach Berlin
Nachdem Sie alles korrekt implementiert haben, sollte VehicleTest folgende Ausgabe erzeugen:
-4-
Algorithmen und Datenstrukturen
Sommersemester 2010
FAU, Informatik 2, AUD-Team
[email protected]
PKW (1; tuuut, Bleifrei)
LKW (2; moeoep, Diesel)
PKW (1; tuuut, Bleifrei): Navigiere von Hamburg nach Berlin
MONSTERTRUCK (3; roar, Kerosin)
Geben Sie die Dateien Lkw.java, Monstertruck.java, NavigationSystem.java,
Pkw.java, Vehicle.java, PkwWithNavi.java sowie VehicleTest.java als Ihre Lösung ab.
60 Punkte
-5-
Herunterladen