program PrMonDr; {Reads the day of January 1 and the year and prints calendar. Demo for stubs, drivers, and enumerated types.} type DayType = (Sun, Mon, Tue, Wed, Thur, Fri, Sat); WeekdayType = Mon..Fri; MonthType = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); YearType = 1500..2500; {valid for Gregorian calendar} var Year : Yeartype; {input - the calendar year} StartDay : Daytype; {input - New Year's Day} DayCh1,DayCh2,DayCh3 : Char; {input - letters in day name} Month : MonthType; {the current month} FebFlag : Boolean; {true for leap years} procedure PrintMonth(Month: MonthType; var StDay : DayType); {the main procedure} type MLType = 28..31; var ML : MLType; procedure PrintWeeks(MLFP : MLType; var StDFP : DayType); var Day : DayType; DayNum : 1.. 31; begin {First Week:} WriteLn; Day := Sun; DayNum := 1; while Day < StDFP do begin Write(' '); Day := Succ(Day) end; for Day := StDFP to Sat do begin Write(DayNum :4); Daynum := DayNum + 1 end; WriteLn; WriteLn; {Later Weeks:} while DayNum + 6 <= ML do begin for Day := Sun to Sat do begin Write(DayNum : 4); Daynum := DayNum + 1; end;{for} WriteLn;WriteLn; end; {Last Week} StDFP := Sun; while DayNum <= ML do begin Write(DayNum :4); StDFP := Succ(StDFP); DayNum := DayNum +1 end end;{PrintMonth} begin {MonthHeading(Month);} {ML := MonLen(Month);} ML := 31; PrintWeeks(ML, StDay) end; begin{main program} FebFlag := False; StartDay := Mon; for Month := Jan to Dec do PrintMonth(Month,StartDay); end.