Übungen zur Lehrveranstaltung

"Programmierkurs Java"

WS 1999/2000

FB Informatik

D. Boles

 

Übungsblatt 14 (letztes Übungsblatt)

Ausgabe: 09.02.2000 (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 Metamorphose-Programme.

Beim Metamorphose-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 MetamorphoseSpieler-Methoden 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 MetamorphoseSpieler ermitteln.

Von der Klasse MetamorphoseSpieler 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!!!!!:

Wer am Metamorphose-Turnier teilnehmen will, sollte folgendes beachten: