Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Osterformel nach Computus ecclesiasticus (https://www.delphipraxis.net/148851-osterformel-nach-computus-ecclesiasticus.html)

Wolfgang Mix 9. Mär 2010 19:40


Osterformel nach Computus ecclesiasticus
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

DeddyH 9. Mär 2010 19:46

Re: Osterformel nach Computus ecclesiasticus
 
[OT] Du hast einen Knall mit Deinen Kalenderfunktionen. (SCNR^^)[/OT]
:lol:

Wolfgang Mix 9. Mär 2010 19:54

Re: Osterformel nach Computus ecclesiasticus
 
Naja, ich forsche halt seit längerer Zeit :)

Valle 9. Mär 2010 20:24

Re: Osterformel nach Computus ecclesiasticus
 
Hallo,

ich glaube wir hatten das schonmal in einem anderen Thread von dir, aber ich möchte trotzdem meine Meinung dazu sagen. Ich finde, man sollte der Funktion noch aussagekräftige Variablennamen verpassen. Auch die Formatierung ist nicht gerade schön, auch wenn da jeder seinen eigenen Stil hat. Das Beispiel im Form des ButtonClick-Events sollte man meiner Meinung nach auch entfernen.

Ansonsten kann auch sowas in die CL, wenn es nach mir ginge. Natürlich gehört der Algorithmus zu jenen, die kaum jemand brauchen wird, aber ich wäre trotzdem um jeden halbwegs ordentlichen Beitrag froh. =)
Liebe Grüße,
Valentin

Wolfgang Mix 9. Mär 2010 20:46

Re: Osterformel nach Computus ecclesiasticus
 
@Valle:

- Den Thread hatten wir noch nicht
- Über die Formatierung kann man diskutieren
- Den Button1Click kann man natürlich entfernen,
war als Hilfe für Anfänger gedacht
- Die Variablennamen habe ich bewusst aus dem Original
übernommen, Interessierte sollen schon selbst forschen,
was sie bedeuten (alles vorkauen bringt nichts)
- Dass den Code keiner braucht, ist auch klar

Was du unter einem halbwegs ordentlichen Beitrag verstehst,
ist mir unklar

LG

Wolfgang

Luckie 9. Mär 2010 20:49

Re: Osterformel nach Computus ecclesiasticus
 
Zitat:

Zitat von Wolfgang Mix
- Die Variablennamen habe ich bewusst aus dem Original
übernommen, Interessierte sollen schon selbst forschen,
was sie bedeuten (alles vorkauen bringt nichts)

Das ist aber nicht Sinn und Zweck der Codelib, dass man sich erst extrene Quellen zum Verständnis des Codes suchen muss. Und was mache ich, wenn ich eine andere als deine Quelle mit anderen Variablennamen finde? Was spricht dagegen, den Code durch aussagekräftige Variablenname lesbar, verständlich und nachvollziehbar zu machen?

Matze 9. Mär 2010 20:52

Re: Osterformel nach Computus ecclesiasticus
 
Tja Wolfgang, die Algorithmen nach Delphi zu übersetzen kann im Prinzip jeder. Sie sauber aufzubereiten ist schon etwas aufwändiger. ;)
Wenn du den Code verstanden hast, dann ändere bitte die Variablen. Aktuell finde ich den persönlich auch sehr unleserlich und die Code-Library soll ja eine gewisse Vorbildfunktion haben.

Valle 9. Mär 2010 20:53

Re: Osterformel nach Computus ecclesiasticus
 
Mh. :gruebel:

Also ich bin mir recht sicher, irgendwo mal jemanden deine Variablen-Namen kritisieren gesehen zu haben. Aber wenn du meinst das hat bisher keiner gemacht, dann glaube ich dir das - du wirst es besser wissen als ich. :-)

Mit der Begründung "alles vorkauen bringt nichts" bin ich dann ehrlich gesagt aber nicht mehr einverstanden. Dein Code ist bereits vorgekaut. Jemanden der einfach nur vorran kommen will, braucht ihn nur noch zu kopieren. Für Leute die ihn wirklich verstehen wollen, sind deine Variablen nur noch ein Hindernis. Wenn du nicht vorkauen möchtest, dann bist du in der CL glaube ich falsch.

Zitat:

Zitat von Wolfgang Mix
Was du unter einem halbwegs ordentlichen Beitrag verstehst, ist mir unklar

Es gab (diesmal bin ich mir sicher :mrgreen: ) schon einige Leute, die meinten, deine CL-Beiträge wären sinnlos. Was ich damit sagen wollte ist, dass ich der Meinung bin, dass jeder CL-Eintrag willkommen ist, solange er halbwegs ordentlich ist. Also eine Funktion die Hello World ausgibt wollte ich damit ausschließen. Ansonsten finde ich den Beitrag doch super, ist doch schön dass sich Leute damit befassen. :-)

