PDF-Dokument - von Ulrich Helmich

Transcription

PDF-Dokument - von Ulrich Helmich
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
8.6 Visualisierung der Sortieralgorithmen
8.6.1 Problemstellung
Schauen Sie sich den folgenden Quelltext eines Java-Applets an:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class SortApp extends JApplet implements Runnable
{
Thread uhr;
Liste zahlen;
public void init()
{
zahlen = new Liste();
zahlen.erzeugen();
}
public void start()
{
if (uhr == null)
{
uhr = new Thread(this);
uhr.start();
}
}
public void run()
{
for (int i=0; i<100; i++)
{
zahlen.insertionsortNextStep(i);
repaint();
try { Thread.sleep(200); }
catch (InterruptedException e) { }
}
}
public void paint(Graphics g)
{
zahlen.paint(g);
}
}
Dieses Applet erzeugt in der init()-Methode ein Objekt zahlen der Klasse Liste; in der paint()-Methode
werden die Zahlen dann als Balkendiagramm dargestellt.
Seite 1 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
8.6-1 Die noch nicht sortierten Zahlen als Balkendiagramm
8.6-2 Die Zahlen dem Ausführen eines Sortier-Algorithmus
Seite 2 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
8.6.2 Ein Applet mit einem Timer
In der Methode
public void start()
{
if (uhr == null)
{
uhr = new Thread(this);
uhr.start();
}
}
des Applets wird das Timer-Objekt uhr initialisiert und gestartet, falls das noch nicht der Fall war.
Die run()-Methode ist die wichtigste Methode eines Timer-Applets:
public void run()
{
for (int i=0; i<100; i++)
{
zahlen.insertionsortNextStep(i);
repaint();
try { Thread.sleep(200); }
catch (InterruptedException e) { }
}
}
Die for-Schleife ruft 100 Durchgänge einer Insertionsort-Methode auf; zur Steuerung dient die Laufvariable i.
Nach jedem Durchgang wird repaint() aufgerufen, so dass die Zahlen neu gezeichnet werden können. Auf diese
Weise kann man den Fortschritt des Sortierens beobachten.
Dann wird versucht, den Prozess für 200 Millisekunden anzuhalten, damit der Benutzer des Programms
überhaupt etwas sehen kann. Andernfalls würden die Zahlen so schnell sortiert, dass man gleich das
Balkendiagramm mit den fertig sortierten Zahlen sehen würde. Wir wollen den Sortieralgorithmus aber bei seiner
Arbeit beobachten, also müssen wir den Vorgang verlangsamen. Dazu dient die 200 ms-Pause.
Falls aus irgendwelchen Gründen dieser Versuch (try) misslingt, tritt der catch-Fall ein. Es wird dann eine
geordnete Fehlermeldung ausgegeben.
So viel zum Thema Timer. Im Abschnitt 9.3 benötigen wir noch mal einen Timer, wenn wir mit Hilfe eines
zweidimensionalen Arrays einen zellulären Automaten programmieren.
Seite 3 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
8.6.3 Übungen
Beginnen wir mit der Haupt-Übung, die am meisten Punkte bringt:
Übung 8.6 - 1 (8 Punkte)
Ergänzen Sie die Klasse Liste um die noch fehlende Methode
public void insertionSortNextStep(int i)
welche jeweils einen Durchgang des Insertionsort ausführt. Nach dem ersten Aufruf der Methode umfasst
der sortierte Teil also genau ein Element. Nach dem zweiten Aufruf durch die run()-Methode sind bereits
zwei Zahlen sortiert und so weiter. Nach dem letzten Aufruf sind dann alle Zahlen sortiert.
Nicht alle Schüler werden mit dieser Übung auf Anhieb erfolgreich sein, sie ist doch recht schwer. Daher gibt es
alternativ ein paar einfachere Übungen, von denen Sie mit Sicherheit eine schaffen werden.
Übung 8.6 - 1A (3 Punkte)
Ergänzen Sie die Klasse Liste um die noch fehlende Methode
public void insertionSort()
welche den Insertionsort ausführt. Verwenden Sie dann das folgende Java-Applet, um den Insertionsort zu
testen.
import java.awt.*;
import javax.swing.*;
public class SortApp extends JApplet
{
Liste zahlen;
public void init()
{
zahlen = new Liste();
zahlen.erzeugen();
zahlen.insertionsort();
}
public void paint(Graphics g)
{
zahlen.paint(g);
}
}
Wenn Ihnen diese Variante gelungen ist, können Sie sich ja doch noch einmal an der Hauptübung probieren; den
Quelltext des Applets haben Sie ja zur Verfügung, sie müssen nur noch den Insertionsort zu umprogrammieren,
dass das Applet jeweils nur einen Durchgang ausführt.
Wenn Sie mit dem Timer keine Probleme haben, dafür aber mit der Umgestaltung des Insertionsort, dann
ersetzen Sie doch einfach den Insertionsort durch den einfacher zu programmierenden Selectionsort.
Seite 4 von 5
Ulrich Helmich: Informatik 1 mit BlueJ - Ein Kurs für die Stufe EF
Übung 8.6 - 1B (6 Punkte)
Wie Hauptübung 8.6 - 1, allerdings mit Selectionsort statt Insertionsort.
8.6.4 Ergänzungsübungen
Natürlich kann man das Applet noch schöner machen, als es hier der Fall ist.
Übung 8.6 - 2 (3 Punkte)
Führen Sie die Hauptübung oder die Alternativübung 8.6 - 1B durch.
Verändern Sie dann die paint()-Methode der Klasse Liste so, dass der bereits sortierte Teil des Arrays in
einer anderen Farbe dargestellt wird.
Übung 8.6 - 3 (5 Punkte)
Schauen Sie sich in Folge 6 noch einmal an, wie man mit Buttons in einem Java-Applet umgeht.
Erweitern Sie das Applet dann so, dass man mit Hilfe von drei Buttons zwischen den drei
Sortieralgorithmen Bubblesort, Selectionsort und Insertionsort wählen kann.
Übung 8.6 - 4 (3 Punkte)
Erweitern Sie das Programm aus Übung 8.6 - 3 so, dass die zum Sortieren benötigten Befehle (Vergleiche,
Zuweisungen etc.) mitgezählt und angezeigt werden.
Seite 5 von 5