home *** CD-ROM | disk | FTP | other *** search
- PROGRAM clndr2;
-
- { Full year printout 86-04-27 }
-
- CONST
- fudge = 6;
-
- VAR
- i, j, k : INTEGER;
- month, year : INTEGER;
- day, maxday : array[1..3] of INTEGER;
- c: char;
- s : string[132];
- m4, m100, m400 : INTEGER;
- leap : BOOLEAN;
- pline : ARRAY[1..132] OF CHAR;
- plen : INTEGER;
- dayspermonth : ARRAY[1..12] OF INTEGER;
- days : string[132];
- months : ARRAY[1..12] OF STRING[12];
-
- PROCEDURE init;
- BEGIN
- plen:= 80;
- FOR i:= 1 TO plen DO
- pline[i]:= ' ';
- dayspermonth[ 1] := 31;
- dayspermonth[ 2] := 28;
- dayspermonth[ 3] := 31;
- dayspermonth[ 4] := 30;
- dayspermonth[ 5] := 31;
- dayspermonth[ 6] := 30;
- dayspermonth[ 7] := 31;
- dayspermonth[ 8] := 31;
- dayspermonth[ 9] := 30;
- dayspermonth[10] := 31;
- dayspermonth[11] := 30;
- dayspermonth[12] := 31;
- months[ 1]:= ' January ';
- months[ 2]:= ' February ';
- months[ 3]:= ' March ';
- months[ 4]:= ' April ';
- months[ 5]:= ' May ';
- months[ 6]:= ' June ';
- months[ 7]:= ' July ';
- months[ 8]:= ' August ';
- months[ 9]:= ' September ';
- months[10]:= ' October ';
- months[11]:= ' November ';
- months[12]:= ' December ';
- days:='S M T W T F S ';
- END;
-
- PROCEDURE doline;
- VAR
- i: INTEGER;
- BEGIN
- FOR i:= 1 to plen DO
- BEGIN
- write(lst,pline[i]);
- pline[i]:=' ';
- END;
- writeln(lst);
- END;
-
- PROCEDURE mhead;
- VAR
- i, j, k, l : INTEGER;
- BEGIN
- writeln(lst);
- writeln(lst);
- writeln(lst);
- k := length(days) + 6;
- FOR i := 0 TO 2 DO
- BEGIN
- FOR j := 1 to 12 DO
- BEGIN
- l := i * k + fudge + 4 + j;
- pline[l] := months[month + i][j];
- END;
- END;
- doline;
- FOR i := 0 TO 2 DO
- FOR j := 1 TO length(days) DO
- pline[i * k + j + fudge] := days[j];
- doline;
- writeln(lst);
- END;
-
- PROCEDURE head;
- VAR
- i, j, k : INTEGER;
- BEGIN
- FOR i := 1 TO 2 DO
- writeln(lst);
- writeln(lst,' ':35, year);
- if leap THEN
- writeln(lst,' ':32,'A Leap Year');
- END;
-
- FUNCTION dow(d, m, y : INTEGER): INTEGER;
- VAR
- m1 : REAL;
- c, l : INTEGER;
- BEGIN
- IF leap THEN
- l := 2
- ELSE
- l := 1;
- c := y DIV 100;
- y := y MOD 100;
- m := m - 2;
- IF m < 1 THEN m := m + 12;
- m1 := (2.6 * m) - 0.2;
- d := d + trunc(m1) + y + (y DIV 4) + (c DIV 4) - 2 * c - (l * (m DIV 11));
- dow := d MOD 7; { 0 = Sun, 1 = Mon,... }
- END;
-
- PROCEDURE numout(p, n : INTEGER);
- BEGIN
- WHILE n > 0 DO
- BEGIN
- pline[p] := chr(n MOD 10 + 48);
- p := p - 1;
- n := n DIV 10;
- END;
- END;
-
- PROCEDURE line(VAR done : BOOLEAN);
- VAR
- i, j, k, l : INTEGER;
- BEGIN
- done := true;
- k := length(days) + 6;
- FOR j := 1 to 3 DO
- BEGIN
- FOR i := 1 TO 7 DO
- BEGIN
- l := (j - 1) * k + fudge + 1;
- IF day[j] <= maxday[j] THEN
- numout(l + (i - 1) * 3, day[j]);
- day[j] := day[j] + 1;
- END;
- done := (day[j] > maxday[j]) AND done;
- END;
- doline;
- END;
-
- PROCEDURE doyear;
- VAR
- i, j, k, y, mon : INTEGER;
- done : BOOLEAN;
- BEGIN
- month := 1;
- m4 := year MOD 4;
- m100 := year MOD 100;
- m400 := year MOD 400;
- IF ((m4 = 0) AND (m100 <> 0)) OR (m400 = 0) THEN
- BEGIN
- leap := true;
- dayspermonth[2] := 29;
- END
- ELSE
- BEGIN
- leap := false;
- dayspermonth[2] := 28;
- END;
- head;
- REPEAT
- FOR i := 1 to 3 DO
- BEGIN
- mon := month + i - 1;
- j:= year;
- day[i] := 1 - dow(1, mon, j);
- maxday[i] := dayspermonth[mon];
- END;
- mhead;
- REPEAT
- line(done);
- UNTIL done;
- month := month + 3;
- UNTIL month > 12;
- END;
-
- BEGIN { Main }
- init;
- write('Year (i.e. 1986) > ');
- readln(year);
- doyear;
- write(lst,chr(12));
- END.
-