Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zusatz zu "Ostersonntag eines Jahres berechnen" (https://www.delphipraxis.net/78218-zusatz-zu-ostersonntag-eines-jahres-berechnen.html)

Balu der Bär 1. Okt 2006 08:37


Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Moin,

da ich mir grad ein paar Algorithmen angucke bin ich in der Codelib auf Ostersonntag eines Jahres berechnen von flomei gestoßen. Dabei fiel mir auf das flomei's Algorithmus nur von 1700 bis 2199 gilt. Also hier schnell meine Umsetzung, diese Berechnung gilt für die Jahre 1583 bis 3900:
Delphi-Quellcode:
(* Gaußsche Osterformel (Berechnung des Ostersonntages)

  nach Carl Friedrich Gauß

  Der 22. März is der früheste Termin, der 25. April der letzte, auf den Ostern fallen kann.
  Gilt für die Jahre 1583 (Beginn des Gregorianischen Kalenders) bis 3900.

  Umsetzung: Balu der Baer
*)

function EasterSunday(Year : Integer) : TDateTime;
var
a, b, c, d, e, H1, H2, n, m, temp, easter : Integer;
begin
if not ((Year > 1583) and (Year < 3900)) then
raise Exception.CreateFmt('function EasterSunday: parameter Year must be between 1583 and 3900 but is %d', [Year])
 else begin
 a := Year mod 19;
 b := Year mod 4;
 c := Year mod 7;
 H1 := Year div 100;
 H2 := Year div 400;
 n := 4 + H1 - H2;
 m := 15 + H1 - H2 - ((8 * H1 + 13) div 25);
 d := (19 * a + m) mod 30;
 e := (2 * b + 4 * c + 6 * d + n) mod 7;
 if d + e = 35 then easter := 50;
 if (d = 28) and (e = 6) and (a > 10) then easter := 49
  else easter := 22 + d + e;
 if easter > 31 then
  begin
   temp := easter - 31;
   case temp of
    26 : temp := 19;
    25 : if (d = 28) and (a > 10) then temp := 18;
   end;
   result := EncodeDate(Year, 4, temp);
  end
   else result := EncodeDate(Year, 3, easter);
end
end;

//Beispielaufruf:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(DateTimeToStr(EasterSunday(StrToInt(Edit1.Text))));
end;

negaH 1. Okt 2006 11:45

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
ich habe 3 Fragen:

1.) im Jahre 1981 war Ostersonntag am ?
2.) im Jahre 2076 ist Ostersonntag am ?
3.) warum liefert deine Funktion kein TDateTime als Resultat ?

Ich frage weil ich mindestens 7 unterschiedliche Delphi Sourcen habe und alle was anderes berechnen. Dann gibts noch mindestens 700 unterschiedliche PHP oder JAVA Sourcen im WEB die auch alle was anderes sagen. As meiner Sicht gilt "die Wege des Herrn sind unergründlich" besonders wenn er seine Feiertage berechnet ;)

Gruß Hagen

PS: http://www.weltzeituhr.com/infos/kir...eiertage.shtml

Balu der Bär 1. Okt 2006 13:24

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Hallo Hagen,

danke für dein Feedback. Ich habe deine 3 Fragen mal beherzigt und mich etwas genauer damit auseinandergesetzt, nach meinen Tests sollte es jetzt eigentlich stimmen. :-)

Khabarakh 1. Okt 2006 14:24

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Delphi-Referenz durchsuchenEncodeDate ;)

Nicolai1234 1. Okt 2006 14:36

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Also die untere Grenze verstehe ich - davor hatten wir einen anderen Kalendar. Aber warum ist so eine Funktion nur bis zum Jahre 3900 richtig? Ändert sich da irgendwas :wink:

mkinzler 1. Okt 2006 14:38

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Zitat von Nicolai1605
Also die untere Grenze verstehe ich - davor hatten wir einen anderen Kalendar. Aber warum ist so eine Funktion nur bis zum Jahre 3900 richtig? Ändert sich da irgendwas :wink:

