Dieses Thema wurde am "16. Jan 2016, 10:43 Uhr" von "Daniel" aus dem Forum "Klatsch und Tratsch" in das Forum "Algorithmen, Datenstrukturen und Klassendesign" verschoben.
|
AW: Kopfrechnen im Julianischen Kalender
Liste der Anhänge anzeigen (Anzahl: 1)
@daniel & mathematiker
Danke an beide! Ich schiebe jetzt im Anhang noch eine Kurzanleitung hinterher. Vielleicht kann einer der Moderaten den noch in Post 1 dranhängen. Danke |
AW: Kopfrechnen im Julianischen Kalender
@Wolfgang:
Na, da hast du dich ja mächtig ins Zeug gelegt. Hast du eigentlich mal kontrolliert, ob das auch funktioniert. Das Verfahren liefert falsche Ergebnisse 1) für 07.08, 14.08, 21.08 und 28.08 in den Jahren 0600 und 1300. 2) für alle Tage im September in allen Jahren. Fehler 1 lässt sich beheben, indem man bei der Addition der Zahlen noch 7 hinzu addiert. Fehler 2 lässt sich beheben, indem man als Kennziffer für September 3 (statt 5) verwendet. Im übrigen verwende ich lieber eine andere Methode, die den Vorteil hat, dass sie universell verwendbar ist, also auch für den gregorianischen Kalender. Mich würde eher interessieren, auf welchen Wochentag zum Beispiel der 24.12.2016 fällt; an welchem Wochentag Kolumbus sein Ei auf die Spitze gestellt hat ist für mich weniger spannend. Und hier kurz diese Methode:
Code:
DD ist der Wochentag für den letzten Tag des Februars im Jahr Y. (DD steht für "Doomsday")
Y=Jahr
YY=das Jahr im Jahrhundert, also Y mod 100. YH=Das Jahrhundert, also Y div 100. N1 := YY div 12 N2 := YY mod 12 N3 := N2 div 4 Wenn das Datum vor dem 15.10.1582 liegt: N4 := 7 - YH mod 7 sonst: N4 := 9 - YH mod 4 * 2 DD := (N1 + N2 + N3 + N4) mod 7 Hierbei ist 0 = Sonntag, 1 = Montag, …, 6=Samstag. Wie kommt man jetzt zum Wochentag für einen bestimmten Tag im Jahr?! Wenn der letzte Tag im Februar = DD ist, dann sind in den einzelnen Monaten folgende Tage ebenfalls = DD. 1) In allen geraden Monaten > 2 der Tag der = Monat ist. also 4.4, 6.6, 8.8. 10.10. 12.12. 2) Im Mai der 9te, im September der 5te, im Juli der 11te, im November der 7te. Merksatz : "I work from 9 to 5 at the 7-11." (7-Eleven ist eine internationale Einzelhandelskette.) Fehlen noch Januar um März. Für März kann man sich merken, dass der 0te März identisch mit dem letzten Tag im Februar wäre. Für Januar kann man sich merken, dass der 31te DD ist, außer in Schaltjahren, da ist es der 32te. Das alles könnt ihr hier nachlesen: https://de.wikipedia.org/wiki/Doomsday-Methode Nehmen wir als Bespiel das heutige Datum (21.01.2016) N1 = 1 (16 div 12) N2 = 4 (16 mod 12) N3 = 1 (N2 div 4) N4 = 9 (9 - 20 mod 4 * 2) DD = 1 (N1 + N2 + N3 + N4) mod 7 DD = Montag Der 32.01 ist Montag, also auch der 25.01. und der 18.01., also ist der 21.01. drei Tage nach Montag, also Donnerstag. Und für den Computer hier eine kurze Funktion, sowohl für den Julianischen wie auch für den Gregorianischen Kalender. Die Funktion liefert Werte im Bereich 0 .. 6, wobei 0=Montag und 6=Sonntag ist.
Delphi-Quellcode:
Tja, und nun hoffe ich, dass ich mich nicht irgendwo vertippt habe - das wäre mir jetzt etwas peinlich.
FUNCTION DoomsDayWD(Y,M,D:Integer):Integer;
const MN:Array[1..12] of Integer=(31,28,00,04,09,06,11,08,05,10,07,12); var YY,X,N1,N2,N3,N4,N5,DD:Integer; begin YY:=Y mod 100; N1:=YY div 12; N2:=YY mod 12; N3:=N2 div 4; if (Y<1582) or (Y=1582) and (M<10) or (Y=1582) and (M=10) and (D<15) then begin N4:=7-Y div 100 mod 7; N5:=Ord((M<3) and (Y mod 4=0)); end else begin N4:=9-2*(Y div 100 mod 4); N5:=Ord((M<3) and (Y mod 4=0) and ((Y mod 100<>0) or (Y mod 400=0))) end; DD:=(N1+N2+N3+N4+6) mod 7; // MO=0, SO=6 X:=MN[M]+N5; Result:=(DD-X+D+35) mod 7; end; |
AW: Kopfrechnen im Julianischen Kalender
Liste der Anhänge anzeigen (Anzahl: 1)
@Amateurprofi
Vielen Dank für deine Antwort. Ich bin gerade am Kofferpacken, um der Kälte zu entfliehen. Soviel vorab: Es geht immer noch um "Kopfrechnen" mit möglichst kleinen ganzen Zahlen, nicht um optimalen Code. Zum Fehler 1 und seiner Behebung dachte ich : wt + 7 oder wt - 7 ergibt denselben Wochentag wt! Bei Fehler 2 muss September tatsächlich die Merkziffer 3 sein! Danke für den Hinweis. Wenn du Mittrings Merkziffern in jeder Zeile 3 addierst, kommt man zu denselben Merkziffern. Deine Prüfdaten betrachte ich als Hausaufgabe :-) Zu Deinem Schlusssatz : Ich habe mich tatsächlich vertippt. Lass mir ein bisschen Zeit, möglicherweise bin ich einige Zeit im Tal der Ahnungslosen ohne Internet (WLAN), TP und Delphi. Wolfgang |
AW: Kopfrechnen im Julianischen Kalender
Zitat:
Aber bei diesen besonderen Daten in 1300 bzw. 0600 sind alle Zwischenergebnisse 0, außer Zahl 5, die ist 1 bzw. 6. Beispiel: Datum 28.08.1300
Code:
1. 28 mod 7 = 0 (Zahl 1) (Tag mod 7)
2. K = 0 (Zahl 2) (Aus Tabelle für Monat 8) 3. 0 div 12 = 0 (Zahl 3) (Jahr im Jahrhundert div 12) 4. 0 mod 12 = 0 (Jahr im Jahrhundert mod 12) 5. 0 div 4 = 0 (Zahl 4) (Jahr im Jahrhundert mod 12 div 4) 6. 13 mod 7 = 1 (Zahl 5) (Jahrhundert mod 7) Da Zahl 5 subtrahiert wird, ergibt sich ein negatives Ergebnis nämlich -1 bzw. -6. Und -1 mod 7 ergibt etwas anderes als (-1 + 7) mod 7. Durch addieren von 7 kommt das Zwischenergebnis wieder in den positiven Bereich. |
AW: Kopfrechnen im Julianischen Kalender
Danke für das Beispiel. Wir sind nicht weit auseinander.
Kopfrechner wissen das schon lange, dass bei negativen Ergebnissen 7 addiert werden muss. Vielleicht ist meine Kurzanleitung wohl zu kurz. |
AW: Kopfrechnen im Julianischen Kalender
@Wolfgang,
Ja klar, wenn man im Kopf rechnet, dann korrigiert man negative Werte mehr oder weniger automatisch. Und: Nach Änderung der Kennziffer für September und Berücksichtigung des Ausgleichs negativer Werte arbeitet dein Algo korrekt, jedenfalls sind die Ergebnisse identtisch mit denen, die die Doomsday Methode liefert. |
AW: Kopfrechnen im Julianischen Kalender
Danke, du hast mir viel Grübelei erspart :-D
|
AW: Kopfrechnen im Julianischen Kalender
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
Im Fall 28.08.1300 freut sich der Kopfrechner, dass er absolut nichts rechnen muss. Da Samstag ja 0 ist, ist - 1 Freitag:-D |
AW: Kopfrechnen im Julianischen Kalender
Liste der Anhänge anzeigen (Anzahl: 1)
Gültigkeitsbereich erweitert, Tageszuordnung jetzt Mo=1, Di=2 .. So=0,
dazu Monatsmerkzahlen angepasst. Liebe Grüße Wolfgang Mix |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 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