Find the last Sunday of each month: Difference between revisions

no edit summary
(obsolete)
No edit summary
Line 170:
2013-11-24
2013-12-29</pre>
 
=={{header|ALGOL-M}}==
<lang ALGOL>
BEGIN
 
% 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 TRUE (1) IF Y IS A LEAP YEAR, OTHERWISE FALSE (0)
INTEGER FUNCTION ISLEAPYR(Y);
INTEGER Y;
BEGIN
IF MOD(Y,4) <> 0 THEN
ISLEAPYR := 0
ELSE IF MOD(Y,400) = 0 THEN
ISLEAPYR := 1
ELSE IF MOD(Y,100) = 0 THEN
ISLEAPYR := 0
ELSE
ISLEAPYR := 1;
END;
 
% RETURN THE NUMBER OF DAYS IN THE SPECIFIED MONTH %
INTEGER FUNCTION MONTHDAYS(MO, YR);
INTEGER MO, YR;
BEGIN
IF MO = 2 THEN
BEGIN
IF ISLEAPYR(YR) = 1 THEN
MONTHDAYS := 29
ELSE
MONTHDAYS := 28;
END
ELSE IF (MO = 4) OR (MO = 6) OR (MO = 9) OR (MO = 11) THEN
MONTHDAYS := 30
ELSE
MONTHDAYS := 31;
END;
 
COMMENT
RETURN THE DAY OF THE MONTH CORRESPONDING TO LAST OCCURANCE
OF WEEKDAY K (SUN=0, MON=1, ETC.) FOR A GIVEN MONTH AND YEAR;
INTEGER FUNCTION LASTKDAY(K, M, Y);
INTEGER K, M, Y;
BEGIN
INTEGER D, W;
% DETERMINE WEEKDAY FOR THE LAST DAY OF THE MONTH %
D := MONTHDAYS(M, Y);
W := DAYOFWEEK(M, D, Y);
% FIND NEAREST PRIOR OCCURANCE OF DESIRED WEEKDAY %
IF W >= K THEN
D := D - (W - K)
ELSE
D := D - (7 - K - W);
LASTKDAY := D;
END;
STRING FUNCTION MONTHNAME(N);
INTEGER N;
BEGIN
CASE (N - 1) OF
BEGIN
MONTHNAME := "JAN";
MONTHNAME := "FEB";
MONTHNAME := "MAR";
MONTHNAME := "APR";
MONTHNAME := "MAY";
MONTHNAME := "JUN";
MONTHNAME := "JUL";
MONTHNAME := "AUG";
MONTHNAME := "SEP";
MONTHNAME := "OCT";
MONTHNAME := "NOV";
MONTHNAME := "DEC";
END;
END;
% EXERCISE THE ROUTINE %
INTEGER M, SUNDAY;
SUNDAY := 0;
WRITE("LAST SUNDAY OF EACH MONTH IN 2021");
FOR M:=1 STEP 1 UNTIL 12 DO
WRITE(MONTHNAME(M), LASTKDAY(SUNDAY,M,2021));
 
END
</lang>
{{out}}
<pre>
LAST SUNDAY OF EACH MONTH IN 2021
JAN 31
FEB 28
MAR 28
APR 25
MAY 30
JUN 27
JUL 25
AUG 29
SEP 26
OCT 31
NOV 28
DEC 26
</pre>
 
=={{header|ALGOL W}}==
211

edits