Aufgaben zur Vorlesung
Aufgabe 1:
Die Methode actionPerformed der
Schnittstelle ActionListener bekommt ein Objekt der
Klasse ActionEvent übergeben. In dieser gibt es eine
Methode getWhen, die den Zeitpunkt, zu dem das Ereignis aufgetreten
ist als eine Zahl kodiert zurückgibt. Mit dieser Zahl können Sie die
Klasse java.util.Date instanziieren, um ein Objekt zu bekommen, das
Datum und Uhrzeit enthält.
Schreiben Sie jetzt eine Unterklasse von JTB, so daß beim Drücken des
Knopfes, jetzt die aktuelle Uhrzeit im Textfeld erscheint.
Aufgabe 2:
Schreiben Sie eine kleine Guianwendung mit einer Textfläche und drei
Knöpfen, die einen erweiterten Zähler darstellt:
- einen Knopf zum Erhöhen eines Zählers.
- einen Knopf zum Verringern des Zählers um 1.
- einen Knopf zum Zurücksetzen des Zählers auf 0.
Aufgabe 3:
Schreiben Sie Ihr Programm eines Zählers mit drei Knöpfen jetzt so, daß sie
innere Klassen benutzen.
Aufgabe 4:
(Punkteaufgabe 2 Punkte) Schreiben Sie eine
GUI-Komponente StrichKreis, die mit geraden Linien einen Kreis
entsprechend untenstehender Abbildung malt. Der Radius des Kreises
soll dabei dem Konstruktor der
Klasse StrichKreis als int-Wert
übergeben werden.
Testen Sie Ihre Klasse mit folgender Hauptmethode: public static void main(String [] args) {
StrichKreis k = new StrichKreis(120);
JFrame f = new JFrame();
JPanel p = new JPanel();
p.add(new StrichKreis(120));
p.add(new StrichKreis(10));
p.add(new StrichKreis(60));
p.add(new StrichKreis(50));
p.add(new StrichKreis(70));
f.getContentPane().add(p);
f.pack();
f.setVisible(true);
}
Hinweis: In der Klasse java.lang.Math finden Sie Methoden
trigeometrischer Funktionen.
Insbesondere toRadians zum Umrechnen von Gardwinkel in Bogenmaß
sowie sin und cos.
Aufgabe 5:
Erweitern Sie die Strichkreisklasse aus der letzten Aufgabe, so daß
jeder Strich in einer anderen Farbe gezeichnet wird.
Aufgabe 6:
(2 Punkte)
Implementieren Sie eine Analoguhr. Das Ziffernblatt dieser Uhr können
Sie dabei mit den Methoden auf einem Graphics-Objekt zeichnen, oder
Sie können versuchen eine Bilddatei zu laden und das Ziffernblatt als Bild
bereitstellen. Als Anregung für ein Ziffernblatt können Sie sich das Bild
des
Ziffernblatts der handgefertigten Sekundenuhr des Uhrmachers
G.Wiebking herunterladen.
Aufgabe 7:
Schreiben Sie eine Animation, in der zwei Kreise sich bewegen. Die
Kreise sollen an den Rändern der Spielfläche abprallen und sie sollen
ihre Richtung ändern, wenn sie sich berühren.
Aufgabe 8:
Schreiben Sie eine Animation, deren Verhalten über Mausklicks
beeinflussen können.
Aufgabe 9:
Erzeugen Sie ein Baumobjekt, das einen Stammbaum Ihrer
Familie darstellt. Die Knoten und Blätter sind mit Namen markiert. Die
Wurzel ist mit Ihren Namen markiert.
Kinderknoten sind mit den leiblichen Eltern der
Person eines Knotens markiert.
Aufgabe 10:
Testen Sie die in diesem Abschnitt entwickelten Methoden auf
Bäumen mit dem in der letzten Aufgabe erzeugten Baumobjekt.
Aufgabe 11:
Punkteaufgabe (4 Punkte):
Für diese Aufgabe gibt es maximal 4 auf
die Klausur anzurechnende Punkte. Abgabetermin: wird noch bekanntgegeben.
Schreiben Sie die folgenden weiteren Methoden für die
Klasse Tree. Schreiben Sie Tests für diese Methoden.
- a) List leaves(): erzeugt eine Liste der Markierungen an den
Blättern des Baumes.
- b) String show(): erzeugt eine textuelle Darstellung des
Baumes. Jeder Knoten soll eine eigene Zeile haben. Kinderknoten sollen
gegenüber einem Elternknoten eingerückt sein.
Beispiel:
william
charles
elizabeth
phillip
diana
spencer
Tipp: Benutzen Sie eine Hilfsmethode
String showAux(String prefix),
die den String prefix vor den erzeugten Zeichenketten anhängt.
- c) boolean contains(a o): ist wahr, wenn eine
Knotenmarkierung gleich dem Objekt o ist.
- d) int maxDepth(): gibt die Länge des längsten Pfades von
der Wurzel zu einem Blatt an.
- e) List<a> getPath(a o): gibt die Markierungen auf dem
Pfad von der Wurzel zu dem Knoten, der mit dem Objekt o
markiert ist, zurück. Ergebnis ist eine leere Liste, wenn ein
Objekt gleich o nicht existiert.
- f) java.util.Iterator<a> iterator(): erzeugt ein Iterator
über alle Knotenmarkierungen des Baumes.
Tipp: Benutzen Sie bei der Umsetzung die Methode flatten.
- g) public boolean equals(Object other): soll genau dann
wahr sein, wenn other ein Baum ist, der die gleiche Struktur und
die gleichen Markierungen hat.
- h) <b>boolean sameStructure(Tree<a> other): soll genau dann wahr
sein, wenn der Baum other die gleiche Struktur hat. Die
Markierungen der Knoten können hingegen unterschiedlich sein.
Aufgabe 12:
Schreiben Sie eine Methode List<Tree<a>> siblings(),
die die Geschwister eines Knotens
als Liste ausgibt. In dieser Liste der Geschwister soll der Knoten
selbst nicht auftauchen.
Aufgabe 13:
Schreiben Sie eine modifizierende
Methode
void deleteChildNode(int n),
die den n-ten
Kindknoten löscht, und stattdessen die Kinder des n-ten Kindknotens
als neue Kinder mit einhängt.
Beispiel:
a
/ \
/ \
b c
/ \ / \
d e f g
/|\
h i j
wird durch
deleteChildNode(1)
zu: a
/|\
/ | \
/ | \
/ | \
b f g
/| /|\
d e h i j
Aufgabe 14:
Überschreiben Sie die
Methoden addLeaf und deleteChildNode in
der Klasse BinTree, so daß sie nur eine Ausnahme werfen,
wenn die Durchführung der Modifikation dazu führen würde, daß das
Objekt, auf dem die Methode angewendet wird, anschließend kein
Binärbaum mehr wäre.
Aufgabe 15:
Schreiben Sie analog zur Methode flatten in der
Klasse Tree eine Methode
List<a> postorder(), die die Knoten eines Baumes in
Postordnung linearisiert.
Aufgabe 16:
Rechnen Sie auf dem Papier ein Beispiel für die Arbeitsweise
der Methode military().
Aufgabe 17:
Zeichnen Sie schrittweise die Baumstruktur, die im
Programm TestSearchTree aufgebaut wird.
Aufgabe 18:
Erzeugen Sie ein Objekt des typs SearchTree und
fügen Sie nacheinander die folgenden Elemente ein:
"anna","berta","carla","dieter","erwin","florian","gustav"
Lassen Sie anschließend die maximale Tiefe des Baumes ausgeben.
Aufgabe 19:
- a) Schreiben sie entsprechend die Methode:
static public SearchTree rotateLeft(SearchTree t)
- b)
Schreiben Sie in der Klasse BinTree die
entsprechende modifizierende Methode rotateLeft()
- c) Testen Sie die beiden Rotierungsmethoden. Testen Sie, ob die
Tiefe der Kinder sich verändert und ob die Inordnung gleich
bleibt. Testen Sie insbesondere auch einen Fall, in dem
die NullPointerException abgefangen wird.
Aufgabe 20:
Erweitern Sie die obige Grammatik so, daß sie mit ihr auch
geklammerte arithmetische Ausdrücke ableiten können. Hierfür gibt es
zwei neue Terminalsymbolde: ( und ).
Schreiben Sie
eine Ableitung für den Ausdruck: 1+(2*20)+1
Aufgabe 21:
Betrachten Sie die einfache Grammatik für arithmetische
Ausdrücke aus dem letzen Abschnitt. Zeichnen Sie einen Syntaxbaum für den
Audruck 1+1+2*20.
Aufgabe 22:
(2 Punkte) In dieser Aufgabe sollen Sie den Parser für
arithmetische Ausdrücke um geklammerte Ausdrücke erweitern.
Hierzu sei die Grammatik für die Regel multExpr wie folgt geändert:multExpr ::= atomExprmultOpmultExpratomExpr
atomExpr ::= (addExpr)|zahl
Hierzu sei die entsprechende zusätzliche Tokenaufzählung für die zwei
Klammersymbole gegeben:package name.panitz.parser;
public enum Parentheses implements Token{lpar,rpar;}
Zusätzlich gegeben sei die die folgende Funktion:package name.panitz.parser;
public class DoParentheses
implements
Function<Pair<Parentheses,Pair<Integer,Parentheses>>,Integer>{
public Integer
apply(Pair<Parentheses,Pair<Integer,Parentheses>> x){
return x.getE2().getE1();
}
}
- a) Schreiben Sie eine Klasse AtomExprEval,
die Parser<Integer> implementiert und der Regel
für atomExpr entspricht.
- b) Ändern Sie die Klasse MultExprEval, so daß sie der geänderten
Grammatikregel entspricht.
- c) Erweitern Sie die Klasse ArithTokenizer, so daß er auch die
beiden Klammersymbole erkennt.
Aufgabe 23:
Fügen Sie der Datei sms.jjt folgende Zeilen am
Anfang ein:options {
MULTI=true;
STATIC=false;
}
Generieren Sie mit jjtree und javac den Parser
neu. Was hat sich geändert?
Beispielaufgaben zur Klausur:
Aufgabe 1:
Betrachten Sie folgenden Baum.
- a) Handelt es sich bei diesen Baum um einen binären Suchbaum (mit
lexikographischer Ordnung auf den Stringmarkierungen)? Begründung?
Wenn nicht, dann zeichnen Sie einen binären Suchbaum, der die gleichen
Elemente enthält.
- b) Wie könnten Sie vorgehen, um aus einem Binärbaum einen beliebigen
Knoten zu löschen? Malen sie hierzu Beispiele und beschreiben Sie ihr
Vorgehen.
Aufgabe 2:
Betrachten Sie das folgende Javamethoden, die der
Baumklasse Tree hinzugefügt wurden. Rechnen Sie die Methoden
auf dem Papier für den Baum aus Aufgabe 1 durch und geben ihr Ergebnis
an.
Was berechnen die Methoden?
-
a)
int foo1(){
int result = theChildren().size();
for (Iterator it=theChildren().iterator();it.hasNext();){
final int n = ((Tree)it.next()).foo1();
if (n>result) result=n;
}
return result;
}
-
b)
List foo2(List result){
result.add(mark());
final List xs= theChildren();
if (!xs.isEmpty()){
try {
((Tree)xs.get(1)).foo2(result);
}catch (Exception _){}
}
return result;
}
Aufgabe 3:
Gegeben sei die folgende abstrakte Klasse für Bäume, gemäß unserer
Spezifikation aus der Vorlesung:import java.util.*;
abstract class AbTree{
abstract public AbTree tree(Object mark, List/*AbTree*/ xs);
abstract public Object mark();
abstract public List/*AbTree*/ theChildren();
}
Schreiben Sie für die Klasse folgende Methoden, die ihr hinzugefügt
werden können:
- a) int howOftenContained(Object o): zählt,
wieviel Knoten mit einem Objekt markiert sind, das gleich dem
Argument o ist.
- b) AbTree mapToUpperCase() ergibt einen neuen Baum, der
die gleiche Struktur hat und dessen Knoten mit Strings markiert sind,
die sich ergeben, indem man die Markierungen des Ausgangsbaums
mit mark().toString().toUpperCase() umwandelt.
Aufgabe 4:
Gegeben seien folgende Gui-Komponenten:
-
import javax.swing.*;
import java.awt.event.*;
public class SimpleFrame extends JFrame{
JLabel l = new JLabel("dies ist ein kleines Fenster");
public SimpleFrame(){
super("kleines Fenster");
getContentPane().add(l);
pack();
setVisible(true);
}
}
-
import javax.swing.*;
import java.awt.event.*;
public class GoodbyeFrame extends JFrame{
JLabel l = new JLabel("Danke für Ihr Vertrauen!");
JButton b = new JButton("Programm beenden");
JPanel p = new JPanel();
public GoodbyeFrame(){
super("goodbey Fenster");
p.add(l);
p.add(b);
getContentPane().add(p);
pack();
setVisible(true);
}
}
- a) Erweitern Sie die Komponente GoodbeyFrame so, daß beim
Drücken des Knopfes, das Programm mit System.exit(0)
beendet wird.
- b) Erweitern Sie die Komponente SimpleFrame so, daß beim
Schließen des Fensters ein Objekt des
Typs GoodbyeFrame erzeugt wird.
Aufgabe 5:
Gegeben sei folgende Grammatik:start ::= addExpr
addExpr ::= multExpr addOpaddExpr multExpr
multExpr ::= zahlmultOpmultExpr zahl
multOp ::= */
addOp ::= +-
Das Terminalsymbol zahl steht dabei für eine beliebige Zahl.
- a) Leiten Sie den Ausdruck 1*4+42/5-6 mit der rekursiv
absteigenden Parserstrategie ab.
- b) Zeichnen Sie den Ableitungsbaum für Ihre obige Ableitung.
- c) Die Grammatik erlaubt kein unäres Minussymbol zum Negieren einer
Zahl. Ergänzen Sie die Grammatik, so daß dieses erlaubt ist. Zeigen
Sie damit die Ableitung des Audrucks -12 * -1 -4 + 2.