Liebe Grüße,
Valle

Wolfgang Mix 9. Mär 2010 21:00

Re: Osterformel nach Computus ecclesiasticus
 
Tja Matze, dazu müsste man jetzt die mitteralterlichen Kirchenbücher studieren,
dann wäre man etwas schlauer.

Wenn jemand Lust hat ..., ich erst nach meiner Pension im Sommer :)

alzaimar 9. Mär 2010 21:05

Re: Osterformel nach Computus ecclesiasticus
 
Wolfgang hat mit keinem Wort die Codelibrary erwähnt. Also muss er überhaupt nichts. Er hat 100%ig Recht, wenn er sagt: Schaut selbst nach, es macht Spass, zu recherchieren.

Nur leider ist der Beitrag dann in der falschen Sparte.

Wirklich Wolfgang. Du bist der Einzige, der tolle Beiträge und vergessene Algorithmen auskramt, aber dann zu beratungsresistent ist, den Rest noch beizusteuern. Das fing bei so einer Kalenderfunktion an, ging über diverse Beiträge, die ich vergessen konnte bis zu den quadratische Gleichungen (was war das für ein Heck-Meck) und nun wieder so ein mal wieder sehr interessanter Beitrag, der aber wieder an der Form scheitern wird und -denke ich- keinen Weg in die CL finden wird.

Wenn Dir ein Schüler mit einer Sauklaue und niedergepfuscht auf zerknülltem Papier stichpunktartig eine Hausarbeit abliefert... Wird so eine Arbeit dann prämiert, oder kommt in die Mappe: "Hausarbeiten: Exzellente Beispiele?" Und sag bloß nicht 'Ja', das glaubt man nämlich einem echten Lehrer nicht.

Valle 9. Mär 2010 21:09

Re: Osterformel nach Computus ecclesiasticus
 
Zitat:

Zitat von alzaimar
Wolfgang hat mit keinem Wort die Codelibrary erwähnt. Also muss er überhaupt nichts. Er hat 100%ig Recht, wenn er sagt: Schaut selbst nach, es macht Spass, zu recherchieren.

Nur leider ist der Beitrag dann in der falschen Sparte.

Na gut, das habe ich jetzt einfach anders rum interpretiert. Du sagst, sein Beitrag ist gut, aber nicht für die CL und ich sage sein Beitrag ist noch nicht perfekt, aber geht in Richtung CL. Ich denke schon, dass er für die Code Library gedacht ist, sonst würde Wolgang das doch nicht hier posten. Das machen doch eigentlich nur Neulinge, die nicht wissen wo hin. :-)

Liebe Grüße,
Valle

Balu der Bär 9. Mär 2010 21:13

Re: Osterformel nach Computus ecclesiasticus
 
Nich lange diskutieren, einfach ein bisschen formatieren und aufbereiten und mit in diesem Thread posten: http://www.delphipraxis.net/internal...ct.php?t=44748

Fertig.

Wolfgang Mix 9. Mär 2010 21:14

Re: Osterformel nach Computus ecclesiasticus
 
Ihr könnt den Thread verschieben, wohin ihr wollt,
ist ja nicht mein Geistesgut, würde es allerdings aus
historischen Gründen gut finden, wenn man das hier irgendwo
finden würde.

TBx 9. Mär 2010 21:18

Re: Osterformel nach Computus ecclesiasticus
 
Zitat:

Zitat von alzaimar
Nur leider ist der Beitrag dann in der falschen Sparte.

Das sehe ich auch so und darum geht er nun auch auf die Reise ...

Assertor 9. Mär 2010 21:28

Re: Osterformel nach Computus ecclesiasticus
 
Hallo Wolfang,

ich habe den Code im Rahmen meiner 3-minütigen Tageslangeweile mal entsprechend der üblichen Gegenbenheiten unter uns Delphi Entwicklern etwas umformatiert.

Delphi-Quellcode:
// Osterformel mit computus ecclesiasticus
function GetEasterDate(Jahr: Integer): TDate; // Jahr des gregorianischen Kalenders
var
  G, X, Z, D, E, N: Integer;
  Jahrhundert,
  Tag,
  Monat: Integer;
  MyDate: TDate;
begin
  G := (Jahr mod 19) + 1;
  Jahrhundert := Jahr div 100 + 1;
  X := 3 * Jahrhundert div 4 - 12;
  Z := (8 * Jahrhundert + 5) div 25 - 5;
  D := (5 * Jahr) div 4 - X - 10;
  E := (11 * G + 20 + Z - X) mod 30;
  if ((E = 25) and (G > 11)) or (E = 24) then // Klammerung?
    Inc(E);
  N := 44 - E;
  if N < 21 then
    Inc(N, 30);
  N := N + 7 - (D + N) mod 7;
  if N > 31 then
  begin
    Tag := n - 31; // (n-31).April
    Monat := 4;
  end
  else
  begin
    Tag := N; // n.März
    Monat := 3;
  end;
  {------Soweit der Originalcode---------}
  MyDate := EncodeDate(Jahr, Monat, Tag);
  Result := MyDate;
