[comp.lang.pascal] Turbo Pascal Calendar Program

maxc0186@sdsu (Wintermute) (04/18/89)

program calendar (input, output);

(**********************************************)
(**                                          **)
(**  input:  two integers "month"            **)
(**                     1 <="month"<=12      **)
(**                     0 <="year"           **)
(**           Each number is                 **)
(**           seaparated by a space.         **)
(**  output:  a one-page framed calendar for **)
(**           requested month or a yearly    **)
(**           calendar for requested year    **)
(**                                          **)
(**********************************************)

type
  days = (sun,mon,tues,wed,thur,fri,sat,endweek);
var
  dayname : days;
  year, month, firstday, lastdate, date : integer;
  choice : char;

procedure divider(length : integer);
var
  counter : integer;
begin
  write (lst,' ':3);
  write (lst,'|');
  counter := 2;
  while counter < length do
    begin
      write (lst,'-');
      counter := counter + 1;
    end;
  write (lst,'|');
  writeln (lst);
end; (*divider*)

procedure starline (length : integer);
var
  box, counter : integer;
begin
  write (lst,' ':3);
  counter := 2;
  write (lst,'|');
  while counter <= length do
    begin
      counter := counter + 1;
      for box := 1 to 9 do
        begin
          write (lst,'-');
          counter := counter + 1;
        end;
      if counter < length then
        write (lst,'+')
      else
        write (lst,'|');
      counter := counter + 1;
    end;
  writeln (lst);
end; (*starline*)

procedure staredges (length : integer);
begin
  writeln (lst, ' ':3, '|', '|':length-1);
end; (*staredges*)

procedure stardivide (totalsections, lengthofone : integer);
var
  counter : integer;
begin
  write (lst,'|':4);
  counter := 1;
  while counter <= totalsections do
    begin
      write (lst,' ':lengthofone-1, '|');
      counter := counter + 1;
    end;
  writeln (lst);
end; (*stardivide*)

procedure writetitles (month, year : integer);

  procedure monthtitle;
  begin
    write (lst,'|':4);
    case month of
      1 : write (lst,'January':35);
      2 : write (lst,'February':35);
      3 : write (lst,'March':35);
      4 : write (lst,'April':35);
      5 : write (lst,'May':35);
      6 : write (lst,'June':35);
      7 : write (lst,'July':35);
      8 : write (lst,'August':35);
      9 : write (lst,'September':35);
     10 : write (lst,'October':35);
     11 : write (lst,'November':35);
     12 : write (lst,'December':35);
    end;
    writeln (lst, year:6, '|':29);
  end; (*monthtitle*)

  procedure daytitle;
  var
    daymark : days;
  begin
    write (lst,'|':4);
    daymark := sun;
    while daymark <= sat do
      begin
        case daymark of
          sun  : write (lst,'   Sun   ');
          mon  : write (lst,'   Mon   ');
          tues : write (lst,'   Tues  ');
          wed  : write (lst,'   Wed   ');
          thur : write (lst,'   Thur  ');
          fri  : write (lst,'   Fri   ');
          sat  : write (lst,'   Sat   ');
        end;
        write (lst,'|');
        daymark := succ (daymark);
      end;
      writeln (lst);
    end; (*daytitle*)

begin (*writetitles*)
  writeln (lst);
  divider (71);
  staredges (71);
  monthtitle;
  staredges (71);
  divider (71);
  stardivide (7, 10);
  daytitle;
  stardivide (7, 10);
  starline (71);
end; (*writetitles*)

function realint (x : real) : real;
begin
  realint := x - (x - trunc (x));
end;

function dayweek (year : integer;
                  month : integer;
                  day : integer) : integer;

var
  cent, yr : integer;
  temp : integer;

begin
  if year < 100 then
    year := year + 1900;
  month := month - 2;
  if (month < 1)  or (month > 10) then
    begin
      month := month + 12;
      year := year - 1;
    end;
  cent := year div 100;
  yr := year mod 100;
  temp := (trunc (realint (2.6 * month - 0.2)) + day + yr + (yr div 4) +
          (cent div 4) - cent - cent) mod 7;
  if temp < 0 then
    temp := temp + 7;
  dayweek := temp + 1;
end; {dayweek}

function dayone (firstday : integer) : days;
begin
  case firstday of
    1 : dayone := sun;
    2 : dayone := mon;
    3 : dayone := tues;
    4 : dayone := wed;
    5 : dayone := thur;
    6 : dayone := fri;
    7 : dayone := sat;
  end;
end; (*dayone*)

function howmanydays (month : integer;
                      year : integer) : integer;
begin
  case month of
    1,3,5,7,8,10,12 : howmanydays := 31;
    4,6,9,11 : howmanydays := 30;
    2 : begin
          if ((year mod 4) = 0) and ((year mod 100) <> 0) or
          ((year mod 400) = 0) then
            howmanydays := 29
          else
            howmanydays := 28;
        end;
  end;
end; (*howmanydays*)

procedure write1line (var date : integer;
                          dayname : days;
                          lastdate : integer);

  procedure writedates;
  var
    daymark : days;
  begin
    write (lst,' ':3, '|');
    daymark := sun;
    if date = 1 then
      begin
        while daymark < dayname do
          begin
            write (lst,' ':9, '|');
            daymark := succ (daymark);
          end;
        repeat
          write (lst,' ':5, date:3, ' ', '|');
          date := date + 1;
          daymark := succ (daymark);
        until daymark = endweek;
      end
    else
      begin
        repeat
          write (lst,' ':5, date:3, ' ', '|');
          date := date + 1;
          daymark := succ (daymark);
        until (date > lastdate) or (daymark = endweek);
      end;
      while daymark < endweek do
        begin
          write (lst,' ':9, '|');
          daymark := succ (daymark);
        end;
    writeln (lst);
  end; (*writedates*)

begin (*write1line*)
  writedates;
  stardivide (7, 10);
  stardivide (7, 10);
  stardivide (7, 10);
  starline (71);
end; (*write1line*)

begin (*MAIN*)
  write ('Calendar for Month or Year (m/y): ');
  readln (choice);
  if (choice = 'm') or (choice = 'M') then
    begin
      writeln (' Print Month Calendar');
      writeln (' Enter month, year: ');
      read (month, year);
      firstday := dayweek (year, month, 1);
      write (lst,chr (12));
      writeln (lst); writeln (lst);
      if year > 0 then
        if (month >= 1) and (month <= 12) then
          begin
            writetitles (month, year);
            dayname := dayone (firstday);
            lastdate := howmanydays (month, year);
            date := 1;
            while date <= lastdate do
              write1line (date, dayname, lastdate);
          end
        else writeln (' month of year must be between 1 and 12')
      else writeln (' year must be a positive integer');
    end
  else if (choice = 'y') or (choice = 'Y') then
    begin
      writeln (' Print Year Calendar');
      writeln (' Enter year: ');
      read (year);
      if year > 0 then
        begin
          for month := 1 to 12 do
            begin
              write (lst,chr (12));
              firstday := dayweek (year, month, 1);
              writeln (lst); writeln (lst);
              writetitles (month, year);
              dayname := dayone (firstday);
              lastdate := howmanydays (month, year);
              date := 1;
              while date <= lastdate do
                write1line (date, dayname, lastdate);
            end;
        end
      else
        writeln (' year must be a positive integer');
    end
  else
    writeln ('You must enter m or y');
end.