[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]