Page 1 of 1

Schaltjahr (leap year) Func

PostPosted: 3. February 2019, 00:24
by hackball
Der Sinn ist, man nimmt das übliche
date$(ndays)

und findet mit Months heraus, ob man Februar hat. Wenn man dann die Anzahl der Tage feststellen will,
gibt man + leapyear {year} ein, was einen Tag hinzufügt (oder eben nicht) für Februar.

Function.b leapyear{year.w}  ;returns 1 for leap year or 0
res.b=0
;divisible /100: not a leap year
dummy.w=(year/100)
If (dummy*100)=year
res=0
;divisible /400: leap year
dummy.w=(year/400)
If (dummy*400)=year Then res=1
Function Return res
EndIf
;divisible /4 : leap year
dummy.w=(year/4) :If (dummy*4)=year Then res=1 Else res=0
Function Return res
End Function

;testcase
NPrint "leap year test case:"
NPrint "1800 (no) ",leapyear{1800}
NPrint "1900 (no) ",leapyear{1900}
NPrint "2100 (no) ",leapyear{2100}

NPrint "2009 (no) ",leapyear{2009}
NPrint "2010 (no) ",leapyear{2010}
NPrint "2011 (no) ",leapyear{2011}

NPrint "2008 (ya) ",leapyear{2008}
NPrint "2012 (ya) ",leapyear{2012}
NPrint "2016 (ya) ",leapyear{2016}

NPrint "2000 (ya) ",leapyear{2000}
NPrint "2400 (ya) ",leapyear{2400}

Stop

Re: Schaltjahr (leap year) Func

PostPosted: 3. February 2019, 00:29
by hackball
Wie man sieht, wird hier ausgenutzt, daß ein Casting von Quick oder Float Resultaten nach Word immer den Int (Word) ergibt und demnach mit Div->Mult Teil geprüft wird, ob das Ergebnis ohne Rundungsfehler abgelaufen ist und dasselbe Resultat liefert.

Re: Schaltjahr (leap year) Func

PostPosted: 4. February 2019, 09:26
by bruZard
Hast Du gut gemacht ;)