AmiBlitz³

Normale Version: Schaltjahr (leap year) Func
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
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.

Code:
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
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.
Hast Du gut gemacht Wink
Vielleicht sollte man eher .w zurückgeben, oder? Ist mir gerade aufgefallen...