![]() |
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:
Gruss
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. Wolfgang |
Re: Osterformel nach Computus ecclesiasticus
[OT] Du hast einen Knall mit Deinen Kalenderfunktionen. (SCNR^^)[/OT]
:lol: |
Re: Osterformel nach Computus ecclesiasticus
Naja, ich forsche halt seit längerer Zeit :)
|
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 |
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 |
Re: Osterformel nach Computus ecclesiasticus
Zitat:
|
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. |
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:
Liebe Grüße, Valle |
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 :) |
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. |
Re: Osterformel nach Computus ecclesiasticus
Zitat:
Liebe Grüße, Valle |
Re: Osterformel nach Computus ecclesiasticus
Nich lange diskutieren, einfach ein bisschen formatieren und aufbereiten und mit in diesem Thread posten:
![]() Fertig. |
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. |
Re: Osterformel nach Computus ecclesiasticus
Zitat:
|
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:
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.
// 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; Quelle: ![]() Gruß, Assertor P.S.: Unabhängig vom Nutzen, gerne weiter so! |
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: |
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 ;)
|
Re: Osterformel nach Computus ecclesiasticus
Hi,
Zitat:
Zitat:
![]() ![]() Wobei es das ja teilweise auch in Deutsch gibt: ![]() oder ![]() Aber die englische Wikipedia hat da auch gutes zu: ![]() 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:
So, 3-Minuten für heute um, mal morgen schauen :mrgreen:
GoldeneZahl := (Jahr + 1) mod 19;
Gruß, Assertor |
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? |
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. ![]() 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:
Und der Abschnitt "Isn't there a simpler way to calculate Easter" im verlinkten Dokument scheint einen anderen Algorithmus zu verwenden.
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; Blöder Algorithmus. :stupid: |
Re: Osterformel nach Computus ecclesiasticus
Zitat:
Jetzt weißt du ja auch welche Nummer der Sonntag hat ... und kannst demnach die Diferenz erechnen und dazuaddieren. |
Re: Osterformel nach Computus ecclesiasticus
Zitat:
|
Re: Osterformel nach Computus ecclesiasticus
Kannst du dir ja ausrechnen (heutigen Tag einfach mal als eine solche Nummer ausgeben lassen)...
|
Re: Osterformel nach Computus ecclesiasticus
|
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: ![]() |
Re: Osterformel nach Computus ecclesiasticus
Hallo stoxx,
Zitat:
Eingangspost: Zitat:
Gruß, Assertor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz