Osterformel nach Computus ecclesiasticus
Heute stelle ich einen Algorithmus vor, der schon fast in Vergessenheit
geraten ist. Wie wir alle wissen, hat sich Gauss 1800 mit seinem Osteralgorithmus
verewigt, der heute immer noch in julianischen und gregorianischen
Kalendern Anwendung findet. Der ist hier in der
DP mehrfach zu finden.
In den Jahren davor war es hohen Priestern vorbehalten, sich mit
Algorithmen zum Kalender zu beschäftigen. Aus diesen Zeiten stammt der
Computus ecclesiasticus zur Bestimmung des Ostersonntags eines Jahres,
namentlich auf
Aloysius Lillius und dem Jesuiten
Christopher Clavius
zurückzuführen. Die Quellen zu dem Pseudocode sind im Internet sehr rar.
Ich habe diesen Pseudocode bei Helmut Herold gefunden:
Die Programmiersprache C, Teil 2 S.266 (im Anhang)
Der Pseudocode liefert Daten für Ostersonntage im gregorianischen
Kalender.
Einige werden wieder fragen: Was soll das?
Ich meine:
- Delphi liefert, zumindest bis zur Version 7 keine Unterstüzung
- Der Code ist wieder plattformunabhängig und lässt sich einfach
in jede Programmiersprache portieren
- Wieder ein hervorragendes Beispiel, um Pseudocode in Code umzusetzen
(vor allem für Anfänger ein riesengrosses Problem)
- Interesse zu wecken, den Code zu verstehen
(erfordert viel Recherche-Arbeit)
- Ergebnisse mit dem Gauss-Algorithmus vergleichen
- Der Pseudo-Code hat historische Bedeutung
Nach Delphi umgesetzter Code (Vorschlag):
Delphi-Quellcode:
implementation
{$R *.dfm}
//Osterformel mit computus ecclesiaticus
function computus(y:integer):TDate;
var C,G,X,Z,D,E,N,T,M:integer;
mydate:TDate;
begin
G:=(Y mod 19) +1;
C:= Y div 100 +1;
X:= 3*C div 4 - 12;
Z:= (8*C+5) div 25 - 5;
D:= (5*Y) div 4 - X - 10;
E:= (11*G + 20 +Z-X) mod 30;
if (E=25) and (G>11) or (E=24) then inc(E);
N:=44-E;
if n<21 then inc (N,30);
N:=N+7- (D+N) mod 7;
if (N>31) then
begin
T:= n-31; //(n-31).April
M:=4;
end
else
begin
T := N;//n.März
M:=3;
end;
{------Soweit der Originalcode----------}
mydate:=EncodeDate(Y,M,T);
result:=mydate;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Y:integer;
begin
Y:=StrToInt(Spinedit1.Text);
Edit1.Text:=DateToStr(computus(Y));
end;
end.
Gruss
Wolfgang