Folge 21, Erweiterungsteil für Fortgeschrittene

Ein graphisches Interface für den Interpreter

Übung 21.10 (3 Punkte)

Schreiben Sie für die Klasse Stack eine anzeigen()-Methode, die den Stack in einem Java-Applet korrekt und auch einigermaßen "schön" anzeigt. Die jeweils neuen Elemente sollen sich oben im Stack befinden, die alten Elemente unten. Der Stack soll nach oben wachsen können.

Falls nicht alle Stack-Elemente dargestellt werden können, weil die Höhe zu klein gewählt wurde, so sollen nur die oberen Stack-Elemente angezeigt werden. Es wäre auch gut, wenn das oberste Stack-Element besonders gekennzeichnet würde.

Ein möglicher Methodenkopf könnte so aussehen:

public void anzeigen(Graphics g, int x, int y, int breite, int hoehe)

Testen Sie die Methode mit einem einfachen Java-Applet. Überprüfen Sie auch, ob der Stack nach Ausführen mehrerer push()- und pop()-Operationen noch korrekt dargestellt wird.


Hier sehen Sie eine schon recht aufwändige Implementation der Methode. Man achte darauf, dass für die Darstellung eine sehr große Höhe gewählt wurde (360 Pixel), und dass 12 Zahlen gepusht wurden, bevor die anzeigen()-Methode aufgerufen wurde. Mit g.setColor() und g.fillRect() wurden vor dem Aufruf von g.drawString() die alternierenden Texthintergründe gezeichnet. Kleiner Tipp: Mit dem Modulo-Operator % kann man feststellen, ob eine Laufvariable i gerade oder ungerade ist: if (i % 2 == 0) ...

Hier sehen Sie das selbe Applet, wenn für das Stack-Fenster eine Höhe von 160 Pixeln gewählt wurde. Es passen nicht mehr alle Stack-Elemente in das Fenster hinein. In diesem Fall werden nur die obersten Stack-Elemente gezeigt; der untere Teil des Stacks wird nicht dargestellt.

Zur Bewertung:

1 Punkt erhalten Sie, wenn der Stack überhaupt irgendwie in einem Applet angezeigt werden kann, und wenn das oberste Stack-Element dabei oben ist.

1 Punkt zusätzlich erhalten Sie, wenn das Stack-Fenster als Rechteck dargestellt wird, und wenn die Ausgabe der Stack-Elemente ausschließlich innerhalb dieses Rechtecks erfolgt.

1 Punkt schließlich bekommen Sie, wenn das oberste Stack-Element farblich besonders gekennzeichnet ist und wenn die Stack-Elemente ansprechend dargestellt werden.

Mehr als 3 Punkte bekommen Sie für diese Extra-Aufgabe nicht, weil sonst das ganze Bewertungssystem ad absurdum geführt würde: Gute Schüler(innen), denen diese Extraaufgaben leicht fallen, würden dann so viele Punkte ansammeln, dass alle anderen Schüler(innen), die lediglich die Pflichtaufgaben lösen, rein rechnerisch nur noch auf die Noten 3 und 4 kommen würden. Aus diesem Grund werden - zumindest in meinen Informatikkursen - für solche Extraaufgaben relativ wenige Punkte vergeben. Zumindest sollen die Schüler(innen), die "nur" die Pflichtaufgaben lösen, die Note "Zwei" bekommen können, wenn Sie die Pflichtaufgaben hundertprozentig lösen.

Übung 21.11 (2 Punkte)

Schreiben Sie für die Klasse Codebuffer eine analoge anzeigen()-Methode. Allerdings soll der Inhalt des Codebuffers von oben nach unten dargestellt werden (siehe Abbildungen weiter unten). Wurde die Höhe des Rechtecks zu klein gewählt, so sollen die unteren Zeilen nicht mehr dargestellt werden. Testen Sie auch diese Methode mit Ihrem Java-Applet.

Hier sehen Sie das Testapplet mit dem Stack und dem Codebuffer, für beide Ausgaben wurde eine Höhe von 360 gewählt.

Wie sieht die Ausgabe aus, wenn die Höhe auf 160 gekürzt wird?

So! Die aktuelle Codezeile wurde hier jeweils blau markiert. Da das Attribut aktuell in dieser Version des Projekts noch nicht verändert werden kann, ist stets die erste Zeile (Index = 0) die aktuelle Zeile.

Übung 21.12 (1 Punkt)

Fassen Sie die Ergebnisse der beiden letzten Übungen zusammen und schreiben Sie für die Klasse Stackinterpreter eine anzeigen()-Methode, die ihrerseits die graphischen anzeigen()-Methoden der Klassen Stack bzw. deren Tochterklasse Stackmaschine sowie Codebuffer aufruft. Die Koordinaten und Maße des Stack- und Codebuffer-Fensters sollen in Stackinterpreter.anzeigen() festgelegt werden, zum Beispiel auf eine Breite von 100 und eine Höhe von 350 Pixeln.

Für diese Übung gibt es nur einen Punkt, weil Sie die Hauptarbeit ja schon geleistet haben, als Sie 21.10 und 21.11 bearbeitet haben.

Übung 21.13 (1 Punkt)

Wenn wir schon einmal dabei sind und sowohl den Codebuffer mit der jeweils aktuellen Quelltextzeile und den Stack in einem Applet anzeigen, dann können wir ja eigentlich auch noch einen Button namens "Step" in das Applet einbauen. Jedes Mal, wenn der Anwender auf den Button klickt, soll der nächste Befehl des Codebuffers ausgeführt werden. Wenn zum Beispiel die Zahl 17 gepusht wird, erscheint nach dem Buttonklick die Zahl 17 oben im Stackfenster. Im Codebufferfenster wandert die Markierung für die aktuelle Codezeile eine Position weiter nach unten.

Warum nur 1 Punkt für diese schwierig aussehende Übung? Weil Ihr Lehrer, also ich, diese Übung in zwei Minuten geschafft hat. Ich musste nur ein Standard-Applet mit einem funktionsfähigen Button erzeugen (für solche Aufgaben habe ich natürlich Klassen-Vorlagen, die ich dann nur noch aufrufen muss), in der init()-Methode des Applets musste ich ein Objekt inter der Klasse Stackinterpreter initialisieren und die Anweisung inter.liesDatei("Readme.txt") geben. In der actionPerformed()-Methode des Applets musste ich dem Interpreter lediglich die Anweisung inter.interpretiereNaechstenBefehl() geben, und in der paint()-Methode des Applets reichte die eine Zeile inter.anzeigen(g) völlig aus - und schon lief das Applet feherfrei.

Sie sehen also, mehr als 1 Punkt für diese Übung ist nicht gerechtfertigt - jedenfalls nicht für fortgeschrittene Schüler(innen), und nur für solche Teilnehmer ist diese Erweiterung der Folge 21 ja eigentlich gedacht.

weiter mit Folge 22: Variablenverwaltung

Der Stackinterpreter, den wir uns in Folge 21 zusammengebastelt haben, kann nur einfache arithmetische Ausdrücke berechnen. Was bisher fehlte, sind Variablen, wie wir sie aus anderen Programmiersprachen kennen. Am Ende dieser Folge kann unser Stackinterpreter mit richtigen Variablen rechnen.

Diese HTML-Seite wurde erstellt von Ulrich Helmich am 10. Mai 2008.




(C) Ulrich Helmich, Mai 2008





IMPRESSUM