Übungen zur Lehrveranstaltung
"Programmierkurs Java"
WS 1998/99
FB Informatik
D. Boles
Übungsblatt 14 (letztes Übungsblatt)
Ausgabe: 10.02.1999 (keine Abgabe!)
Aufgabe 50 (Klassendefinition / Exceptions): 30 Punkte
Ein Stellenwertsystem ist ein 3-Tupel S = (b, Z, f) mit folgenden Eigenschaften:
• b >= 2 ist eine natürliche Zahl; die Basis des Stellenwertsystems.
• Z ist eine b-elementige Menge von Symbolen, den Ziffern
• f : Z -> {0, 1, ..., b-1} ist eine Abbildung, die jedem Ziffernsymbol umkehrbar eindeutig eine natürliche Zahl zwischen 0 und b-1 zuordnet.
Eine Zahl ist eine endliche Folge von Ziffern.
Der Wert w(z) einer Zahl z = zn zn-1 ... z1 z0 mit zi ist Element aus Z, n >= 0 bestimmt sich durch w(z) = Summe(i=0 bis n): f(zi) * (b hoch i).
Das Hexadezimalsystem ist ein Stellenwertsystem S, das folgendermaßen definiert ist:
S = (b, Z, f) mit
• b = 16,
• Z = {´0´, ´1´, ´2´, ´3´, ´4´, ´5´, ´6´, ´7´, ´8´, ´9, ´A´, ´B´, ´C´, ´D´, ´E´, ´F´} und
• f : Z -> {0, 1, ..., 15} mit
f(´0´) = 0; f(´1´) = 1; f(´2´) = 2; f(´3´) = 3; f(´4´) = 4;
f(´5´) = 5; f(´6´) = 6; f(´7´) = 7; f(´8´) = 8; f(´9´) = 9;
f(´A´) = 10; f(´B´) = 11; f(´C´) = 12; f(´D´) = 13;
f(´E´) = 14; f(´F´) = 15;
Beispiele: w(´2´) = 2, w(´10´) = 16, w(´1F´) = 31, w(´1AF´) = 431
Definieren und implementieren Sie eine Klasse
Hexa, die den Umgang mit positiven Hexadezimal-Zahlen realisiert. Leiten Sie die Klasse Hexa von der abstrakten Klasse java.lang.Number ab. Die Klasse soll folgende Methoden zur Verfügung stellen:• geeignete Konstruktoren (long-Parameter, String-Parameter, Copy-Konstruktor)
• Konvertierungsmethoden, die ein Hexa-Objekt in int-, long-, float-, double- und String-Werte konvertieren
• Vergleichsmethoden, die den Operatoren >, >=, <, <=, ==, != entsprechen
• Methoden, die den arithmetischen Operatoren +, -, *, /, %, +=, -=, *=, /=, %= entsprechen.
Tips und Anmerkungen:
• Realisieren Sie die Menge Z als char-Array
• Codieren Sie Hexadezimal-Zahlen als Strings
• Rechnen Sie klassenintern mit int-Werten
• Die Konvertierungen funktionieren ähnlich wie bei Binärzahlen
• Überlegen Sie sich, welche Methoden Instanzmethoden und welche Methoden Klassenmethoden sind
• Achten Sie auf mögliche Fehlerfälle, wie Division durch 0 oder die Übergabe negativer Zahlen; definieren Sie geeignete Exceptions!
• Versuchen Sie zunächst selbst, ein Klassenprotokoll zu definieren. Wenn Sie Probleme haben, kopieren Sie sich die Datei
/user/fb10/dibo/java/Hexa.java vom ARBI-Cluster (auch auf Homepage zur Vorlesung), und implementieren Sie die vorgegebenen Methoden. Achtung: In dieser Vorlage sind noch keine Exceptions integriert, das müssen Sie selber tun!• Sie brauchen kein Rahmenprogramm zum Testen zu schreiben (siehe dazu Aufgabe 51)
Aufgabe 51 (Objekte / Exceptions): 25 Punkte
Implementieren Sie einen Taschenrechner, der auf der Basis der Umgekehrten Polnischen Notation (UPN) das Rechnen mit Hexadezimal-Zahlen ermöglicht. Der Taschenrechner soll die Operationen +, -, *, / und % unterstützen. Nutzen Sie dabei die Klasse
Hexa aus Aufgabe 50 und die Klasse java.util.Stack aus der JDK-Klassenbibliothek.Anmerkungen und Tips:
• Beachten Sie fehlerhafte und ungültige Zahl-Eingaben
• Beachten Sie fehlerhafte Operator-Eingaben
• Beachten Sie ungültige Fälle, wie Angabe eines Operators, ohne daß Zahlen auf dem Stack liegen, oder Division durch 0 oder Operationen, durch die negative Zahlen entstehen könnten.
Hinweis:
Bei der UPN werden eingelesene Zahlen jeweils oben auf den Stapel gelegt. Wird ein Operator eingegeben, werden die beiden oberen Elemente vom Stapel entfernt, darauf die Operation angewendet, das Ergebnis ausgegeben und das Ergebnis auf den Stapel gelegt.
Beispiel:
Eingabe: 10 (entspricht dezimal 16)
Eingabe: 21 (33)
Eingabe: 1F (31)
Eingabe: - (33 - 31 = 2)
Ausgabe: 2 (2)
Eingabe: + (16 + 2 = 18)
Ausgabe: 12 (18)
Aufgabe 52 (Dokumentation): 25 Punkte
Dokumentieren Sie die Klasse Hexa aus Aufgabe 50 gemäß der javadoc-Dokumentationsrichtlinien, die in der Vorlesung vorgestellt wurden. Rufen Sie javadoc Hexa.java auf. Schauen Sie sich mit Netscape die generierten .html-Dateien an!
Aufgabe 53 (GoBang): 20 Punkte
Diesmal integrieren wir die Komponente Zeit in die GoBang-Programme.
Beim GoBang-Turnier hat Ihr Programm insgesamt maximal n CPU-Millisekunden Zeit (n ist variabel und wird in Abhängigkeit von der Anzahl an Mitspielern erst kurz vor dem Turnier gesetzt (wahrscheinlich 5 oder 10 Minuten)). Sobald diese Zeitschranke überschritten wird, hat Ihr Programm verloren. Dabei wird von meinem Kontrollprogramm die Zeit nachgehalten, die in den GoBangSpieler-Methoden init und liefereNaechstenSpielzug verbraucht wird. Den Parameter n können Sie mittels der Methode int getMaxTime() (liefert die maximal zur Verfügung stehende Zeit in Millisekunden) der Klasse GoBangSpieler ermitteln.
Von der Klasse GoBangSpieler erbt Ihr Programm weiterhin eine Methode int getUsedTime(), die die bisher durch Ihr Programm insgesamt verbrauchte CPU-Zeit in Millisekunden (1000stel Sekunde) zurückliefert. Nutzen Sie diese Methode! Ändern Sie die Spielstrategie Ihres Programmes so ab, daß es die n-Minuten-Schranke nicht überschreitet.
Achtung!!!!!
:Wie Tests gezeigt haben, ist die bisherige GoBang-Spielfeldgröße (8*8-Felder) zu klein. Es würde beim GoBang-Turnier zu viele Unentschieden geben, destruktive Programme hätten mehr Chancen als konstruktive Programme. Daher wird die Spielfeldgröße auf 10*10 Felder erweitert. Bei meinem GoBang-Programm auf dem ARBI-Cluster wird diese Änderung wirksam ab Mittwoch, den 10.02.99, 12 Uhr mittags.