How to print the calendar for a specific year in Pascal

1 Answer

0 votes
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 

*)


 



answered Jan 17 by avibootz
...