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;
    }
    

    🙂


Anmelden zum Antworten