Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J.O. Blech Dipl.-Inform. M.J. Gawkowski Dipl.-Inform. N. Rauch
Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik
Übungsblatt 12: Softwareentwicklung I (WS 2006/07)
Ausgabe: 23. Januar 2007 Abgabe: 29. Januar 2007, 12.00 Uhr Abnahme praktischer Teil: 29. Januar - 02. Februar 2007
Aufgabe 1 Klasse AList (praktisch) (10 Punkte)
In dieser Aufgabe sollen Sie eine vereinfachte Version der KlasseArrayListaus dem Packagejava.utilim- plementieren. Dabei dürfen Sie in Ihrer Implementierung die Schnittstelle vonjava.util.ArrayListnicht ver- wenden. Für die Implementierung vonAListsollen Sie die folgende Vorlage verwenden1, siehe die Erklärung unten.
import java.util.NoSuchElementException;
class Iterator {
private int current, lb, ub;
private int [] entries;
Iterator( int [] entries, int lb, int ub ) {...}
boolean hasNext() {...}
int next() {...}
}
class AList {
private int [] entries;
private int lb, ub, count;
private default_capacity = 10;
private default_increment = 10;
AList(){...}
AList( int initialCapacity ){...}
AList( int initialCapacity, int increment ){...}
void addFirst( int n ) {...}
void addLast( int n ) {...}
void removeFirst () {...}
void removeLast () {...}
int getFirst(){...}
int getLast(){...}
int [] toArray(){...}
Iterator iterator() {...}
}
1Die QuelldateiAList.javafinden Sie auf der Vorlesungseite im BereichMaterialien
class AListMain {
public static void main(String[] argf){
AList al = new AList(4);
al.addFirst(4);
al.addFirst(3);
al.addFirst(2);
al.addFirst(1);
// al=[1,2,3,4]
al.removeFirst();
al.removeFirst();
// al=[?,?,3,4]
al.addLast(5);
al.addLast(6);
al.addFirst(11);
// al=[11,3,4,5,6,?,?,?]
Iterator iter = al.iterator();
System.out.println
("Das Array enth\"alt die folgenden Elemente:");
while( iter.hasNext() ){
System.out.println( iter.next() );
} } }
a) Implementieren Sie die Konstruktor-MethodeAList()vonAList. Beim Erzeugen eines neuenAList-Objekts durch den Aufruf dieses Konstruktors sollen die Instanzvariablen wie folgt initialisiert werden: Die Instanzvariable entriessoll ein neu-alloziertes Feld der Längedefault_capacityreferenzieren. Der Wert vonlb,ubund countsoll auf auf 0 gesetzt werden.
b) Implementieren Sie die Konstruktor-MethodeAList(int initialCapacity)vonAList. Beim Erzeugen eines neuenAList-Objekts durch den Aufruf dieses Konstruktors werden alle Instanzvariablen bis aufentries wie beim KonstruktorAList()initialisiert. Die Instanzvariableentriessoll ein neu-alloziertes Feld der Länge initialcapacityreferenzieren.
c) Implementieren Sie die Konstruktor-Methode AList(int initialCapacity, int increment)von AList. Beim Erzeugen eines neuenAList-Objekts durch den Aufruf dieses Konstruktors werden alle Instanz- variablen bis aufentriesund default_incrementwie beim KonstruktorAList()initialisiert. Die In- stanzvariableentriessoll ein neu-alloziertes Feld der Längeinitialcapacityreferenzieren. Die Klassen- variabledefault_incrementsoll auf den Wertincrementgesetzt werden.
d) Implementieren Sie die MethodeaddFirst(int n), die folgendermaßen anhand von drei Beipielen spezifiert wird:
Referenziert die Instanzvariableentriesein Feld, das die Form[?,?, i0, i1, i2,?,?]hat, und haben die Instanz- variablen lb, ubund count entsprechend die Werte 2, 5 und 3, dann soll dieses Feld nach dem Aufruf von addFirst(i3)die Form[?, i3, i0, i1, i2,?,?]haben und der Werte vonlbundcount entsprechend auf1und 4 gesetzt werden.
Referenziert die Instanzvariableentriesein Feld, das die Form[i0, i1, i2,?,?,?,?]hat, und haben die Instanz- variablen lb, ubund count entsprechend die Werte 0, 3 und 3, dann soll dieses Feld nach dem Aufruf von addFirst(i4)die Form[i4, i0, i1, i2,?,?,?]haben und der Werte vonubundcountentsprechend auf4 und4 gesetzt werden.
Referenziert die Instanzvariableentriesein Feld, das die Form[i0, i1, i2, i3]hat, und haben die Instanzvariablen lb,ub,countunddefaul_incremententsprechend die Werte0,4,4und5, dann soll dieses Feld nach dem Auf- ruf vonaddFirst(i4)die Form[i4, i0, i1, i2, i3,?,?,?,?]haben und der Werte vonubundcountentsprechend auf4und5gesetzt werden.
e) Implementieren Sie die MethodeaddLast(int n), deren Funktionalität analog zu der vonaddFirst(int n)ist.
f) Implementieren Sie die MethoderemoveFirst(), die folgendermaßen anhand von zwei Beispielen spezifiert wird:
Referenziert die Instanzvariableentriesein Feld, das die Form[?,?, i0, i1, i2,?,?]hat, und haben die Instanz- variablen lb, ubund count entsprechend die Werte 2, 5 und 3, dann soll dieses Feld nach dem Aufruf von
removeFirst()die Form[?,?,?, i1, i2,?,?]haben und die Werte vonlbund countentsprechend auf3 und2 gesetzt werden.
Referenziert die Instanzvariableentriesein Feld, das die Form[i0, i1, i2,?,?,?,?]hat, und haben die Instanz- variablen lb, ubund count entsprechend die Werte 0, 3 und 3, dann soll dieses Feld nach dem Aufruf von removeFirst()die Form[i1, i2,?,?,?,?,?]haben und die Werte vonubsollen entsprechend auf2und2gesetzt werden.
Die Länge des Feldesentrieswird beim Entfernen des Elementes nicht angepasst.
g) Implementieren Sie die MethoderemoveLast(), deren Funktionalität analog zu der von removeFirst() ist.
h) Implementieren Sie die MethodegetFirst(), welche die folgende Funktionalität besitzt:
Referenziert die Instanzvariableentriesein Feld, das die Form[?,?, i0, i1, i2,?,?]hat, und hat die Instanzva- riablelbden Wert2, dann sollgetFirst()den Werti0zurückgeben.
i) Implementieren Sie die MethodegetLast(), deren Funktionalität analog zu der vongetFirst()ist.
j) Implementieren Sie die MethodetoArray(), die folgendermaßen anhand eines Beispiels spezifiziert wird:
Referenziert die Instanzvariableentriesein Feld, das die Form[?,?, i0, i1, i2,?,?]hat, und haben die Instanzva- riablenlbundubentsprechend die Werte2und5, dann soll die Methode ein Feld der Form[i0, i1, i2]zurückgeben.
k) Implementieren Sie die KlasseIteratorund die Methodeiterator()der KlasseAListnach dem in der Vorlesung vorgestellten Muster.
Aufgabe 2 Klasseninvariante (4 Punkte)
Geben Sie die Invariante der KlasseAListan.
Hinweis: Eine Klasseninvariante hat die allgemeine Form: \invariant E mit E ein Ausdruck, der eine Funktion der Instanz- und Klassenvariablen ist.
Aufgabe 3 Klasse AListModulo (praktisch) (6 Punkte)
Wie Sie an den Beispielen in Aufgabe 1 gesehen haben, verschieben die Methoden addFirst(int n) und addLast(int n)alle im AList-Objekt gespeicherten Elemente nach links beziehungsweise nach rechts wenn das Inkrementieren beziehungsweise das Dekrementieren vonlboderubnicht möglich ist. Dieses Vorgehen ist inef- fizient, da im schlechtesten FallO(entries.length)Listen-Elemente kopiert werden müssen.
Schreiben Sie die Deklaration einer KlasseAListModuloin der Sie effizientere Versionen der oben genannten Methoden implementieren. Die verbesserten Versionen sollen das Verschieben der Elemente vermeiden.
Hinweise:
1. Referenziert die Instanzvariableentriesein Feld der Form[?,?,?, i0, i1]und ist der Wert vonubgleich5, dann kann die MethodeaddLastein einzufügendes Elementi2an der Stelleentries[0]speichern, wobei Sie beachten sollten, dass0das Ergebnis von5mod5ist.
2. Beachten Sie auch, dass die MethodetoArray auch entsprechend geändert werden muss. Referenziert die Instanzvariableentriesein Feld, das die Form[i3, i4,?,?,?, i0, i1, i2]hat, und haben die Instanzvariablenlb undubentsprechend die Werte5und2, dann soll die Methode ein Feld der Form[i0, i1, i2, i3, i4]zurückgeben.