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 0:44)
Als Antwort auf Wochentag berechnen nach Gauss von Francesco - 24.01.2011 22:51
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.





    Antwort schreiben


Antworten:

Re: Wochentag berechnen nach Gauss (von Ernst H. - 25.01.2011 1:14)
    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)