program MonthCalendarProgram;
function DayOfWeek(d, m, y : integer) : integer;
{ Returns 0=Sunday, 1=Monday, ..., 6=Saturday }
var
a : integer;
begin
if m < 3 then
begin
m := m + 12;
y := y - 1;
end;
a := (d + (13 * (m + 1)) div 5 + y + (y div 4) - (y div 100) + (y div 400)) mod 7;
{ Zeller returns 0=Saturday, so convert to 0=Sunday }
DayOfWeek := (a + 6) mod 7;
end;
function DaysInMonth(m, y : integer) : integer;
begin
case m of
1,3,5,7,8,10,12: DaysInMonth := 31;
4,6,9,11: DaysInMonth := 30;
2: if ( (y mod 4 = 0) and ( (y mod 100 <> 0) or (y mod 400 = 0) ) )
then DaysInMonth := 29
else DaysInMonth := 28;
end;
end;
procedure PrintMonthCalendar(m, y : integer);
var
first, d, i, dim : integer;
MonthNames : array[1..12] of string[10];
begin
MonthNames[1] := 'January'; MonthNames[2] := 'February';
MonthNames[3] := 'March'; MonthNames[4] := 'April';
MonthNames[5] := 'May'; MonthNames[6] := 'June';
MonthNames[7] := 'July'; MonthNames[8] := 'August';
MonthNames[9] := 'September'; MonthNames[10] := 'October';
MonthNames[11] := 'November'; MonthNames[12] := 'December';
writeln(' ', MonthNames[m], ' ', y);
writeln('Su Mo Tu We Th Fr Sa');
first := DayOfWeek(1, m, y);
dim := DaysInMonth(m, y);
for i := 1 to first do
write(' ');
for d := 1 to dim do
begin
write(d:2, ' ');
if (first + d) mod 7 = 0 then writeln;
end;
writeln;
end;
var
year, month : integer;
begin
year := 2026;
month := 1;
PrintMonthCalendar(month, 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
*)