CoMa

Computerorientierte Mathematik

TU logo

Inhalt
.

Institut
 .  Vorlesungen
 .  .  CoMa
 .  .  .  ehemalige Zyklen
 .  .  .  .  CoMaI WS00/01
 .  .  .  .  .  Literatur
 .  .  .  .  .  Programmierregeln
 .  .  .  .  .  Mailarchiv
 .  .  .  .  .  Programm 5
 .  .  .  .  .  Programm 6
 .  .  .  .  .  Programm 7
 .  .  .  .  . Programm 8
 .  .  .  .  .  0/1 Challenge

back zurück

Computerorientierte Mathematik I (WS00/01)
- 8. Programmieraufgabe -


Übersicht

Achtung! Eine ausdruckbare Version dieser Seite findet ihr hier.

Abgabetermin

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.

top top
zuletzt bearbeitet: Tue Aug 7 2001, zuletzt erstellt: Wed Sep 29 2004
Andreas Fest <fest@math.tu-berlin.de>
Validate HTML