Find the last Sunday of each month: Difference between revisions
Content added Content deleted
Drkameleon (talk | contribs) (obsolete) |
No edit summary |
||
Line 170: | Line 170: | ||
2013-11-24 |
2013-11-24 |
||
2013-12-29</pre> |
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}}== |
=={{header|ALGOL W}}== |