Inhalt

zurück
|
|
Computerorientierte
Mathematik I
(WS00/01)
-
8. Programmieraufgabe -
Übersicht
Achtung! Eine ausdruckbare Version dieser Seite findet ihr
hier.
Diese Aufgabe besteht aus zwei Teilen.
Der erste Teil ist bis zum Montag, 22.Januar 2001
vorzuführen, der zweite Teil bis Montag, 5. Februar 2001.
Verspätete Abgaben sind bis aller spätestens Montag,
12. Februar 2001 möglich.
Aufgabenstellung
Teil 1
Schreibt eine Application mit
- zwei
TextArea's, wobei eine editierbar ist, die andere nicht.
Es soll zunächst nur die editierbare TextArea verwendet werden. Die
zweite wird erst im 2.Teil benötigt.
- einer Menüzeile, die ein "
File"-Menü mit folgenden
Einträgen enthält:
New: beide TextAreas sollen gelöscht werden.
Open File: Ein FileDialog soll geöffnet
werden, so dass eine Textdatei ausgewählt werden kann. Diese
Datei wird ausgelesen und ihr Inhalt in die editierbare TextArea
geschrieben.
-
Save As: Der Inhalt der editierbaren TextArea
wird in eine Datei geschrieben, die zuvor mit einem
FileDialog ausgewählt wird.
-
Quit: das Programm wird beendet, wobei der Benutzer
zuvor gefragt wird, ob er den Inhalt der editierbaren
TextArea speichern möchte.
Für die Benutzerabfrage verwendet z.B einen Dialog
aus JOptionPane (siehe Java-Tutorial) oder den einfachen QuestionDialog:
QuestionDialog frage = new QuestionDialog(this, "Save File?");
frage.show();
int state = frage.getSelection();
frage.dispose();
if (state==QuestionDialog.CANCEL) {...}
if (state==QuestionDialog.YES) {...}
if (state==QuestionDialog.NO) {...}
Wer Zeit und Lust hat, kann noch zusätzliche Menüpunkte vorsehen,
z.B. um eine Textdatei in das Editierfeld einzufügen, ...
Teil 2
Implementiert vier verschiedene generische
Sortieralgorithmen,
die auf paarweisen
Vergleichen beruhen, und zwar
- Quicksort,
- Mergesort,
- sowie zwei langsame Algorithmen (wie z.B. Insertionsort).
Die Algorithmen sollen Felder sortieren können, deren Elemente
vergleichbar sind. Implementiert drei solche vergleichbare Datentypen:
- ganze Zahlen,
- Strings mit lexikographischen Vergleich sowie
- Strings mit lexikographischen Vergleich ohne Beachtung von
GroßKleinSchreibung.
Benutzt für die Implementation der vergleichbaren Datentypen die
Schnittstelle Sortable.
Jeder
Sortieralgorithmen muß die Schnittstelle
SortAlgorithm implementieren. D.h. jeder
Sortieralgorithmus ist eine eigene Klasse. Der eigentliche
Algorithmus wird in der sort-Methode der Klasse
ausgeführt. (Mehr zur Implementation der Schnittstellen: s.u.)
Folgendes UML-Klassendiagramm zeigt die wichtigsten Zusammenhänge und
enthält einige Tipps für die Implementation: [ps].
(Zur Vereinfachung sind nur 2 statt 4 Algorithmen und 2 statt 3
Datentypen dargestellt.)
Hier findet ihr eine Legende zu UML-Klassendiagrammen: [ps], [pdf]
Test-Applikation: Verwendet nun eure Application aus dem
ersten Teil, um die Algorithmen zu testen. Aus der editierbaren
TextArea soll zeilenweise ein Feld von
vergleichbaren Elementen ausgelesen werden. In der anderen soll
das Ergebnis nach dem Sortieren angezeigt werden.
Weiterhin sollen zwei Auswahlfelder (engl./Java: Choice) existieren:
- Über ein
Choice-Feld der/die Benutzer(in) den zu
sortierenden Datentyp (ganze Zahl, Strings, Strings ohne Beachtung von
GroßKleinSchreibung) angeben können.
- Mit einem weiteren
Choice-Feld wird der
zu verwendende
Sortieralgorithmus (einer der vier) einstellt.
Die zum Sortieren benötigte
Rechenzeit soll in einem Feld angezeigt werden. Schreibt eine
Methode checkOrder, die Sortierung auf Korrektheit
überprüft und reagiert geeignet, falls die Daten nicht korrekt
sortiert sind.
Selbstverständlich müssen alle möglichen Exceptions
sinnvoll behandelt werden.
>Regeln Diese Programmieraufgabe ist weniger komplex als die
6. und 7. Programmieraufgabe. Daher bestehen wir auf eine sehr genaue
Einhaltung der Programmierregeln. Versucht
einen besonders klaren, schönen und gut zu verstehenden Code zu
schreiben (Schafft ihr es die Algorithmen eleganter als die Version im
Skript zu implementieren?).
Dazu gehört auch eine gute Wahl der Datei-/Klassennamen. So
sollte eine Implementation des Bubblesort-Algorithmus
z.B. Bubblesort heißen; der Name der
Test-Applikation sollte mit ...Test,
...Frame, ...Appl oder
...Application enden.
Die Schnittstellen Sortable und SortAlgorithm
Hier gibt es die Dokumentation und die Implementation der
Schnittstellen:
Sortable: Bei der Implementation der Schnittstelle Sortable gibt es
einiges zu beachten:
- Die Methoden müssen als Parameter den Typ
Sortable verwenden. Daher können Objekte aller
Typen übergeben werden, die die Schnittstelle implementieren.
Daher ist es notwendig, einen sog. Downcast
durchzuführen.
Nehmen wir an, wir haben eine Klasse
A, eine davon abgeleitete Klasse B
sowie eine Instanz der Klasse B gespeichert in
einer Variablen a vom Typ A. Dann
"casted" der Downcast das Objekt von der Basisklasse
A
zu einem Object der Klasse B:
class A {}
class B extends A {
public void methodOfB() {
System.out.println("*** type B ***");
}
}
public class Test {
public static void main () {
...
A a = new B(); // OK, implicit upcast
a.methodOfB(); // wrong, a is of type A
B b = (B)a; // valid downcast
b.methodOfB(); // OK, b is equal to a, but b is of type B
....
}
- Sollte bei einem Downcast das zu-"castende" Objekt nicht von richtigen Typ (oder
einem wiederum davon abgeleiteten Typ) sein, so wird eine
ClassCastException geworfen:
try {
A a = new A(); // OK, same type
B b = (B)a; // invalid downcast, throws exception
}
catch(ClassCastException e) {
....
}
- Verglichen werden immer 2 Objekte des gleichen Typs, also 2
Instanzen der gleichen Klasse, die die Schnittstelle
implementiert. Falls ein Objekt eines anderen Typs übergeben
wird, muss die
WrongSortTypeException geworfen werden:
public class SortableString {
/** the string */
protected String str;
/** Constructs a SortableString with a given value. */
public boolean isEqual ( Sortable item )
throws WrongSortTypeException {
try {
return (0 == str.compareTo(((SortableString)item).str));
}
catch(ClassCastException e) {
throw new WrongSortTypeException();
}
}
- Tipp: Für die Implementation des lexikographischen Vergleiches
von
Strings gibt es die Methode
compareTo (sowie weitere nützliche Methoden)
in der Klasse java.lang.String.
SortAlgorithm: Jeder einzelne Sortieralgorithmus
wird als eigene Klasse implementiert, die das Interface
SortAlgorithm implementiert. Der eigentliche
Algorithmus wird in der sort-Methode der Klasse
programmiert. Es ist ausdrücklich erwünscht, dass Teile des
Algorithmus in (protected) Methoden der Klasse "ausgelagert"
werden. Es ist jedoch sehr selten sinnvoll, dass eine
Sortieralgorithmusklasse irgendwelche Variablen (ausser
Konstanten) besitzt.
|