Aktuelle Zeit: 22.07.2018 14:44

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: Spielereien mit Datumsberechnungen
BeitragVerfasst: 21.06.2018 23:46 
Offline

Registriert: 17.01.2018 08:52
Hallo,
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:
;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


Hier wird der Wochentag eines Datums berechnet:
Code:
;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()


Hier sind die beiden Programme "zusammengefrickelt", um sämtliche bundesweite gesetzliche Feiertage eines Jahres zu berechnen:
Code:
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

_________________
formerly known as bizzl


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye