No.37-3 |
カレンダーを作りたい |
回答者 入川 精二 |
1996年12月 179号 P.40 |
◆ No.37(1996年 10月号)の回答-3(再び自問自答)
カレンダーの要件は日付と曜日です。
<日 付>
日付は月により日数が異なるし、閏年は2月が1日多いので、記憶に頼るのは危険もあります。最も確実な方法は、コンピュータの持っている暦を使うことです。
(コンピュータの暦は狂っていない事が前提です)
The PIPSでは、列属性として[数値-日付]というのがあって、これを設定しておくことにより日付の加減乗除などの計算が簡単にできます。
頁横桁数を36桁にすると、使える行数がThe PIPSでは398行(表のデータ行として394行)、4Gでは394行(390行)ですから、1年分の日付を1列に書き込むには十分です。
The PIPSでは、日付属性を設定した8桁の列に空白行を365行作っておき(プログラム 8〜11行)、指令 NUM を使って初期値 YYYY0101 、ステップ 1 とすると12ヵ月365日分のカレンダーが出来ます(プログラム 12〜13行)。もし、閏年なら最終値が・・・・1230 になりますから、1行足して @N を入力すると ・・・・1231 を書き込んでくれます(プログラム 14〜15行)。
[4Gでは「DATE関数」を使って日付の表を作ることが出来ます]
<曜 日>
曜日は7日周期で繰り返します(当り前ダ)西暦1年1月1日は月曜日ということになっているので、日付連番を7で割った余りに1をプラスすると1〜7の数字が日〜土に対応していることになります。
前記の日付属性を設定した列の日付は、実は計算対象としたときは日付連番に置き変わるので、この計算をすると結果は1〜7の繰り返し数列になります(プログラム 16行)。
1〜7の数字を曜日に変換するのは、高橋周助氏の方法(KMID$ を使う)を拝借しました(プログラム 17〜19行)。
<月 別 表 >
1頁に1年分のカレンダーが出来上がったところで、表の形を整え、年月日を別の列に分割します(プログラム 20〜26行)。
1ヵ月1頁の表に切り分けるのは指令"GROUP"を使えば簡単です(プログラム 27行)。頁タイトルを付け直すには指令"APR"を使うとあっという間に済みます(プログラム 28〜32行)。多目的に使うには頁の横桁数が36桁ではどうにもならないので、180桁にしておきます(プログラム 33行)。
これで基本的なカレンダーの出来上りです。
【プログラム】
1 <CALENDER>
【 Ver.01 Rev.06 961012 】
2 /* 指定した年の1年分のカレンダーを作る */
3 $年: ACCEPT ";何年のカレンダー?
(西暦:YYYY)";,X1;
4 IF ERR(0)=55 THEN STOP;
LET V1=NUM$(X1);
5 IF LEN(V1)<>4 THEN GOTO $年
/* 4桁必要 */
6 IF NAME(3,"カレンダー"+V1)=0 THEN GOTO $年表;
7 BIND;D;カレンダー%V1;Y;
/* 同じ名前のバインダーは削除しておく */
8 $年表: SET/N/C;M;M;3; ;4;1;;Y;S;M;1;36;;Y;ESC;
/* 日付区切記号ナシ・36桁 */
9 O;カレンダー%V1;8/3;DATE;曜;;ESC;
10 IR;S;4;365;
/* 365日分のデータ行確保 */
11 ATR;N;D;@DATE;
/* DATE の列に日付属性 */
12 LET V11=V1+";0101";;
/* 指定年の1月1日 */
13 NUM;M;C;@DATE;H;%V11;1;
/* 一気に日付を書き込む */
14 IF RIGHT$([T,@DATE ],5)=";1231";
THEN GOTO $曜日;
15 MT;@N;ESC;
/* 閏年は1行追加 */
16 $曜: CAL;@DATE MOD7+1=C2;
/* 日付÷7 の余り+1 */
17 FOR X2=H TO T;
/* 曜日に書き換える */
18 LET [X2,@曜 ]=KMID$("日月火水木金土",IVAL([X2,@曜 ]),1);
19 NEXT;
20 NF;S;@DATE;4/2/2;
/* DATE の列を分割 */
21 DC;1;Y;
/* 年 の列は削除 */
22 W;2;;月;日;ESC;
23 CF;@;4;
/* 日 の列を4桁にする*/
24 ATR;R;1,2;
/* 日付属性を解除 */
25 CJ/C;N;N;A;@日;A;Z;A;@日;ESC; /* 余分な 0
を削除して全角にする */
26 P;カレンダ%V1;
/* 保存 */
27 $月別表: GROUP;カレンダー%V1;K;@月;;月別カレンダー%V1/D; /* 月別の頁に */
28 ARP/C;
/* タイトルを変更 */
29 FOR X30=1 TO 12;
30
LET V2=FORM$(V1,5)+"年"+FORM$(NUM$(X30),5)+"月";
31 ;N;%X30;%V2;
32 NEXT;ESC;
33 INFO/P;月別カレンダー%V1;月別カレンダー%V1;S;180;Y;
/* 180桁に */
34 CA;月別カレンダー%V1;;2/3;;月別カレンダー%V1;
/* 月 の列を削除 */
35 SET/N;S;M;1;80;;Y;
/* 設定を元に戻しておく */
36 STOP;
|
|
|