Warte es doch einfach ab. ;-)

Balu der Bär 1. Okt 2006 14:45

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Zitat von Khabarakh

Ok, habe es geändert. ;)

Auch nach 3900 liefert meine Funktion noch Ergebnisse, ob diese nach dem gregorianischen Kalender allerdings richtig sind kann ich nicht sagen. Außerdem, wer braucht schon die die Ostersonntage nach 3900? :P

Meflin 1. Okt 2006 15:25

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Zitat von Balu der Bär
Außerdem, wer braucht schon die die Ostersonntage nach 3900? :P

Zitat:

nur von 1700 bis 2199 gilt
und wer braucht die Ostersonntage nach 2199 :roll:


negaH 1. Okt 2006 15:26

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Auch nach 3900 liefert meine Funktion noch Ergebnisse, ob diese nach dem gregorianischen Kalender allerdings richtig sind kann ich nicht sagen. Außerdem, wer braucht schon die die Ostersonntage nach 3900?

Da hast du absolut Recht, das braucht keiner ;)

Aber wo in deinem Source wird denn eine Excpetion ausgelösst wenn das übergebene Jahr ausserhalb deiner Schranken ist ? Das sehe ich nämlich nicht und ergo könnte ein Anwender deiner Funktion eben auch Ostern für das Jahr 4000 berechnen wollen oder für das Jahr 100 nach Christi (der User der Funktion weis ja nicht was ein gregorianischer Kalender ist und schon garnicht ab wann der gültig war).

Ergo: mache deine Funktion bulletproof das ist immer ein guter Stil, indem du das Jahr überprüftst und falls es ausserhalb deiner gültigen Schranken ist raise eine Exception.

Gruß Hagen

[edit]
komme mir ja nicht mit dem Argument: "das habe ich ja als Remark oben drüber geschrieben" ! Das interesiert nicht und verhindert niemals die Möglichkeit eben denoch ein Jahr wie 100 oder 4000 zu übergeben. Also lieber weniger Remarks dafür aber Code bei dem der Entwickler weiter gedacht hat als üblich.
[/edit]

Balu der Bär 1. Okt 2006 15:42

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

komme mir ja nicht mit dem Argument: "das habe ich ja als Remark oben drüber geschrieben" !
Niemals würde ich dir widersprechen. :mrgreen:

Habs oben geändert und nochmals bisschen getestet, sollte jetzt fehlerfrei laufen. Danke an alle. :-)

Phoenix 1. Okt 2006 15:47

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Zitat von Balu der Bär
Habs oben geändert und nochmals bisschen getestet, sollte jetzt fehlerfrei laufen. Danke an alle. :-)

ARGL! ShowMessage, Abort und undefinierter Rückgabewert? Was soll das denn für eine Fehlerbehandlung sein?
Wenn ich den Code z.B. in einer ISAPI-DLL benutze fliegt mir der Webserver um die Ohren! Hagen hat doch schon gesagt dass Du da ne Exception raisen sollst.

negaH 1. Okt 2006 15:48

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
;)

negaH 1. Okt 2006 15:53

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Delphi-Quellcode:
if (Jahr < 1583) or (Jahr > 3900) then
  raise Exception.CreateFmt('function OsterSonntag: parameter Jahr must be between 1583 and 3900 but is %d', [Jahr]);
kein "schöner denglish" aber alle Infos für denjenigen der die Funktion falsch benutzt sind drinnen ;)

Gruß Hagen

Balu der Bär 1. Okt 2006 15:59

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Ok ich habs geändert. :oops:

marabu 1. Okt 2006 16:33

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Hallo Leute,

Zitat:

... 7 unterschiedliche Delphi Sourcen [für die Ostern-Berechnung] habe und alle was anderes berechnen.
im wissenschaftlichen Bereich haben sich die Routinen der University of Cambridge bewährt. Press & Flannery arbeiten seit über 20 Jahren an ihrer code library, die mittlerweile mehrere Hundert Routinen umfasst. In meinem Regal steht noch der korrigierte Nachdruck von 1987 für Pascal (Numerical Recipes - The Art of Scientific Computing), aber bei Amazon gibt es inzwischen die omnibus edition, die mehrere Ausgaben dieser Reihe beinhaltet.

