Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J. O. Blech Dipl.-Inform. M. J. Gawkowski Dipl.-Inform. N. Rauch
TU Kaiserslautern
Fachbereich Informatik AG Softwaretechnik
Übungsblatt 9: Software-Entwicklung I (WS 2007/08)
Ausgabe: 18. Dezember 2007 Abgabe: 7. Januar 2008, 12.00 Uhr Abnahme praktischer Teil: 7. Januar - 10. Januar 2008
Aufgabe 1 Das Sieb des Eratosthenes (praktisch) (5 Punkte)
Informieren Sie sich über das Sieb des Eratosthenes und implementieren Sie es in Java. Folgendes sollen Sie dabei beachten:
• Lesen Sie von der Kommandozeile eine natürliche Zahln ein. Legen Sie ein bool’sches Feld der Größenan. Jedes Element im Feld soll den Primzahlstatus des Index wiedergeben. Überprüfen Sie, ob die eingelesene Größe sinnvoll ist. Geben Sie gegebenenfalls eine Fehlermeldung aus.
• Am Ende sollen alle berechneten Primzahlen auf der Konsole ausgegeben werden.
• Ihre Implementierung soll nur for- und keine while-Schleifen enthalten.
Aufgabe 2 Sortieren durch Einfügen auf Arrays (praktisch)
(6 Punkte)
In dieser Aufgabe geht es darum den in der Vorlesung vorgestellten Sortieren durch Einfügen Algorithmus prozedural auf Feldern zu implementieren.
a) Entwerfen Sie einen Verbund,DataSetder einen Schlüssel (key) und einen String (name) speichert.
Schreiben Sie nun eine Prozedur, die in ein Feld von DataSet-Verbunden ein weiteres Element sortiert (nach key) einfügt. Sie dürfen davon ausgehen, dass das Feld vor dem Einfügen sortiert ist. (3 Punkte) b) Implementieren Sie basierend auf Teilaufgabe a) ein vollständiges Sortieren durch Einfügen. (2 Punkte) c) Schreiben Sie ein Hauptprogramm, das Ihre Implementierung testet. (1 Punkt)
Aufgabe 3 Sortieren durch Einfügen auf rekursiven Verbunden
(praktisch) (8 Punkte)
In dieser Aufgabe geht es darum InsertionSort rekursiv zu implementieren.
a) Entwerfen Sie einen rekursiv referenzierten Verbund DataSetList, deren Elemente vom Verbund DataSetaus der vorangegenden Aufgabe sind. (1 Punkt) b) Schreiben Sie eine rekursive Java-Methodevoid insert(DataSetList l, DataSetList elem){. . .}, die eine nach Schlüsseln sortierte einfachverkette Listelund ein einzufügendes Elementelemals Einga- be entgegenimmt undeleminleinfügt, ohne die Sortierungseigenschaft vonlzu verletzen. (3 Punkte) Hinweis:Sie dürfen annehmen, dass die Listeelemgenau ein Element enthält.
c) Implementieren Sie eine rekursive Java-MethodeDataSetList insertionSort(DataSetList l){. . .}, die eine einfachverkettete Liste l als Eingabe eintgegennimmt und diese nach dem Sortieren durch
Einfügen Algorithmus sortiert. (3 Punkte)
d) Schreiben Sie ein Hauptprogramm, das Ihre Implementierung testet. (1 Punkt)
Aufgabe 4 Append mit rekursiven Verbunden (praktisch) (11 Punkte)
In dieser Aufgabe sollen Sie drei verschiedene Prozeduren schreiben, die zwei einfach verkettete Listen aneinander hängen. Die Arbeitsweisen der Prozeduren werden in den Abbildungen unten veranschaulicht.
a) Schreiben Sie eine rekursive Java-Methode
DataSetList append1(DataSetList l1, DataSetList l2){. . .},
die zwei einfachverketten Listenl1 undl2 als Eingabe entgegenimmt undl2 anl1 anhängt, indem siel2
in die letzte next-Komponente vonl1speichert. Die Arbeitsweise vonappend1wird in den Abbildungen 1 und 2 veranschaulicht. Das Ergebnis der Prozedur istl1. (3 Punkte) b) Schreiben Sie eine rekursive Java-Methode
DataSetList append2(DataSetList l1, DataSetList l2){. . .},
die zwei einfachverketten Listenl1 undl2 als Eingabe entgegenimmt, ein Duplikat des Skeletts vonl1 erzeugt,l3, undl2 in die letzte next-Komponente vonl3speichert. Die Arbeitsweise vonappend1wird in den Abbildungen 1 und 3 veranschaulicht. Das Ergebnis der Prozedur istl3. (3 Punkte) c) Schreiben Sie eine rekursive Java-Methode
DataSetList append3(DataSetList l1, DataSetList l2){. . .},
die zwei einfachverketten Listenl1undl2als Eingabe entgegenimmt, die gesamten vonl1 undl2refe- renzierten Geflechte dupliziert, das zweite Duplikat in die letzte next-Komponente des ersten Duplikats speichert. Die Arbeitsweise vonappend3wird in den Abbildungen 1 und 4 veranschaulicht. Das Ergeb-
nis der Prozedur istl3 (3 Punkte)
d) Beantworten Sie schriftlich die folgende Frage, die sich auf die Teilaufgabe c bezieht: Ist die Sum- me der Verbund-Objekte in den Geflechten, die vonl1 undl2 referenziert werden, und die Anzahl der Verbund-Objekte im Geflecht, das vonl3referenziert wird, immer gleich? Begründen Sie Ihre Antwort.
(2 Punkte)
3:DSList
1:DSList 2:DSList 4:DSList
l1 l2
5:DataSet 6:DataSet 7:DataSet 8:DataSet
Abbildung 1: Das Objekt-Geflecht vor den Aufrufen vonappend1,append2undappend3.
Aufgabe 5 Die große Weihnachts-Refactoring-Aufgabe (praktisch) (10 Bonus-Punkte)
Laden Sie sich von der Vorlesungsseite die Datei SurfXY.java herunter! Das Programm zeichnet drei- dimensionale Kurven. Diese werden durch Linien dargestellt. In dieser Aufgabe sollen Sie das Programm so ergänzen, dass zusätzlich Linien gezeichnet werden: Die Kurve soll als Gitternetz dargestellt werden.
4:DSList l1
l2
1:DSList 2:DSList 3:DSList
5:DataSet 6:DataSet 7:DataSet 8:DataSet
Abbildung 2: Das Objekt-Geflecht nach dem Aufruf vonappend1.
4:DSList
l1 l2
1:DSList 2:DSList 3:DSList
5:DataSet 6:DataSet 7:DataSet 8:DataSet
9:DSList 10:DSList l3
Abbildung 3: Das Objekt-Geflecht nach dem Aufruf vonappend2.
5:DataSet 6:DataSet 7:DataSet 8:DataSet
9:DSList 10:DSList 11:DSList 12:DSList
l1 l2
13:DataSet 14:DataSet 15:DataSet 16:DataSet
a b c d
a b c d
1:DSList 2:DSList 3:DSList 4:DSList
l3
Abbildung 4: Das Objekt-Geflecht nach dem Aufruf vonappend3.
a) Schreiben Sie die Datei SurfXY.java so um, dass sie wesentlich verständlicher wird. Bennen Sie hierzu zum Beispiel Variablennamen um, ergänzen Sie Prozeduren um Parameter, führen Sie lokale Variablen ein und benutzen Sie Verbunde.
b) Ergänzen Sie jetzt die zusätzlichen Linien.