Hallo zusammen,
ich möchte hiermit eine kleine Function von mir vorstellen _EASTER. Die Funktion berechnet Ostern und gibt
- dies auf dem Bildschirm aus, diese Ausgabe kann mit Parameter Quiet unterdrückt werden
- und auch als xx. Tag an die aufrufende GUI zurück
Sicher kein großartiges Projekt, noch dazu von einem Lernenden, und hat ja eh schon jeder für sich geschrieben.
Stimmt vielleicht alles, schaut es aber trotzdem bitte einmal an, vielleicht kanns ja der ein oder andere benutzen. Es ist ganz frisch (ich bin mir nicht sicher ob die Berechnung für jedes Jahr Klappt), aber ausbaufähig da von Ostern noch einige andere Freietage abhängig sind.
Edit1: ursprünglich war hier ein Spoiler jetzt: EASTER.ZIP Edit3 ist jetzt ein Anhang
Edit2: hat sich erledigt daher mit Edit 9 in Spoiler verbannt
Spoiler anzeigen
Wer in mein Skrip geschaut hat bzw. sich wundert dass (s)ein anderes Programm für das Jahr XXXX (<>2009) ein anderes Ergebnis herausbekommt den bite ich @alle anderen natürlich auch sich folgende vewendete Formeln anzuschauen:
a = Jahr mod 19
b = Jahr mod 4
c = Jahr mod 7
H1 = Jahr div 100
H2 = Jahr div 400
N = 4 + H1 - H2
M = 15 + H1 - H2- [(8 x H1 + 13) div 25]
d = (19 x a + M) mod 30
e = (2 x b + 4 x c + 6 x d + N) mod 7
ostern = 22 + d + e
Edit3:
ostern = 22.März + d + e
wenn: (ostern = 57) dann: (ostern = 50)
wenn: [d = 28] und [e = 6] und [a > 10] dann: [ostern = 49]
und wenn möglich mir die Ergebnisse für alle Zeilen mitteilen
der Faktor war also richtig die beiden letzten Bedingungen traffen aber nie zu da der Faktor 59 bzw. 60 im Schaltjahr erst nach der Prüfung dieser beiden Sonderfälle stattfinden durfte, trotzdem habe ich noch das Problem, dass es Jahre gibt in der die Func Oster(Sonntag) einen Tag zu früh angibt (vorher auch mal einen zuviel, war aber immer das Osterwochenende Sa,So,Mo). Den Fehler mit dem einen Tag find ich auch noch.
Edit4: da ich den Fehler immer an der falschen Stelle gesucht habe, hat es etwas länger gedauert als geplant. In der neuen Fassung hab ich das Script, geteilt einmal die eigentliche Funktion und eine Demo, diese hab ich auch leicht abgeändert, damit man erkennt wie man die Funktion unterschiedlich aufrufen kann.
Achtung: die Anzahl und die Reihenfolge der Parameter hat sich geändert:
Spoiler anzeigen
Aufruf jetzt _Easter($iYear, [,$bQuiet], [,$sTitle] [,$hParent] [$iEditStyle]
$iYear = das Jahr für das Ostern errechnet werden soll
$bQuiet = Schalter für "stumme Ausgabe" True es wird nur gerechnet und zurückgegeben als xxx Tag im Jahr
$sTitle = Fenstertitel (falls $Quiet True wird er ignoriert (optional)
$hParent = ID des aufrufenden Fensters (optional, Standard = 0)
wenn dieser Parameter übergeben wird das Anzeigefenster
Modal angezeigt, d.h. es ist automatisch vor dem aufrufenden Fenster
(verliert aber leider derzeit noch den Focus, beim Wechsel zu anderer Anwendung
und wieder zurück, d.h man muß einmal in das Fenster klicken)
$sEditStyle = Edit-Style für GUICtrl (optional)
$iWidth = Breite des Fensters (optional, Standard = 400 Pixel)
$iHeight = Höhe des Fensters (optional, Standard = 300 Pixel)
$iLeft = Abstand von links (optional, Standard = zentriert)
$iTop = Abstand von oben (optional, Standard = zentriert)
Return Value: Ostersonntag als Integer, von diesem aus kann man alle beweglichen kirchlichen Feiertag, die auf Ostern beruhen errechnen
Author: (Auto)Bert
Quellen:
- Osterberechung: Formel auf http://www.nabkal.de/gauss2.html
- GUI: Oscar's (https://autoit.de/www.autoit.de) _StringDisplay
in Anfängerfragen zur GUI(Checkbox,Inputbox und welches Gui Konzept) Beitrag #5 Danke Oscar - und natürlich die dt. AutoIT-Hilfe (Lob, im allgemeinen komm ich gut damit zurecht)
Edit5: Zip ausgetauscht damit die Änderungen auch für alle zugänglich sind
Edit6: Quellen und Danksagung aus Spoiler direkt in Beitrag verschoben
Edit7+8: Optik des Beitrags und Rechtschreibfehler korrigiert (soweit gefunden)
Ich könnte jetzt noch die weiteren beweglichen Feiertage mit ausgeben, z.B. Karfreitag = Ostern -1, Ostermontag = Ostern +1 usw. Zu überlegen ist auch ob ich dann eine Listview nehme, oder ob ich es so lasse. mit Edit 9 erledigt
Anregungen, Kritik (jeglicher Art) entweder in diesem Thread oder als PN an mich.
BugFix , wenn ich dein Projekt vorher gekannt hätte, hätte ich es wahrscheins gelassen bzw. mir ein anderes Thema gesucht. Ich werd es mir später gleich mal anschauen und dann warscheins vor Neid erblassen.
In diesem Sinne wünsch ich euch allen noch ein frohes sonniges Osterfest Edit 9: Ostern ist ja jetzt wohl vorbei
Edit 9: vom Edit im Anzeigefenster auf Listview umgestellt die Datumsbetimmung nach Errechnung des Ostersonntags erfolgt jetzt mit Hilfe von _DateDaysInMonth, da diese Routine erst bei 4 Stelligen Zahlen ein Ergebnis zurückliefert sind vorhergehende Aufrufe nutzlos. Daher hab ich auch das Beispiel zum Aufrufen daran angepasst und erweitert.
Eine 2 Function ist hinzugekommen: _getHolyday($sHT,$iHDay,$iYear)
Spoiler anzeigen
;Function Name..: _getHolyday($sHT,$iHDay,$iYear)
;Description....: ermittelt das Datum des übergegenen x. Tages des Jahres und ertstellt
; daraus zusammen mit der Bez. einen String zum Eintragen in eine 2 Spaltige Listview
;Parameter(s)...: $sHT = der String mit der Bezeichnung ( Wenn kein Datensparatorzeichen am Schluß
; wird einer angehängt
; $bHDay = der x. Tag des Jahres (1. Januar = 1)
; $iYear = Jahresdatum, muß größer 1000 sein, da _DateDays in Month bei kleineren Zahlen keinen Wert zurückliefert
;Return Value...: String für Eintrag in ListView
;Author.........: (Auto)Bert
der Einsatz wird ebenso im Beispiel demonstriert, (Button in ListView).
Edit 11: hab Oscar s Anregung (#14) in DemoEaster.au3 eingearbeitet, und im Meldungsfenster vone Easter.au3 geb ich für Jahreszahlen vor 1583 jetzt einen Hinweis anstelle der Berechnung aus.
Die neuen Dateien sind diesmal einzeln als au3 Files angehängt. (Das Zip File enthält Stand wie in Edit 9 beschrieben)
einen schönen sonnigen Tag noch und vielen Dank für eure Rückmeldungen,
mfg (Auto)Bert