回答箱 No.131-4: 指定した年の「成人の日」を求める

       ◆ 質問箱 No.131 質問者:  木村 芳樹  2002年02月 241号 P.22
           ◆ 質問箱 目次へ
No.131-4   指定した年の「成人の日」を求める 回答者
  高橋 周助
2002年05月
244号 P.30
 前回の回答箱の拡張版を発表します。
 成人の日に限らず、「?月の第?回目の?曜日は」に対して、日付を計算します。
    (例1) 今年の総会は、12月第1土曜日のはずだ。 → 7日
    (例2) 来年の合宿例会は、5月第4土曜日したい。 → 24日

<成人の日拡張版>
      CLOSE;  DISP OPEN;
/******* A.条件入力 ******************************************************/
$始め:DISP CLR;
      DISP  [20, 3],"==西暦a年b月の第c回目のd曜日は 何日かを算出します==";
      DISP  [20, 4],"         (例)  成人の日は   b=1,c=2,d=月曜日";
$年:  DISP  [20, 7],"    a.西暦年を4桁で指定してください。";
      INPUT [20, 8],"                 (終了は 0)       → ",Z10,U(NNNN);
        IF Z10=0 THEN GOTO $終了;
$月:  INPUT [20, 9],"    b.月を 1〜2桁で指定してください。→ ",Z11,U(NN);
        IF Z11<1 OR 12<Z11 THEN GOTO $月;
$回:  INPUT [20,10],"    c.第?何回目 (5以下)             → ",X12,U(N);
        IF X12<1 OR 5<X12 THEN GOTO $回;
$曜日:SELECT [20,11],"d.曜日指定",X13,"日","月","火","水","木","金","土";
        LET V13=KMID$("日月火水木金土",X13,1);  /*曜日_文字表現  */
        LET X13=X13-1;                          /*曜日_日曜日が0*/
      DISP  [20,11],"    d.指定された曜日は: ",V13,"曜日";
/******* B.計算 *********************************************************/
$計算:LET X22=INTG(DATENUM(Z10*10000+Z11*100+1) MOD 7);
      LET X23=(-X22+X13+1)+(X22-X13+6)/7*7+(X12-1)*7;
$判定:LET Z01=Z10*10000+Z11*100+DCML(X23);
      LET Z02=DATENUM(Z01);
        IF ERR(0)=0 THEN GOTO $結果;
        DISP [20,14],"指定された日は、存在しません。";
        GOTO $再試;
/******* C.結果表示 *****************************************************/
$結果:DISP  [20,14], Z10,"年",Z11,"月の第",X12,V13,"曜日は";
      DISP  [20,15],"      【 ",X23," 日 】";
      DISP  [20,16],"です。";
/******* Z.終了 *********************************************************/
$再試:INPUT [20,20],"終了:0   再度計算:1 →   ",V01,U(N);
        IF V01="0" THEN GOTO $終了;
        IF V01="1" THEN GOTO $始め ELSE GOTO $再試;
$終了:CLOSE;  STOP;
  
回答箱のプログラムがプログラム集に収録されています。


このページのTOPへ戻る