(***** PL/T による カレンダー ****** (* HAPPy Version 0.3添付のサンプルプログラムをPL/Tで書き直したもの。 表示させたい年と月を入力すると、 その月の前後1ケ月ずつ、合計3ケ月にわたってカレンダーを表示します。 *) const (before,now,after) ; (* 前月 今月 来月 *) var Nissu [13] ; (* 月の日数を格納 添字0は未使用 *) Year [3] ; (* 表示する年を格納 *) Month [3] ; (* 表示する月を格納 *) FirstYoubi[3] ; (* 1日の曜日 *) (***************************************) (* 初期設定 (各月の日数を設定) *) (* とりあえず 2月は28日としておく *) (***************************************) procedure init ; begin Nissu[ 1] := 31 ; Nissu[ 2] := 28 ; Nissu[ 3] := 31 ; Nissu[ 4] := 30 ; Nissu[ 5] := 31 ; Nissu[ 6] := 30 ; Nissu[ 7] := 31 ; Nissu[ 8] := 31 ; Nissu[ 9] := 30 ; Nissu[10] := 31 ; Nissu[11] := 30 ; Nissu[12] := 31 end ; (***************************************) (* 曜日を計算するツェラー(Zeller)の式 *) (***************************************) function Youbi(y,m,d) ; begin if m<=2 then begin y := y-1; m := m+12 end; return (y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7 end ; (***************************************) (* year年が閏年の時、真を返す関数 *) (* 4年に一度だが、、100年に一度閏年で *) (* なく、400年に一度閏年になります *) (***************************************) function Uruu(year) ; begin return(year % 4 = 0) * (year % 100 <> 0) + (year % 400 = 0) end ; (***************************************) (* カレンダーの表示処理 *) (***************************************) procedure Print ; var Day[3] ; (* 表示する日 *) Finish[3] ; (* 各月の表示が終わったら真 *) youbi ; n ; begin for n := before to after do (* 初期設定 *) begin Finish[n] := 0 ; Day [n] := 1 end ; writeln ; (* カレンダーの表題 *) for n := before to after do write('****':9,Year[n]:5,'年',Month[n]:2,'月 ****') ; writeln ; for n := before to after do write('日 月 火 水 木 金 土':25) ; writeln ; repeat for n := before to after do (* 前月 今月 来月の 1行分 *) begin write(' ':4) ; (* 次の月のカラムまで進める *) for youbi := 0 to 6 do (* 各月の1週間分 *) begin if (Day[n] = 1) * (youbi < FirstYoubi[n]) + Finish[n] then write(' ':3) else (* 表示していない日の時 *) begin write(Day[n]:3) ; Day[n] := Day[n] + 1 ; Finish[n] := Day[n] > Nissu[Month[n]] (* その月の終わりの判定 *) end end end ; writeln until Finish[before] * Finish[now] * Finish[after] end ; (***************************************) (* メイン処理 *) (***************************************) begin (*main*) init ; (* 初期設定 *) repeat (* 表示したい年を入力 *) write('何年?(西暦2年〜9998年) ') ; read(Year[now]) until (2 <= Year[now]) * (Year[now] <= 9998) ; (* 2〜9998年に深い意味はありません *) repeat (* 表示したい月を入力 *) write('何月?(1月〜12月) ') ; read(Month[now]) until (1<=Month[now]) * (Month[now] <= 12) ; if Uruu(Year[now]) then Nissu[2] := 29 ; (* 閏年補正 *) (* 表示する年、月を求める *) Month[before] := Month[now] - 1 ; Month[after ] := Month[now] + 1 ; Year [before] := Year [now] ; Year [after ] := Year [now] ; if Month[now] = 1 then (* 今月が1月の時は、*) begin (* 前月は去年の12月 *) Month[before] := 12 ; Year [before] := Year[now] - 1 end else if Month[now] = 12 then (* 今月が12月の時は、*) begin (* 来月は来年の1月 *) Month[after] := 1 ; Year [after] := Year[now] + 1 end ; (* 1日の曜日を求める *) FirstYoubi[before] := Youbi(Year[before], Month[before], 1) ; FirstYoubi[now ] := Youbi(Year[now ], Month[now ], 1) ; FirstYoubi[after ] := Youbi(Year[after ], Month[after ], 1) ; Print (* 表示する *) end.