[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]
{
A couple of weeks ago, my computer science had to write a computer program
to generate a calendar. Now my assignment is to incorporate the use of
appropriate enumeration and subrange data types, and corresponding procedures
to support these, into the program as a way of improving it. Here is the
program that I would like some suggestions on.. Thanks in advance:
}
program OneMonthCalendar ( INPUT, OUTPUT ) ;
var
Month : INTEGER ; (* The month number; a value in the range 1 - 12 *)
PrevMonthDays : INTEGER ; (* The number of days in the previous month *)
CurrMonthDays : INTEGER ; (* The number of days in the desired month *)
StartDay : INTEGER ; (* A value indicating the day of the week on *)
(* which the month begins; 0 = Sunday, 1 = *)
(* Monday, etc *)
Date : INTEGER ; (* The data currently being generated *)
(*----------------------------------------------------------*)
(*----------------------------------------------------------*)
procedure ReadData
( var MonthNumber : INTEGER (* out - The month number *) ;
var PreviousMonthDays : INTEGER (* out - Number of days in the previous
month *) ;
var CurrentMonthDays : INTEGER (* out - Number of days in the desired
month *) ;
var StartingDay : INTEGER (* out - The day of the week on which the
desired month begins *) ) ;
begin (* procedure *)
Read ( MonthNumber ) ;
Read ( PreviousMonthDays ) ;
Read ( CurrentMonthDays ) ;
Read ( StartingDay ) ;
ReadLn;
end (* ReadData *) ;
(*----------------------------------------------------------*)
procedure WriteHeading
( Month : INTEGER (* in - The month number *) ) ;
begin (* procedure *)
WriteLn;
WriteLn ( 'Month ', Month:2);
WriteLn ( '+----------------------+');
WriteLn ( '| S M T W T F S |');
WriteLn ( '+----------------------+');
end (* WriteHeading *) ;
(*----------------------------------------------------------*)
procedure WriteTrailing;
begin (* procedure *)
WriteLn ('+----------------------+');
end (* WriteTrailing *) ;
(*----------------------------------------------------------*)
procedure IncrementDate
( var Date : INTEGER (* in out - The date value to be incremented *) ;
DateLimit : INTEGER (* in - The number of days in the month
corresponding to the given date value *)
);
begin (* procedure *)
if Date < DateLimit then begin
Date := Date + 1 ;
end else begin
Date := 1
end (* if *) ;
end (* IncrementDate *) ;
(*----------------------------------------------------------*)
procedure OneDayCalendar
( Date : INTEGER (* in - The date value for the day *) ) ;
begin (* procedure *)
Write ( Date:3 ) ;
end (* OneDayCalendar *) ;
(*----------------------------------------------------------*)
procedure OneWeekCalendar
( var Date : INTEGER (* in out - The date value *) ;
MonthsLastDate : INTEGER (* in - The date value of the last day *)
(* in the month corresponding to the *)
(* given date value *) ) ;
var
Day : INTEGER ;(* Counting variable *)
begin (* procedure *)
Write ('|');
for Day := 1 to 7 do begin
OneDayCalendar ( Date ) ;
IncrementDate ( Date, MonthsLastDate ) ;
(* Day's value represents the number of dates outputed *)
end (* for *) ;
WriteLn (' |');
end (* OneWeekCalendar *) ;
(*----------------------------------------------------------*)
procedure DetermineSundayDate
( PreviousMonthDays : INTEGER (* in - The number of days in the *)
(* previous month *) ;
StartingDay : INTEGER (* in - A value representing the day of the *)
(* week on which the desired month begins *) ;
var SundayDate : INTEGER (* out - The date of the Sunday for the *)
(* first week in the calendar *) ) ;
begin (* procedure *)
SundayDate := PreviousMonthDays - StartingDay;
IncrementDate (SundayDate, PreviousMonthDays);
end (* DetermineSundayDate *) ;
(*----------------------------------------------------------*)
procedure GenerateCalendar
( Date : INTEGER (* in - The starting date *) ;
PreviousMonth : INTEGER (* in - The number of days in the previous
month *) ;
CurrentMonth : INTEGER (* in - The number of days in the current
month *) ) ;
var
PreviousSunday : INTEGER ; (* The date of the previous sunday *)
begin (* procedure *)
OneWeekCalendar ( Date, PreviousMonth ) ;
PreviousSunday := Date;
while Date >= PreviousSunday do begin
PreviousSunday := Date;
OneWeekCalendar ( Date, CurrentMonth ) ;
end (* while *) ;
end (* GenerateCalendar *) ;
(*=======================================================================*)
begin (* main program *)
WriteLn ('One Month Calendar - Version 4'); WriteLn;
while NOT EOF do begin
ReadData ( Month, PrevMonthDays, CurrMonthDays, StartDay ) ;
WriteHeading (Month);
DetermineSundayDate (PrevMonthDays, StartDay, Date);
GenerateCalendar (Date, PrevMonthDays, CurrMonthDays);
WriteTrailing;
(* EOLN is true *)
end (* while *) ;
end (* OneMonthCalendar *).
[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]