002
14.04.2010, 21:54 Uhr
0xdeadbeef
Gott (Operator)
|
Die Problematik ist im Grunde nicht all zu kompliziert, lediglich das Prüfen auf das Monatsende ist etwas aufwändig. Etwa so:
C++: |
bool ist_schaltjahr(unsigned jahr) { // Für 1582 und davor darfst du das selbst erweitern, sofern notwendig return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); }
struct datum { unsigned jahr; unsigned monat; unsigned tag; };
datum gestern(datum dat) { // Parameter wurde als Kopie übergeben, also können wir gleich damit arbeiten. static unsigned const tage_pro_monat[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if(dat.tag == 1) { if(dat.monat == 1) { --dat.jahr; dat.monat = 12; } else { --dat.monat; } dat.tag = tage_pro_monat[dat.monat] + (dat.monat == 2 && ist_schaltjahr(dat.jahr) ? 1 : 0); } else { --dat.tag; }
return dat; }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |