57 lines
1.2 KiB
Text
57 lines
1.2 KiB
Text
BEGIN
|
|
|
|
COMMENT
|
|
FIND ISO CALENDAR YEARS HAVING 53 WEEKS. THE SIMPLEST
|
|
TEST IS THAT A GIVEN YEAR WILL BE "LONG" IF EITHER THE
|
|
FIRST OR LAST DAY IS A THURSDAY;
|
|
|
|
% CALCULATE P MOD Q %
|
|
INTEGER FUNCTION MOD(P, Q);
|
|
INTEGER P, Q;
|
|
BEGIN
|
|
MOD := P - Q * (P / Q);
|
|
END;
|
|
|
|
COMMENT
|
|
RETURN DAY OF WEEK (SUN=0, MON=1, ETC.) FOR A GIVEN
|
|
GREGORIAN CALENDAR DATE USING ZELLER'S CONGRUENCE;
|
|
INTEGER FUNCTION DAYOFWEEK(MO, DA, YR);
|
|
INTEGER MO, DA, YR;
|
|
BEGIN
|
|
INTEGER Y, C, Z;
|
|
IF MO < 3 THEN
|
|
BEGIN
|
|
MO := MO + 10;
|
|
YR := YR - 1;
|
|
END
|
|
ELSE MO := MO - 2;
|
|
Y := MOD(YR, 100);
|
|
C := YR / 100;
|
|
Z := (26 * MO - 2) / 10;
|
|
Z := Z + DA + Y + (Y / 4) + (C /4) - 2 * C + 777;
|
|
DAYOFWEEK := MOD(Z, 7);
|
|
END;
|
|
|
|
% RETURN 1 IF YEAR IS LONG, OTHERWISE 0 %
|
|
INTEGER FUNCTION ISLONGYEAR(YR);
|
|
INTEGER YR;
|
|
BEGIN
|
|
INTEGER THURSDAY;
|
|
THURSDAY := 4;
|
|
IF (DAYOFWEEK(1,1,YR) = THURSDAY) OR
|
|
(DAYOFWEEK(12,31,YR) = THURSDAY) THEN
|
|
ISLONGYEAR := 1
|
|
ELSE
|
|
ISLONGYEAR := 0;
|
|
END;
|
|
|
|
% MAIN PROGRAM STARTS HERE %
|
|
INTEGER YEAR;
|
|
WRITE("ISO YEARS THAT WILL BE LONG IN THIS CENTURY:");
|
|
WRITE("");
|
|
FOR YEAR := 2000 STEP 1 UNTIL 2099 DO
|
|
BEGIN
|
|
IF ISLONGYEAR(YEAR) = 1 THEN WRITEON(YEAR);
|
|
END;
|
|
|
|
END
|