1. Praktikum: Ostern zum 'warm werden'

Bearbeitungszeitraum:  13.04 - 27.04.04, 10 Uhr 
Gesamtpunktzahl:  6 Punkte
Praktikumsziel: Wiederholung des Umgangs mit der Technologie der Erstellung von Java-Programmen. 
Verwendung einfacher Fallunterscheidungen und logischer Ausdrücke
Voraussetzungen: elementare Java-Kenntnisse
Aufgabe: Aus aktuellem (nun leider schon verflossenem) Anlass sollen Sie ein Java-Programm schreiben, das das Datum beliebiger Ostersonntage ermittelt.


Diese erste Aufgabe ist für Teilnehmer am Praktikum PI1 sicher sehr leicht zu lösen :-)

Sie soll jedoch auch Neueinsteigern in PI2 die Möglichkeit geben, mit einer Java-Programmieraufgabe
noch Punkte zu sammeln, bevor wir zu Prolog wechseln.
 

Aufgabenstellung

Implementieren Sie ein Java-Programm, welches das Osterdatum (Ostersonntag) ermittelt. Das Programm soll
folgende Aufrufmöglichkeiten berücksichtigen:

                das Programm soll dann solange weitere Eingaben anfordern (und die zugehörigen Osterdaten ausgeben) bis das Ende der Eingabe erreicht ist.
                Verwenden Sie für die Abfrage der Eingaben die hier verfügbareKlasse Keyboard.java (insbesondere die Methode
Keyboard.readInt()) .
                das Programm soll dann (nicht interaktiv) beginnend mit dem Jahr jahr die Osterdaten von 10 aufeinanderfolgenden Jahren in Form einer Tabelle ausgeben.
                das Programm soll dann (nicht interaktiv) alle Osterdaten von Jahr vonjahr bis (einschließlich) zum Jahr bisjahr ebenfalls in Form einer Tabelle ausgeben.
                (weitere Parameter werden ignoriert)

Benutzen Sie den im Folgenden beschriebenen Algorithmus:

Auf den jungen Carl Friedrich Gauß geht der folgende Algorithmus zur Berechnung des Osterdatums (Ostersonntag) zurück
[Quelle: "Weser- Kurier" Bremen vom 18.04. 1991]:
 

Gauß stellte folgende Formel zur Berechnung des Osterdatums [ eines Jahres j ] auf:
Ostern ist am (22+d+e). März oder am (d+e-9). April, je nachdem,
ob (22+d+e) < 32 ist oder nicht. Die Berechnung von d und e ist leider
etwas aufwendig, und es gilt:

j = 100p+n   [ p sei dabei maximal, d.h. p = j /100, n = j % 100 ]
q = ganzzahliger Teil von p/3
r =  ganzzahliger Teil von p/4
x = Dreißigerrest von 15+p-q-r
y = Siebenerrest von p-r+4
a = Neunzehnerrest von j
b = Vierererst von j
c = Siebenerrest von j
d = Dreißigerrest von 19a+x
e = Siebenerrest von 2b+4c+6d+y

Keine Regel ohne Ausnahme:
Ist d = 29 und e = 6, so ist Ostern am 19. April.
Ist d = 28 und e = 6, so ist Ostern am 18. April.

Beispiel für Ostern 1992:
j = 1992, p = 19, n = 92, q = 6, r = 4, x = 24,
y = 5, a = 16, b = 0, c = 4, d = 28, e = 0,
22+d+e=50 > 32, d+e-9 = 19
Also 19. April
 

Bei den genannten Resten (Dreißigerrest, Siebenerrest, etc) handelt es sich natürlich um die Reste bei ganzzahlinger Division durch die genannten Zahlen (30, 7, etc.) ]
 

In der interaktiven Variante (Aufruf ohne Parameter) soll sich z.B. der folgende Dialog mit dem Programm ergeben:


data pinf1 157 ( Aufgaben/1.Aufgabe ) > java Ostern
Welches Jahr ? 2004
Ostern ist am 11. April im Jahr 2004
Welches Jahr ? 2005
Ostern ist am 27. Maerz im Jahr 2005
Welches Jahr ? ^D
data pinf1 158 ( Aufgaben/1.Aufgabe ) >



( fett: Nutzereingaben, nicht fett: Ausgaben des Programmes, kursiv: Shell-Prompt, kann natürlich variieren )

Testen Sie das Programm mit folgenden Eingabedaten und kontrollieren Sie dabei, ob die angegebenenen Daten berechnet werden (Ausgabe von java Ostern 1995 ):


1995        16. April
1996         7. April
1997        30. Maerz
1998        12. April
1999         4. April
2000        23. April
2001        15. April
2002        31. Maerz
2003        20. April
2004        11. April

Jede Ausgabezeile besteht aus der Jahreszahl, gefolgt von 2 Tabulatoren und dem Datum ( Tag. Monat ). Wenn der Tag des Datums einstellig ist, soll ein einzelnes Leerzeichen
vor dem Datum dafür sorgen, dass die Tageszahl rechtsbündig ausgegeben wird !

Senden Sie als Lösung Ihren Quelltext Ostern.java und das erzeugte Protokollfile output mit den Osterdaten 2005 bis 2025 (Ausgabe von java Ostern 2005 2025 ) via

https://goya.informatik.hu-berlin.de unter der Aufgabennummer 1 ein.

Hinweis: Der Zugang zu den Programmparametern ist über den Parameter der main-Methode einer ausführbaren Java-Klasse  möglich.


ACHTUNG:

Um die Korrektur der Aufgaben durch die Tutoren zu erleichtern, gelten wie gehabt die folgenden Regeln:
  1. Eingesandte Programme, die nicht vom Compiler akzeptiert werden (d.h. Fehler bei der Übersetzung liefern) werden ohne weitere Inspektion mit

  2. 0 Punkten bewertet !
     
  3. Bei der Einsendung von Ablaufprotokollen (z.B. output in dieser Aufgabe) ist das Format der Ausgaben exakt einzuhalten (incl. Zeilenstruktur und Leerzeichen). Soll und Ist werden automatisch verglichen. Sofern Abweichungen festgestellt werden, gibt es Punkteabzug, über dessen Höhe dann die Tutoren entscheiden ! Die einzig zulässige Abweichung (eine die man bei der Ansicht des Protokolls gar nicht feststellen kann) besteht in der Codierung der Zeilenenden, die unter DOS mit zwei Zeichen (carriage return [/x0d] + line feed [/x0a]) unter Unix dagegen nur mit einem Zeichen (newline [/x0a]) dargestellt werden.

Erstellt am 1.4.2004
Zuletzt modifiziert am 5.4.2004



Anfragen, Korrekturen an  ahrens@informatik.hu-berlin.de