Program Kalender ; (* This German program generates one or more calenders into a file *) (* B:CALENDER.TXT. The form of the calender is such that it can be *) (* easily appended to graphics, eg. Snoopy etc. *) (* The program was 'lifted' directly from a German book on programming *) (* and required only minor changes to work ( the IO had to be fixed) *) (* I thing this demonstrates the true portability of the PASCAL system *) Type Twochtag = (So,Mo,Di,Mi,Don,Fr,Sa); Tmonat = (Jan,Feb,Mrc,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); Tmonatag = 0..31; Tjahr = 1583..3000; Tmonalis = Array (. Tmonat .) of Record Anftag : Twochtag; Laenge : 28..31 ; Name : Array (. 1..9 .) of Char; End; TBuf = Array (. Tmonat .) of Record Line : Array (.1..80 .) of Char; End; Var Jahrx, Jahry, J, Jahrb : Tjahr; Wochtagb : Twochtag; Monalis : Tmonalis; Cono : Text; Out : Text; Buf : Tbuf; Procedure Vorspann ; Var Monindex : Tmonat; Begin Jahrb := 1980; Wochtagb := Di; With Monalis (. Jan .) Do Begin Laenge:=31; Name:='January ' End; With Monalis(. Feb.) Do Name :='February '; With Monalis(. Mrc.) Do Begin Laenge:=31; Name:='March ' End; With Monalis(.Apr.) Do Begin Laenge:=30; Name:='April ' End; With Monalis(. May.) Do Begin Laenge:=31; Name:='May ' End; With Monalis(. Jun.) Do Begin Laenge:=30; Name:='June ' End; With Monalis(.Jul.) Do Begin Laenge:=31; Name:='July ' End; With Monalis(.Aug.) Do Begin Laenge:=31; Name:='August ' End; With Monalis(.Sep.) Do Begin Laenge:=30; Name:='September' End; With Monalis(.Oct.) Do Begin Laenge:=31; Name:='October ' End; With Monalis(.Nov.) Do Begin Laenge:=30; Name:='November ' End; With Monalis(.Dec.) Do Begin Laenge:=31; Name:='December ' End; End (* Vorspann *) ; Function Schalt (Jahr : Tjahr ) : Boolean; Begin Schalt := (( Jahr Mod 4 = 0) And ( Jahr Mod 100 <> 0)) Or ( Jahr Mod 400 = 0) End (* Schalt *) ; Function Wtag ( I : Integer ) : Twochtag; Begin I:=I Mod 7; If I< 0 Then I:=7+I; Case I Of 0: Wtag:=So; 1: Wtag:=Mo; 2: Wtag:=Di; 3: Wtag:= Mi; 4: Wtag:=Don; 5: Wtag:=Fr; 6: Wtag:=Sa; End; End (* Wtag *) ; Procedure InitJahr ( Jahrz : Tjahr ); Var Wochtagz : Twochtag; Tagnr : Integer; J : Tjahr; Monindex : Tmonat; Begin Tagnr:=0; If Jahrz = Jahrb Then Wochtagz := Wochtagb; If Jahrz > Jahrb Then Begin For J:= Jahrb to Jahrz-1 Do If Schalt (J) Then Tagnr:=Tagnr+366 Else Tagnr:=Tagnr+365; Wochtagz:=Wtag(Ord(Wochtagb)+Tagnr) End Else Begin For J:=Jahrb-1 Downto Jahrz Do If Schalt (J) Then Tagnr:=Tagnr+366 Else Tagnr:= Tagnr+365; Wochtagz:=Wtag(Ord(Wochtagb)-Tagnr) End ; Monalis(.Jan.).Anftag :=Wochtagz; If Schalt(Jahrz) then Monalis(.Feb.).Laenge:=29 Else Monalis(.Feb.).Laenge:=28; For Monindex:=Feb to Dec Do Monalis(.Monindex.).Anftag:= Wtag(Ord(Monalis(.Pred(Monindex).).Anftag) + Monalis(.Pred(Monindex).).Laenge) End (* Initjahr *); Procedure Writemonate ( Jahrz : Tjahr ); Var I :0..33; H :Tmonat; Begin For H:=Jan to Dec Do Begin Writeln(' '); Writeln( Monalis(.H.).Name , Jahrz:5); Write( ' '); For I:=1 to 5 Do Write (' Su Mo Tu We Th Fr Sa' ); Writeln(' Su Mo Tu '); Write(' ':Ord(Monalis(.H.).Anftag)*3+1); For I:=1 To Monalis(.H.).Laenge Do Write(I:3 ); Writeln; Writeln(' '); End; End (* Writemonat *) ; Procedure Println( M1: Tmonat; M2: Tmonat; M3: Tmonat); Var I, J,K : Integer; M1s,M2s,M3s: Integer; C1,C2,C3 : Integer; Cycle : Integer; Begin I:=1; J:=1; K:=1; M1s:=Ord(Monalis(.M1.).anftag); M2s:=Ord(Monalis(.M2.).anftag); M3s:=Ord(Monalis(.M3.).anftag); C1:=M1s; C2:=M2s; C3:=M3s; Writeln(Out,' '); Writeln(Out, ' Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa'); Writeln(Out); For Cycle :=1 to 6 Do Begin If M1s <> 0 Then Write(Out,' ':M1s*3); While (7*Cycle-C1 >0) Do Begin If I<= Monalis(.M1.).Laenge Then Write(Out,I:3) Else Write(Out,' '); I:=I+1; C1:=C1+1; End; Write(Out,' ':5+3*(7*Cycle-C1)); If M2s <> 0 Then Write(Out,' ':M2s*3); While (7*Cycle-C2 >0) Do Begin If J<= Monalis(.M2.).Laenge Then Write(Out,J:3) Else Write(Out,' '); J:=J+1; C2:=C2+1; End; Write(Out,' ':5+3*(7*Cycle-C2)); If M3s <> 0 Then Write(Out,' ':M3s*3); While (7*Cycle-C3 >0) Do Begin If K<= Monalis(.M3.).Laenge Then Write(Out,K:3) Else Write(Out,' '); K:=K+1; C3:=C3+1; End; M1s:=0; M2s:=0; M3s:=0; Writeln(Out,' '); End; Writeln(Out,' '); End; Begin Reset('CON:' , Cono); Rewrite('B:CALENDER.TXT',Out); Writeln(' CALENDER Started '); Writeln(' Input first-year for Calender creation e.g 1982'); Vorspann ; Readln; Read ( Jahrx); Writeln(' Input the end-year for Calender creation '); Read (Jahry ); For J:= Jahrx to Jahry Do Begin Initjahr(J); Writeln(Out,' ',J:4); Writeln(Out,' '); Writeln(Out, ' January February Marcʾ6#6>!)*&P ~"::H:H:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:ʾ6#6>!)*&P ~"::H:H:H:H"!6!4:_jYO j .