POST EDITED: I had the wrong code pasted into the post. It has been replaced.
As someone who works in cosmology, astronomy and physics, the formula for calculating leap years is a very simple one.
However, looking at your code, why are you using FLOOR instead of MOD? In SmartBASIC, the MOD function is "%". X=405%360 returns X=45, 45 the remainder of 405/360.
MOD function in SmartBASIC's manual has half a sentence, if that, and I missed it many times, until I asked in a post if SB had a MOD function.
I would like to see a small section dedicated to the MOD, and Ton, you can use my code below to use as an example of one way to use it. I can write up more on it with other examples if your wish. Let me know.
The problem with using FLOOR or CEIL or any of the other math functions is you may get rounding errors, and could flag a year as a leap year or one that is a leap year as not one, and your calendar is off.
Here is a simple program using the SB MOD function that can be easily changed to a function, and returning switched values, tell you if a year is a Leap Year or not. No need to provide it with a table of valid Century years as the logic test does this for you:
Code: Select all
'*** Input Year in box at top of the screen
'*** Perform MOD functions on year divided by 4, 100, and 400
'*** Logic test to see if year is a Century, Normal, or not a Leap Year
IF L=0 AND (C100=0 AND C400=0) THEN
PRINT "Year "&Y&" is a Century Leap Year"
PRINT "Year "&Y&" is not a Century Leap Year"
IF L=0 AND (C100<>0 AND C400<>0) THEN
PRINT "Year "&Y&" is a normal Leap Year"
PRINT "Year "&Y&" is not a Leap Year"
This takes care of your every four years, your every 100 years (century years), and also determines if a century is really a leap year (by dividing by 100 and 400).
Joel wrote: ↑
Mon Oct 02, 2017 8:18 pm
For date calculations I needed a program to calculate the number of days since 1/1/1600. This program can also be used to calculate the difference between two dates, for example.
Code: Select all
INPUT year, month,day
PRINT days_1600(year,month,day) 'calculates the number of days since 1600/1/1
'set leapyear (is this year a leapyear? and count leap years since 1600
IF year=1600 THEN
IF leaps2(year-1)=leaps THEN
IF NOT num_in_range(month,1,12) THEN RETURN -1'valid input?
IF NOT num_in_range(day,1,31) THEN RETURN -1 'upper limit will be checked later
FOR days_in_month=1 TO month-1
result=result+days 'sum up all days of prev month
result=result+day 'add the input day
READ days 'for validity purpose
IF month=2 AND leapyear THEN days+=1 'days will not longer be used so this is for next line
IF days<day THEN RETURN-1 'invalid date
result=result+dyear*365+leaps 'add days of prev years and number of leap years
IF month<=2 AND leapyear THEN result-=1 'in jan or feb ignore the this year leap status
DEF num_in_range(num, num1,num2)
IF num<num1 OR num>num2 THEN RETURN 0 ELSE RETURN 1
result=each4-each100+each400+1'1600 is a leap year itself