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 19:28)
Als Antwort auf Re: Wochentag berechnen nach Gauss von PeterS - 25.01.2011 8:56
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.
>
> 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
>
Danke für die Anregung.
Ich freue mich jedes mal wenn ich Laufzeit einsparen kann. Alles das man mit einer Berechnung
machen kann sollte man in eine Formel verküpfen, da die mehrfache Abfrage meist viel mehr Zeit
vergeudet als eine Berechnung.
Für die Drehgeberauswertung hatte ich damit guten Erfolg.

Gruss Ernst H.




    Antwort schreiben


Antworten:

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)