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 Ernst H. - 25.01.2011 1:14)
Als Antwort auf Re: Wochentag berechnen nach Gauss von Ernst H. - 25.01.2011 0:44
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> > 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.


    Antwort schreiben


Antworten:

Re: Wochentag berechnen nach Gauss (von PeterS - 25.01.2011 8:56)
    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)