Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Wochentag berechnen nach Gauss Kategorie: Programmierung C (von PeterS - 25.01.2011 8:56)
Als Antwort auf Re: Wochentag berechnen nach Gauss von Ernst H. - 25.01.2011 1:14

> > > Moin,
> > >
> > > da ich auf die Schnelle hier nichts gefunden habe,
> > > habe ich mir die Berechnung des Wochtages fix selber gebastelt.
> > >
> > > Ist eine vereinfachte Formel der Gausschen Wochentagsberechnung.
> > > Funktioniert von 2001 bis 2099 (Hunde wollt ihr ewig leben? ;-)  )
> > > Funktioniert wegen der FLOOR Funktion nur auf dem 128er.
> > >
> > > In der Funktion wird das aktuelle Datum eingelesen und als Rückgabe
> > > gibt es INT-Zahlen von 0 bis 6 (Sonntag bis Samstag)
> > >
> > > Ciao, Francesco
> > >
> > > -------------------------------------------------------------------------------------
> > >
> > > int get_weekday (void)
> > > // berechnung Wochentag mit vereinfachter Gausscher Wochentagberechnung
> > > // Formel funktionert von 2001 bis 2099 (sollte eigentlich reichen)
> > > // weitere Infos bei wikipedia:
> > > // http://de.wikipedia.org/wiki/GauÃ?sche_Wochentagsformel
> > > {
> > >     byte tag; byte mon; byte jah; int wot ; //Variablen
> > >     int zr1 ; int zr2 ; int zr3 ;
> > >
> > >     tag= Clock_GetVal(3)+1  ;
> > >     mon= Clock_GetVal(4)+1  ;
> > >     jah= Clock_GetVal(5)  ;
> > >
> > >     switch (mon)
> > > {
> > >         // in zr1 ist die zwischenrechnung (2.6 x Monat - 0,2 abgerundet)
> > >         // für Jan und Feb wird gemäÃ? GauÃ? ein Jahr abgezogen
> > >         case 1: zr1 = 28 ; jah-- ;
> > >         break ;
> > >         case 2: zr1 = 31 ; jah-- ;
> > >         break ;
> > >         case 3: zr1 = 2 ;
> > >         break ;
> > >         case 4: zr1 = 5 ;
> > >         break ;
> > >         case 5: zr1 = 7 ;
> > >         break ;
> > >         case 6: zr1 = 10 ;
> > >         break ;
> > >         case 7: zr1 = 12 ;
> > >         break ;
> > >         case 8: zr1 = 15 ;
> > >         break ;
> > >         case 9: zr1 = 18 ;
> > >         break ;
> > >         case 10: zr1 = 20 ;
> > >         break ;
> > >         case 11: zr1 = 23 ;
> > >         break ;
> > >         case 12: zr1 = 25 ;
> > >         break ;
> > >  }
> > >
> > >     zr3 = floor (jah/4);         //Zwischenrechnung
> > >     zr2 = tag + zr1 +jah + zr3 ; //vereinfachte Gaussche Formel
> > >     wot = zr2% 7 ;               //Modulo auf 7
> > >     return wot ;                 //Rückgabe Wochentag 0 bis 6 (Sonntag = 0)
> > >  }
> > >
> >
> >
> > etwas Aufwendiger aber simple Berechnung.
> >
> > Tag und Monat nicht o-Basierend da ich diese werte von der RTC bekomme
> >
> >
> > Sub Dowberechnung()
> >   Dim Tageszahl As ULong                         '1    31
> >   Dim Jahreshundert As ULong                     '2    28    31
> >   Dim Schalttag As Byte                          '3    31    59
> >   Dim Jahrzahl As ULong                          '4    30    90
> >                                                  '5    31    120
> >   If RTC_Jahr() Mod 4 = 0 Then                   '6    30    151
> >     Schalttag = 1                                '7    31    181
> >   Else                                           '8    31    212
> >     Schalttag = 0                                '9    30    243
> >   End If                                         '10   31    273
> >                                                  '11   30    304
> >                                                  '12   31    334
> >   Select Case RTC_Mon()
> >     Case 1  :   Tageszahl = RTC_Tag()                  'Jan
> >     Case 2  :   Tageszahl = RTC_Tag() + 31                'Feb
> >     Case 3  :   Tageszahl = RTC_Tag() + Schalttag + 59
> >     Case 4  :   Tageszahl = RTC_Tag() + Schalttag + 90
> >     Case 5  :   Tageszahl = RTC_Tag() + Schalttag + 120
> >     Case 6  :   Tageszahl = RTC_Tag() + Schalttag + 151
> >     Case 7  :   Tageszahl = RTC_Tag() + Schalttag + 181
> >     Case 8  :   Tageszahl = RTC_Tag() + Schalttag + 212
> >     Case 9  :   Tageszahl = RTC_Tag() + Schalttag + 243
> >     Case 10 :   Tageszahl = RTC_Tag() + Schalttag + 273
> >     Case 11 :   Tageszahl = RTC_Tag() + Schalttag + 304
> >     Case 12 :   Tageszahl = RTC_Tag() + Schalttag + 334
> >   End Select
> >   TagJahr = Tageszahl   'angabe als Word für Berechnungen
> >  Jahrzahl = RTC_Jahr()    'vorher in ULong wandeln notwendig
> >  Jahreshundert = 36525 * Jahrzahl - 25u 'Schalttag 1/4 dazu
> >  dow = (Jahreshundert / 100 + Tageszahl - 1) Mod 7 'Korr Tageszahl da1.1.00 Sa
> >
> >
> >
> > ' Clock Berichtigungen: Wenn Tag 0 Then 1;  wenn Tag > 28+Schalttag dann 1.3.
> >
> > End Sub
> >

> >
> > mfG
> > Ernst H.
> >
> >
> >
> sollte eigentlich zumindest bis zum Jahr 2255 funktionieren - also meinen 300. Geburtstag richtig
> berechnen. (ich trage mir schon mal den Termin ein)
>
> Ernst H.

Hallo Ernst,

benutz doch vorinitialisierte Arrays, dann brauchst Du nicht solch ein Case Monster:

Z.B:  Tageszahl = RTC_Tag() + Schalttag + Tag_array(RTC_Mon())

Klar, für die Fälle 1 und 2 mu� man noch ein If bauen um den fehlenden
Schalttag zu berücksichtigen.

Gruss Peter



    Antwort schreiben


Antworten:

Re: Wochentag berechnen nach Gauss (von Ernst H. - 25.01.2011 19:28)
    Re: Wochentag berechnen nach Gauss (von Ernst H. - 25.01.2011 20:00)
        Re: Wochentag berechnen nach Gauss (von Baltus - 25.01.2011 21:54)