Re: Wochentag berechnen nach Gauss Kategorie: Programmierung C (von Ernst H. - 25.01.2011 20:00) | ||
Als Antwort auf Re: Wochentag berechnen nach Gauss von Ernst H. - 25.01.2011 19:28 | ||
| ||
> > > > > 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. | ||
Antwort schreiben Antworten: Re: Wochentag berechnen nach Gauss (von Baltus - 25.01.2011 21:54) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum