ich melde mich nach längerer Zeit mal wieder.
Ich habe kürzlich ein wenig mit Wochentagsberechnung und Osterberechnug herumgespielt. Das ist dabei herausgekommen:
(Ziemlich quick'n'dirty - zugegeben).
Hier kann man das Osterdatum eines Jahres berechnen lassen:
Code: Alles auswählen
;Osterdatum berechnen nach Spencers Osterformel
;siehe https://de.wikipedia.org/wiki/Spencers_Osterformel
EnableExplicit
Global.i tag,monat
Define jahr.s
Macro Divide(Formel,by,q,r)
q=(Formel)/by
r=(Formel)%by
EndMacro
Procedure Osterdatum(jahr.i)
Protected.i a,b,c,d,e,f,g,h,i,k,l,m,n,o
Protected dummy.i ; wenn "Quotient" oder "Remainder" nicht benötigt werden
Divide(jahr,19,dummy,a)
Divide(jahr,100,b,c)
Divide(b,4,d,e)
Divide(b+8,25,f,dummy)
Divide(b-f+1,3,g,dummy)
Divide(19*a+b-d-g+15,30,dummy,h)
Divide(c,4,i,k)
Divide(32+2*e+2*i-h-k,7,dummy,l)
Divide(a+11*h+22*l,451,m,dummy)
Divide(h+l-7*m+114,31,n,o)
tag=o+1
monat=n
EndProcedure
OpenConsole("Osterdatum berechnen")
PrintN(#CRLF$+" Das Programm berechnet das Osterdatum des angegebenen Jahres nach Spencers Osterformel")
PrintN(" für den gregorianischen Kalender ab 1582.")
Repeat
Print(#CRLF$+" Bitte Jahr eingeben (0 für Ende):")
jahr=Input()
If Val(jahr)>1582
Osterdatum(Val(jahr))
PrintN(" Der Ostersonntag des Jahres "+jahr+" ist/war am "+Str(tag)+"."+Str(monat)+".")
Else
CloseConsole()
End
EndIf
ForEver
Code: Alles auswählen
;Berechnung des Wochentages
;siehe https://de.wikipedia.org/wiki/Wochentagsberechnung
EnableExplicit
Procedure Wochentag(d,m,j)
Protected w ;Wochentag
Protected c ;Jahrhundert (die ersten beiden Stellen des Jahres)
Protected y ;Jahr (die letzten beiden Stellen des Jahres)
Protected x.f
Protected z
If m<=2:j-1:EndIf
c=j/100
y=j%100
m-2
If m<=0:m+12:EndIf
x=2.6*m-0.2
z=Int(x)
w=(d+z+y+(y/4)+(c/4)-2*c)
w%7
If w<0:w+7:EndIf
ProcedureReturn w
EndProcedure
Procedure Eingabe()
Protected.s t,m,j
Protected jahr,schaltjahr=#False
Protected Dim wtag.s(6)
Protected Dim tage(12)
wtag(0)="Sonntag"
wtag(1)="Montag"
wtag(2)="Dienstag"
wtag(3)="Mittwoch"
wtag(4)="Donnerstag"
wtag(5)="Freitag"
wtag(6)="Samstag"
tage(1)=31
tage(2)=29
tage(3)=31
tage(4)=30
tage(5)=31
tage(6)=30
tage(7)=31
tage(8)=31
tage(9)=30
tage(10)=31
tage(11)=30
tage(12)=31
Repeat
Repeat
Print(#CRLF$+" Tag: ")
t=Input()
If Val(t)<=0:ProcedureReturn :EndIf
Until Val(t)<=31
Repeat
Print(" Monat: ")
m=Input()
If Val(m)<=0:ProcedureReturn :EndIf
Until Val(m)>=1 And Val(m)<=12
While Val(t)>tage(Val(m)) ;gibt es den Tag, z.B. den 31.4 ?
Print(" Tag: ")
t=Input()
Wend
Repeat
Print(" Jahr: ")
j=Input()
jahr=Val(j)
If jahr<=0:ProcedureReturn :EndIf
Until jahr>=1582
If Val(m)=2 And Val(t)=29 ; 29.Februar ?
schaltjahr=#False
If jahr%4=0 Or jahr%400=0:schaltjahr=#True:EndIf
If schaltjahr=#False
PrintN(" In diesem Jahr gab/gibt es keinen 29.Februar!")
m="3":t="1"
EndIf
EndIf
PrintN(" Der "+t+"."+m+"."+j+" war/ist ein "+wtag(Wochentag(Val(t),Val(m),Val(j))))
ForEver
EndProcedure
OpenConsole("Wochentag berechnen")
PrintN(#CRLF$+" Das Programm berechnet den Wochentag des eingegebenen Datums")
PrintN(" für den gregorianischen Kalender ab 1582.")
Eingabe()
CloseConsole()
Code: Alles auswählen
EnableExplicit
Global tag,monat,jahr
Define Neujahr,TagDerArbeit,TagDerEinheit,ErsterWeihnachtstag
Global Dim wtag.s(6)
Global Dim tage(12)
wtag(0)="Sonntag"
wtag(1)="Montag"
wtag(2)="Dienstag"
wtag(3)="Mittwoch"
wtag(4)="Donnerstag"
wtag(5)="Freitag"
wtag(6)="Samstag"
tage(1)=31
tage(2)=28
tage(3)=31
tage(4)=30
tage(5)=31
tage(6)=30
tage(7)=31
tage(8)=31
tage(9)=30
tage(10)=31
tage(11)=30
tage(12)=31
Macro Divide(Formel,by,q,r)
q=(Formel)/by
r=(Formel)%by
EndMacro
Procedure Osterdatum(jahr.i)
Protected.i a,b,c,d,e,f,g,h,i,k,l,m,n,o
Protected dummy.i ; wenn "Quotient" oder "Remainder" nicht benötigt werden
Divide(jahr,19,dummy,a)
Divide(jahr,100,b,c)
Divide(b,4,d,e)
Divide(b+8,25,f,dummy)
Divide(b-f+1,3,g,dummy)
Divide(19*a+b-d-g+15,30,dummy,h)
Divide(c,4,i,k)
Divide(32+2*e+2*i-h-k,7,dummy,l)
Divide(a+11*h+22*l,451,m,dummy)
Divide(h+l-7*m+114,31,n,o)
tag=o+1
monat=n
EndProcedure
Procedure Wochentag(d,m,j)
Protected w ;Wochentag
Protected c ;Jahrhundert (die ersten beiden Stellen des Jahres)
Protected y ;Jahr (die letzten beiden Stellen des Jahres)
Protected x.f
Protected z
If m<=2:j-1:EndIf
c=j/100
y=j%100
m-2
If m<=0:m+12:EndIf
x=2.6*m-0.2
z=Int(x)
w=(d+z+y+(y/4)+(c/4)-2*c)
w%7
If w<0:w+7:EndIf
ProcedureReturn w
EndProcedure
Procedure Addiere(t) ;addiert t Tage zu den globalen Variablen tag und ggf. monat bzw. jahr
tag+t
While tag>tage(monat) ;Da es hier nicht benötigt wird, wird kein Schaltjahr berücksichtigt.
tag-tage(monat)
monat+1
If monat>12:monat-12:jahr+1:EndIf
Wend
EndProcedure
OpenConsole("Feiertage berechnen")
PrintN(#CRLF$+" Das Programm berechnet die bundesweiten gesetzlichen Feiertage des angegeben Jahres")
PrintN(" für den gregorianischen Kalender ab 1582.")
PrintN(" Das Programm berücksichtigt den Tag der Deutschen Einheit.")
Repeat
Print(#CRLF$+" Bitte Jahr eingeben (0 für Ende):")
jahr=Val(Input())
If jahr>1582
Neujahr=Wochentag(1,1,jahr)
TagDerArbeit=Wochentag(1,5,jahr)
ErsterWeihnachtstag=Wochentag(25,12,jahr)
PrintN(" Neujahr (1.1.)"+#TAB$+#TAB$+#TAB$+#TAB$+wtag(Neujahr))
PrintN(" Tag der Arbeit (1.5.)"+#TAB$+#TAB$+#TAB$+wtag(TagDerArbeit))
If jahr>=1990
TagDerEinheit=Wochentag(3,10,jahr)
PrintN(" Tag der Deutschen Einheit (3.10.)"+#TAB$+wtag(TagDerEinheit))
EndIf
If jahr>=1953 And jahr<1990
TagDerEinheit=Wochentag(17,6,jahr)
PrintN(" Tag der Deutschen Einheit (17.6.)"+#TAB$+wtag(TagDerEinheit))
EndIf
PrintN(" Erster Weihnachtstag (25.12.)"+#TAB$+#TAB$+wtag(ErsterWeihnachtstag))
Osterdatum(jahr)
PrintN(" Ostersonntag"+#TAB$+#TAB$+#TAB$+#TAB$+Str(tag)+"."+Str(monat)+".")
Addiere(39) ;Himmelfahrt ist 39 Tage nach Ostern
PrintN(" Christi Himmelfahrt"+#TAB$+#TAB$+#TAB$+Str(tag)+"."+Str(monat)+".")
Addiere(10) ;Pfingsten ist 49 Tage nach Ostern
PrintN(" Pfingstsonntag"+#TAB$+#TAB$+#TAB$+#TAB$+Str(tag)+"."+Str(monat)+".")
Else
CloseConsole()
End
EndIf
ForEver