If mit mehreren Möglichkeiten abkürzen?
-
Ui ui ui, da hat sich ja mal was entwickelt.
Ich fühle mich dennoch genötigt, den _korrekten_ Spießercode abzuliefern.bool IsLeapyear(int year) { if(year<1) return false; if(year%4) return false; if(year<=1582) return true; if(year%100) return true; if(year%400) return false; return true; } int DaysPerMonth(int month, int year) { switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return(28+IsLeapyear(year)); default: return 0; } }
-
Michael E. schrieb:
OLONONOONONO schrieb:
return "OLONONOONONO"[month-1]-48+(month==2&&!(year%4)&&year%400);Hübsch, aber klappt noch nicht ganz.
"OLONONOONONO"[month-1]-48+(month==2&&(!(year%4)&&year%100||!(year%400)))<krümelkack>
Das ist nicht portabel, da der C++ Standard kein ASCII erzwingt. Ich glaube, die einzige Garantie, die da gemacht wird, ist, dass '0'+x mit 0<=x<=9 die richtige Dezimalziffer gibt, also dass '0', '1', '2', ..., '9' aufeinanderfolgende char-Werte sind.
</krümelkack>Ich würd's wahrscheinlich mit switch machen. Das ist einfach am leserlichsten. Ich möchte trotzdem eine Lösung zeigen, die wir hier noch nicht gesehen haben:
template<class T, usnigned N, class U> inline bool binary_search(const T(&oa)[N], U x) { return std::binary_search(oa+0,oa+N,x); } ... if (month==2) return 28+isLeapYear(year); static const int m30[] = {4,6,9,11}; return binary_search(m30,month) ? 30 : 31;@Vicious Falcon: Du weißt, dass return keine Funktion ist und die Klammern um den Ausdruck überflüssig sind, ja?
-
Ja, war ein Copy & Paste-Problem, falsch angefangen und im Folgenden so durchgezogen.
:xmas1:
-
int wieviele_tage(int monat) { return ((0xEEFBB3 >> ((monat - 1)*3)) & 0x3) + 28; }
-
Jetzt fällt mir erst auf, dass das ja bloß ein gepacktes lookup-feld ist

-
(Meep Meep) schrieb:
int wieviele_tage(int monat) { return ((0xEEFBB3 >> ((monat - 1)*3)) & 0x3) + 28; }auch nett! das *3 sollte aber wohl ein *2 sein.
...fehlt nur noch das Schaltjahr...int wieviele_tage(int monat, bool schaltjahr) { return (((0xEEFBB3+(schaltjahr<<2)) >> ((monat - 1)<<1)) & 0x3) + 28; }