Nichts ist peinlicher als eine Veröffentlichung auf der Basis einer fehlerhaft implementierten Standardfunktion.
Und nichts ist teurer, als das debugging einer schlecht abgeschriebenen Standardfunktion.

Freundliche Grüße vom marabu

Balu der Bär 1. Okt 2006 16:39

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Und nichts ist teurer, als das debugging einer schlecht abgeschriebenen Standardfunktion.
Ich hatte mich anfänglich strikt an die Wikipedia gehalten, und tatsächlich das Exeption-Handlung vergessen, Gott sei meiner Seele gnädig. ;)

bttb930 1. Okt 2006 17:07

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Mensch Leute, merkt ihr noch was? Habt ihr sonst nichts zu tun?

Wenn hier erst 20 Verbesserungen in den Algorithmus eingebaut werden müssen, damit er endlich funktioniert, dann ist doch irgendwas faul.

Es gibt diese mathematischen Formeln um den Ostersonntag zu berechnen. Die zu kodieren ist - wie man sieht - wohl nicht jedermanns Sache. Dazu fragt der Autor in einem anderen Thread noch, wie man denn am besten aus einer vierstelligen Jahreszahl das Jahrhundert und den Rest rausbekommt... arrggh (und das ist kein Witz).

Geht doch mal raus und bolzt ein bißchen, super Wetter und das obwohl heute kein Ostersonntag ist. Jedenfalls solltet ihr mal etwas abspannen, sonst kommen eure hirne gar nicht mehr auf touren.

Balu der Bär 1. Okt 2006 17:11

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Es gibt diese mathematischen Formeln um den Ostersonntag zu berechnen. Die zu kodieren ist - wie man sieht - wohl nicht jedermanns Sache. Dazu fragt der Autor in einem anderen Thread noch, wie man denn am besten aus einer vierstelligen Jahreszahl das Jahrhundert und den Rest rausbekommt... arrggh (und das ist kein Witz).
Entschuldigung das ich einmal einen Blackout habe und mir etwas nicht gleich einfällt. :wall: Aber ich nehme an du bist ja perfekt und machst immer alles richtig.

Ich habe wie gesagt nur die Funktion aus der Wikipedia umgewandelt, Exception-Handlung war mir zu diesem Zeitpunkt völlig egal.

Wenn man nichts zu sagen hat, einfach mal den Mund halten! :roll:

Btw, funktioniert hat er von Anfang an, lediglich der Tipp von Hagen war eine Ausbesserung, die anderen 4 Edits wären lediglich kleinere Verbesserungen. :roll:

Daniel G 1. Okt 2006 17:28

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Zitat:

Zitat von bttb930
Dazu fragt der Autor in einem anderen Thread noch, wie man denn am besten aus einer vierstelligen Jahreszahl das Jahrhundert und den Rest rausbekommt... arrggh (und das ist kein Witz).

Honk. :wall:

Pierre meinte "Am Besten" auch im Sinne von "gibt es schon eine vorgefertigte Lösung in Delphi". Das ist was völlig anderes.

Mal abgesehen davon hat "Der Autor" auch einen Namen. Mein Güte, was ist denn hier heute los...?

mkinzler 1. Okt 2006 17:30

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Ich glaube bttb930 hatte heute eine schlechten tag und braucht jemand zum Abreagieren
http://www.delphipraxis.net/internal...=619399#619399

Daniel 1. Okt 2006 17:32

Re: Zusatz zu "Ostersonntag eines Jahres berechnen"
 
Jaja, aber das gehört jetzt nicht mehr zum Thema. ;-)

Und dass sich eine Sache mal als komplexer als ursprünglich angenommen herausstellt, wenn man sie wirklich rund machen will, kommt ja nun häufiger vor und ist kein Grund zum Ärgernis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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