54 lines
1.4 KiB
Plaintext
54 lines
1.4 KiB
Plaintext
five_weekends: BEGIN
|
|
INT m, year, nfives := 0, not5 := 0;
|
|
BOOL no5weekend;
|
|
|
|
MODE MONTH = STRUCT(
|
|
INT n,
|
|
[3]CHAR name
|
|
) # MODE MONTH #;
|
|
|
|
[]MONTH month = (
|
|
MONTH(13, "Jan"),
|
|
MONTH(3, "Mar"),
|
|
MONTH(5, "May"),
|
|
MONTH(7, "Jul"),
|
|
MONTH(8, "Aug"),
|
|
MONTH(10, "Oct"),
|
|
MONTH(12, "Dec")
|
|
);
|
|
|
|
FOR year FROM 1900 TO 2100 DO
|
|
IF year = 1905 THEN printf($"..."l$) FI;
|
|
no5weekend := TRUE;
|
|
FOR m TO UPB month DO
|
|
IF n OF month(m) = 13 THEN
|
|
IF day_of_week(1, n OF month(m), year-1) = 6 THEN
|
|
IF year<1905 OR year > 2096 THEN printf(($g, 5zl$, name OF month(m), year)) FI;
|
|
nfives +:= 1;
|
|
no5weekend := FALSE
|
|
FI
|
|
ELSE
|
|
IF day_of_week(1, n OF month(m), year) = 6 THEN
|
|
IF year<1905 OR year > 2096 THEN printf(($g, 5zl$, name OF month(m), year)) FI;
|
|
nfives +:= 1;
|
|
no5weekend := FALSE
|
|
FI
|
|
FI
|
|
OD;
|
|
IF no5weekend THEN not5 +:= 1 FI
|
|
OD;
|
|
|
|
printf(($g, g(0)l$, "Number of months with five weekends between 1900 and 2100 = ", nfives));
|
|
printf(($g, g(0)l$, "Number of years between 1900 and 2100 with no five weekend months = ", not5));
|
|
|
|
# contains #
|
|
|
|
PROC day_of_week = (INT d, m, y)INT: BEGIN
|
|
INT j, k;
|
|
j := y OVER 100;
|
|
k := y MOD 100;
|
|
(d + (m+1)*26 OVER 10 + k + k OVER 4 + j OVER 4 + 5*j) MOD 7
|
|
END # function day_of_week #;
|
|
SKIP
|
|
END # program five_weekends #
|