end;
Ich habe die Klammerung für den Vergleich von E angepasst: Wenn E = 25 und G > 11 soll E um 1 erhöht werden, ebenso im Falle E = 24.

Quelle: http://user.cs.tu-berlin.de/~csadm/w...01/blatt01.pdf

Gruß,
Assertor

P.S.: Unabhängig vom Nutzen, gerne weiter so!

Wolfgang Mix 10. Mär 2010 09:32

Re: Osterformel nach Computus ecclesiasticus
 
Danke, das Arbeitsblatt habe ich auch schon einmal gesehen.
Leider fehlen auch hier die Erklärungen für die Variablen.
Vielleicht hast du ja noch einmal 3 Minuten Zeit :mrgreen:

DeddyH 10. Mär 2010 09:36

Re: Osterformel nach Computus ecclesiasticus
 
IIRC wäre die Klammerung rein logisch nicht nötig gewesen, auch wenn sie zumindest dem besseren Verständnis dient, denn AFAIK hat and eine höhere Priorität als or. Aber das nur am Rande ;)

Assertor 10. Mär 2010 10:20

Re: Osterformel nach Computus ecclesiasticus
 
Hi,

Zitat:

Zitat von DeddyH
IIRC wäre die Klammerung rein logisch nicht nötig gewesen, auch wenn sie zumindest dem besseren Verständnis dient, denn AFAIK hat and eine höhere Priorität als or. Aber das nur am Rande ;)

DeddyH, du hast natürlich mal wieder absolut recht. Aber Lesbarkeit ist doch gerade bei solchem Code wichtig ;)

Zitat:

Zitat von Wolfgang Mix
Danke, das Arbeitsblatt habe ich auch schon einmal gesehen.
Leider fehlen auch hier die Erklärungen für die Variablen.
Vielleicht hast du ja noch einmal 3 Minuten Zeit :mrgreen:

:mrgreen: Ja, vielleicht ;) Nur leider ist mein Latein etwas eingerostet:

http://daten.digitale-sammlungen.de/...e=7&pdfseitex=
http://daten.digitale-sammlungen.de/...013958/images/

Wobei es das ja teilweise auch in Deutsch gibt:
http://daten.digitale-sammlungen.de/...9&no=4&seite=5

oder

http://www.nabkal.de/gregkal.html

Aber die englische Wikipedia hat da auch gutes zu:
http://en.wikipedia.org/wiki/Computus#cite_note-41

Goldene Zahl, Epakte und Sonntagsbuchstabe wären in vorherigem Code noch zu ersetzen. Für ersteres ist G ein guter Anhaltspunkt ;)

Auch wenn es ob andersherum schon drin ist:
Delphi-Quellcode:
GoldeneZahl := (Jahr + 1) mod 19;
So, 3-Minuten für heute um, mal morgen schauen :mrgreen:

Gruß,
Assertor

p80286 10. Mär 2010 10:32

Re: Osterformel nach Computus ecclesiasticus
 
@Assertor
Vielen Dank für den Link und die Aufbereitung!

Habe ich mich getäuscht oder gibt es hier zwei Fraktionen, die einen, die formale Mängel in Wolfgangs Beitrag sehen und die anderen, die solch "alten Mist" für überflüssig halten, weil es in der x-Lib die Y-Funktion gibt, die das sowieso viel schneller erledigen kann.

Forrmal kann da bestimmt das eine oder andere besser gemacht werden, aber überflüssig ist so etwas überhaupt nicht, da meiner Meinung nach die Kenntnis über die Existenz solcher Algorithmen, und noch besser deren Anwendung (und Optimierung)zum Handwerkszeug eines Programmieres gehört.

Das zusammenklicken von Codefragmenten sollten wir den Script-Kiddies überlassen.
(Manchmal ist es allerdings bequemer und schneller das Rad nicht neu zu erfinden)

Meiner Meinung nach gehört das (überarbeitet) in die Codelib.

Gruß
K-H

Edit: Gottjemine, der deutsche Text ist zumindestens keine wörtliche Übersetzung. Was bin ich froh das ich das nicht mehr übersetzen muß, wie kommt Ihr nur immer wieder an solche links in dem ganzen google Müll?

Matze 10. Mär 2010 12:48

Re: Osterformel nach Computus ecclesiasticus
 
Ich habe mir nun ca. 1,5 Stunden die Zeit genommen, zu recherchieren, was es mit dem Code auf sich hat.
Doch überall ist es erforderlich, in einer Tabelle nach zu schauen, bsp. hier.

