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 Baltus - 25.01.2011 21:54)
Als Antwort auf Re: Wochentag berechnen nach Gauss von Ernst H. - 25.01.2011 20:00
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.
> >
> >
> ohne es getestet zu haben müsste es sogar ohne IF Abfrage gehen - mit Logischem UND (C-Compiler)
> Monat= RTC_Mon()    'zwischenspeichern da 2x verwendet
> Tageszahl = RTC_Tag() + Schalttag &&(Monat-2)+ Tag_array(Monat)
>
> Gruss Ernst H.
>
>
>
You only have a leapday in a leapyear after February 28th.
See appendix.

Greetings
Kees

Capture25-1-2011-21.47.49.jpg:





    Antwort schreiben


Antworten: