program PrintCalendarProgram;
const
MonthNames: array[1..12] of string[10] =
('January','February','March','April','May','June',
'July','August','September','October','November','December');
MonthDays: array[1..12] of integer =
(31,28,31,30,31,30,31,31,30,31,30,31);
{---------------------------------------------------------------}
{ Determine if a year is a leap year }
{---------------------------------------------------------------}
function IsLeapYear(Y: integer): boolean;
begin
IsLeapYear :=
((Y mod 4 = 0) and (Y mod 100 <> 0)) or (Y mod 400 = 0);
end;
{---------------------------------------------------------------}
{ Compute weekday }
{ Returns: 0=Sunday, 1=Monday, ..., 6=Saturday }
{---------------------------------------------------------------}
function Weekday(D, M, Y: integer): integer;
var
K, J, h: integer;
begin
if M <= 2 then
begin
M := M + 12;
Y := Y - 1;
end;
K := Y mod 100;
J := Y div 100;
h := (D + (13 * (M + 1)) div 5 + K + (K div 4) + (J div 4) + 5 * J) mod 7;
{ Zeller: 0=Saturday, 1=Sunday, ..., 6=Friday }
{ Convert to: 0=Sunday, 1=Monday, ..., 6=Saturday }
Weekday := (h + 6) mod 7;
end;
{---------------------------------------------------------------}
{ Print a single month }
{---------------------------------------------------------------}
procedure PrintMonth(M, Y: integer);
var
Days, StartDay, D, I: integer;
begin
Days := MonthDays[M];
if (M = 2) and IsLeapYear(Y) then
Inc(Days);
Writeln;
Writeln(' ', MonthNames[M], ' ', Y);
Writeln('Su Mo Tu We Th Fr Sa');
StartDay := Weekday(1, M, Y);
{ Print leading spaces }
for I := 1 to StartDay do
Write(' ');
{ Print all days }
for D := 1 to Days do
begin
Write(D:2, ' ');
if ((StartDay + D) mod 7 = 0) then
Writeln;
end;
Writeln;
end;
{---------------------------------------------------------------}
{ Print entire year }
{---------------------------------------------------------------}
procedure PrintYear(Y: integer);
var
M: integer;
begin
for M := 1 to 12 do
PrintMonth(M, Y);
end;
{---------------------------------------------------------------}
{ Main program }
{---------------------------------------------------------------}
var
Year: integer;
begin
Year := 2026;
PrintYear(Year);
end.
(*
run:
January 2026
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
February 2026
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
March 2026
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
April 2026
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
May 2026
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
June 2026
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
July 2026
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
August 2026
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
September 2026
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
October 2026
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
November 2026
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
December 2026
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
*)