Ich habe mal versucht, den Code dort umzusetzen und es gibt auch Ähnlichkeiten mit dem Code aus dem C-Buch, aber ganz vollendet bekomme ich den Algorithmus nicht. Und der gleiche Algorithmus ist es wohl auch nicht oder ich habe das Nachschlagen in der Tabelle zu kompliziert umgesetzt.
Das Problem ist nun, dass ich vom berechneten Tag so viele Tage dazu addieren muss, bis man den Sonntag erhält. Nur wie das geht, kriege ich nicht heraus. :gruebel:

Delphi-Quellcode:
function GetEasterDate(Year: Integer): TDate;
var
  Century, GoldenNumber: Integer;
  JulianEpact, GregorianEpact: Integer;
  SolarEquation, LunarEquation: Integer;
  Day, Month: Integer;
begin
  Century := (Year div 100) + 1;
  GoldenNumber := (Year mod 19) + 1;
  JulianEpact := (11 * (GoldenNumber - 1)) mod 30;
  SolarEquation := (3 * Century) div 4;
  LunarEquation := (8 * Century + 5) div 25;
  GregorianEpact := JulianEpact - SolarEquation + LunarEquation + 8;

  while (GregorianEpact > 30) do
    Dec(GregorianEpact, 30);
  while (GregorianEpact < 0) do
    Inc(GregorianEpact, 30);

  // table lookup follows, I hope it's correct

  // month
  if (GregorianEpact < 13) or (GregorianEpact > 23) then
    Month := 4
  else
    Month := 3;

  // day
  if (GregorianEpact < 13) then
    Day := 13 - GregorianEpact
  else if (GregorianEpact < 24) then
    Day := 44 - GregorianEpact
  else if GregorianEpact = 24 then
    Day := 18
  else if GregorianEpact = 25 then
  begin
    if GoldenNumber > 11 then
      Day := 17
    else
      Day := 18;
  end
  // GregorianEpact > 25
  else
    Day := 43 - GregorianEpact;

  // go forward to easter sunday
  // example: if Day is a friday => Inc(Day, 2) to get the sunday
  // but how to do it?

  Result := EncodeDate(Year, Month, Day);
end;
Und der Abschnitt "Isn't there a simpler way to calculate Easter" im verlinkten Dokument scheint einen anderen Algorithmus zu verwenden.

Blöder Algorithmus. :stupid:

himitsu 10. Mär 2010 13:39

Re: Osterformel nach Computus ecclesiasticus
 
Zitat:

Zitat von Matze
Das Problem ist nun, dass ich vom berechneten Tag so viele Tage dazu addieren muss, bis man den Sonntag erhält. Nur wie das geht, kriege ich nicht heraus. :gruebel:

Du hast den Tag ... diesen kannst/hast du ja als Nummer darstellen.

Jetzt weißt du ja auch welche Nummer der Sonntag hat ... und kannst demnach die Diferenz erechnen und dazuaddieren.

Matze 10. Mär 2010 13:53

Re: Osterformel nach Computus ecclesiasticus
 
Zitat:

Zitat von himitsu
Jetzt weißt du ja auch welche Nummer der Sonntag hat ...

Das weiß ich? :gruebel:

Teekeks 10. Mär 2010 15:05

Re: Osterformel nach Computus ecclesiasticus
 
Kannst du dir ja ausrechnen (heutigen Tag einfach mal als eine solche Nummer ausgeben lassen)...

Wolfgang Mix 11. Mär 2010 13:09

Re: Osterformel nach Computus ecclesiasticus
 
hier

stoxx 11. Mär 2010 13:25

Re: Osterformel nach Computus ecclesiasticus
 
es kann empfohlen werden, vorher in der DelphiPraxis zu suchen, bevor man seinen brandneuen Code veröffentlicht, ob es sowas schon gibt :-)


siehe hier:

http://www.delphipraxis.net/internal...ct.php?t=44748

Assertor 11. Mär 2010 13:43

Re: Osterformel nach Computus ecclesiasticus
 
Hallo stoxx,

Zitat:

Zitat von stoxx
es kann empfohlen werden, vorher in der DelphiPraxis zu suchen, bevor man seinen brandneuen Code veröffentlicht, ob es sowas schon gibt :-)

Da tust Du aber Wolfgang unrecht. Thread nicht gelesen, richtig? Erwischt! :mrgreen:

Eingangspost:

Zitat:

Zitat von Wolfgang Mix
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.

Hier geht es ja gerade um den Computus, in dem Thread aus Deinem Link um Gauss. In einem Bubble-Sort Thread würde man ja auch nicht drauf hinweisen, dass es in der DP schon Quick-Sort Threads gibt...

Gruß,
Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz