Einzelnen Beitrag anzeigen

Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#1

Osterformel nach Computus ecclesiasticus

  Alt 9. Mär 2010, 19:40
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
Miniaturansicht angehängter Grafiken
computus_115.jpg  
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat