Übungen zur Lehrveranstaltung
"Programmierkurs Java"
WS 2000/2001

FB Informatik
D. Boles
Übungsblatt 14 (letztes Übungsblatt)
Ausgabe: 31.01.2001 (keine Abgabe!)
Aufgabe 50 (Exceptions): 15 Punkte
Schreiben Sie eine Methode
int readGeradeZahl(), die mit Hilfe der Methode readInt() der Klasse dibo.Terminal Zahlen von der Tastatur einliest. Die Methode soll positive gerade Zahlen einlesen. Gibt der Benutzer eine negative oder ungerade Zahl ein, soll eine Exception geworfen werden. Definieren Sie dazu geeignete Exception-Klassen. Schreiben Sie ein Testprogramm, das die Methode aufruft und eine geeignete Fehlerbehandlung durchführt.Aufgabe 51 (Exceptions): 15 Punkte
Spielen Sie ein wenig mit folgendem Java-Programm herum. Wann wird was ausgegeben und warum?
import dibo.Terminal;
class DivNullException extends Exception { }
public class A51 {
public static int div(int zahl, int durch) throws DivNullException {
if (durch == 0) throw new DivNullException();
return zahl / durch;
}
public static void main(String[] args) {
try {
while (true) {
System.out.println("Bitte Zahl eingeben: ");
int zahl1 = Terminal.readInt();
if (zahl1 == 1) break;
if (zahl1 == 2) return;
System.out.println("Bitte weitere Zahl eingeben: ");
int zahl2 = Terminal.readInt();
System.out.println(zahl1 + "/" + zahl2 + " = " +
div(zahl1, zahl2)
);
}
} catch (DivNullException exc) {
System.out.println("Division durch 0 ist nicht definiert!");
} finally {
System.out.println("Programm ist beendet!");
}
System.out.println("Ende der main-Methode!");
}
}
Aufgabe 52 (Klassendefinition / Exceptions): 25 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´) = 431Definieren 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.
Tipps 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
• Sie brauchen kein Rahmenprogramm zum Testen zu schreiben (siehe dazu Aufgabe 53)
Aufgabe 53 (Objekte / Exceptions): 15 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 52 und die Klasse java.util.Stack aus der JDK-Klassenbibliothek.Anmerkungen und Tipps:
• Beachten Sie fehlerhafte und ungültige Zahl-Eingaben
• Beachten Sie fehlerhafte Operator-Eingaben
• Beachten Sie ungültige Fälle, wie Angabe eines Operators, ohne dass 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 54 (Dokumentation): 15 Punkte
Dokumentieren Sie die Klasse Hexa aus Aufgabe 52 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 55 (PAROB): 15 Punkte
Diesmal integrieren wir die Komponente Zeit in die PAROB-Programme.
Beim PAROB-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 ParobSpieler-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 ParobSpieler ermitteln.
Von der Klasse ParobSpieler 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, dass es die n-Minuten-Schranke nicht überschreitet.