title image


Smiley Überleg doch einfach mal ( < -incl. Zusatzaufgaben)
Hallo,



wie Pacer ja schon gesagt hat, ist die Zeit kein ganz triviales Thema. Es gibt Schaltjahre, es gibt den julianischen Kalender, es gibt ausgefallene Tage, es gibt den gregorianischen Kalender, es gibt (die nicht berechenbaren) Schaltsekunden, die Erde hat sich auch schon mal schneller gedreht, der Mond haut lansam ab etc. ...

Aber machen wir's nicht komplizierter als es sein muss, rechnen nur mit dem gregorianischen Kalender und vergessen die Schaltsekunden.

Um eine Differenz bilden zu können, bilden wir einfach ein Datum eindeutig auf eine Zahl ab. Das ist gar nicht so schwer. Zunächst ignorieren wir einfach mal die Schalttage und wir bekommen unser vorläufiges Ergebnis aus dem Jahr*365, plus dem Offset des Monats plus dem Tag.

Anschliessend müssen wir noch gucken, wie viele Schalttage zurückliegen. Wenn wir ein Datum vor dem März haben, dann zählt ein eventueller Schalttag des laufenden Jahres nicht mit, wenn das Datum im oder nach dem März liegt, dann schon.

Also hier mal ein ganz einfaches (und nicht getestetes) Beispiel:



long date2num(int y, int m, int d)

{

/* Month: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec */

/* Days: 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 */

int moff[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

long ret;



/* calculate plain offset */

ret = y*365 + moff[m] + d;



/* add leap days */

if( m<2 ) y-=1;

ret += y/4 - y/100 + y/400;



return ret;

}



Bitte beachten: Damit's funzt müssen die Eingabewerte 0 basiert sein (d.h. Monat 0-11 bzw. Tag 0-30). Die zurückgelieferte Zahl hat übrigens keine besondere Bedeutung, garantiert ist lediglich, dass sie Datümmer (oder wie die Dinger im Plural heissen) linear abgebildet werden.



Weiter oben hast Du nach Übungsaufgaben gefragt und das hier ist eine!

Erweitere die Funktion so, dass sie z.B. auch Monatsangaben > 11 (Dezember) erlaubt. Erweitere die Funktion so, dass sie auch mit Uhrzeiten umgehen kann (easy, aber auf die Wertebereiche aufpassen).

Als zweite Aufgabe könntest Du versuchen eine Funktion zu bauen, die die Zahl wieder in ein Datum umwandelt (hübsche Aufgabe :-)

So als ganz kleiner Hinweis am Rande, exakt alle 400 Jahre (epoch) wiederholt sich der ganze Kladderadatsch (incl. Wochentage).



Viel Spass,



Uli (der sich gerade über den neuen HTML Konverter von Dev-Cpp ärgert)



PS:

Da fällt mir noch ne prima Übungsaufgabe für Dich ein. Bau doch mal nen Konverter für die HTML Ausgabe von Dev-Cpp, so dass man den schön bunt dekorierten Quelltext wieder problemlos hier in Spotlight einfügen kann (da musste die Style-Sheet Geschichten wieder in "normales" HTML zurückübersetzen).

Über eine Rückmeldung würde ich mich freuen (hab keine Lust das selber zu machen ;-)

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: