昨日今日明日

きのうを思い、きょうを実感し、あすに想いを馳せよう。
若年性或いは老人性痴呆症にならない為にもね?

songzhaoのボケ封じ数学講座第18講

2006年10月11日 | Weblog
 私はこう見えても結構律儀なのである。今回は「songzhaoのボケ封じ数学講座第16講」で勝手に約束した暦に関するプログラムに挑戦したいと思う。

 それでは、我が珠玉の作品をポケコンにプログラミングしてくれたまえ!。イモ兄ちゃんの匂いがするというか手作りの粘土細工の趣がある。

 副題;Padre Gregorius asks”How old are you?”

10 CLEAR:CLS:PRINT”Padre Gregorius asks”,”How old are you?”,
20 PRINT ”<by songzhao>”;
30 Z$=INKEY$:IF Z$=””THEN 30
100 REM***メイン プログラム
110 DIM A$(4),B(3),C$(1),W$(14),M(12)
120 RESTORE 125:FOR J=0 TO 4:READ A$(J):NEXT J
125 DATA セイレキ,メイジ,タイショウ,ショウワ,ヘイセイ
130 B(0)=1867:B(1)=1911:B(2)=1925:B(3)=1988:C$(0)=”タンジョウ”:C$(1)=”ゲンザイ”
140 RESTORE 160:FOR J=1 TO 7:READ W$(J):NEXT J
150 RESTORE 160:FOR J=8 TO 14:READ W$(J):NEXT J
160 DATA SUN.,MON.,TUE.,WED.,THUES.,FRI.,SAT.
170 RESTORE 190:FOR J=1 TO 12:READ M(J):NEXT J
190 DATA 31,28,31,30,31,30,31,31,30,31,30,31
200 Q=0:GOSUB 500:K=J:A=Y:H=Y:B=M:C=D:Q=1:GOSUB 500:L=J:E=Y:I=Y:F=M:G=D
210 IF K<>0 THEN A=A+B(K-1)ELSE Y=A:GOSUB 600:K=R:H=H-B(K-1)
220 IF L<>0 THEN E=E+B(L-1)ELSE Y=E:GOSUB 600:L=R:I=I-B(L-1)
230 GOSUB 700
240 N=E-A:O=F-B:P=G-C:IF O<0 THEN O=O+12:N=N-1
250 GOSUB 800
260 CLS:PRINT”ネンレイ”;N;”サイ”;O;”ツキ ”;P;”ニチ”
270 Z$=INKEY$:IF Z$=””THEN 270 
280 CLS:PRINT C$(0),”(”;A;”)”;LEFT$(A$(K),2);H;B;C
290 PRINT C$(1),”(”;E;”)”;LEFT$(A$(L),2);I;F;G;
300 Z$=INKEY$:IF Z$=””THEN 300 
310 CLS:PRINT”I live for”;DT;”days”,”born on”;W$(WI);”day”;
320 Z$=INKEY$:IF Z$=””THEN 320 ELSE 10
500 REM***データ ニュウリョク ルーチン
510 FOR J=0 TO 4:CLS:PRINT C$(Q),”<yes on Y>”,A$(J)
520 Z$=INKEY$:IF Z$=””THEN 520 ELSE IF Z$=”Y”THEN 540
530 NEXT J:GOTO 510
540 CLS:PRINT A$(J):INPUT”ナンネン ”;Y,”ナンガツ”;M,”ナンニチ ”;D:RETURN
600 REM***ケイスウRケンシュツ ルーチン
610 IF(Y-1868)*(Y-1911)<=0 THEN R=1:GOTO 640
620 IF(Y-1912)*(Y-1925)<=0 THEN R=2:GOTO 640
630 IF(Y-1926)*(Y-1988)<=0 THEN R=3 ELSE R=4
640 RETURN
700 REM***ゲンザイ ノ ヨウビ ニュウリョク ルーチン
710 FOR J=1 TO 7:CLS:PRINT”キョウ ナニヨウビ?”,”<yes on Y>”,W$(J)
720 Z$=INKEY$:IF Z$=””THEN 720 ELSE IF Z$=”Y” THEN 740
730 NEXT J:GOTO 710
740 WW=J:RETURN
800 REM***ニッスウ ケイサン ルーチン
810 DT=0:IF A=E THEN 820 ELSE 870
820 IF FRAC(A/400)<>0 THEN 840 ELSE IF FRAC(A/4)<>0 THEN 840
830 M(2)=29
840 IF B=F THEN 860
850 FOR J=B TO F-1:DT=DT+M(J):NEXT J
860 DT=DT-C+G+1:GOTO 1000
870 IF FRAC(A/400)<>0 THEN 890 ELSE IF FRAC(A/4)<>0 THEN 890
880 M(2)=29
890 FOR J=B TO 12:DT=DT+M(J):NEXT J:M(2)=28
900 IF FRAC(E/400)<>0 THEN 920 ELSE IF FRAC(E/4)<>0 THEN 920
910 M(2)=29
920 IF F=1 THEN 930 ELSE FOR J=1 TO F-1:DT=DT+M(J):NEXT J
930 IF E=A+1 THEN DT=DT-C+G+1:GOTO 1000
940 U=0:FOR J=A+1 TO E-1
950 IF FRAC(J/4)=0 THEN U=U+1
960 IF FRAC(J/400)<>0 THEN U=U-1 
970 NEXT J
980 DT=DT-C+G+1+365*(E-A-1)+U
1000 WT=DT-INT(DT/7)*7
1010 IF WW-WT<0 THEN WW=WW+7
1020 WI=WW-WT+1 
1030 RETURN

 まず、このプログラムをRUNすると

 Padre Gregorius asks How old are you? <by songzhao>という表示が現れる。RETURN キーを押すと、
  
 ウマレ 
 <yes on Y> 
 セイレキ

 という表示に変わります。もし西暦で年数を求めたければ、Yキーを押すと、ナンネン ?と聞いてくるので、1990 リターンとしてみる。すると、ナンガツ?ときいてくるので、3 リターンと打ち込んでみる。すると今度はナンニチ ?ときいてくる。4 リターンとリターンキーを押してみよう。すると、

 ゲンザイ
 <yes on Y>
 セイレキ

 このように表示されます。ここで大切なことは、Yキー以外のキーと押すと、セイレキ・・・メイジ・・・タイショウ・・・ショウワ・・・ヘイセイ・・・セイレキという具合に表示が次々に変わります。ある表示のときYキーを押したところが入力年代の選択肢となります。・・・・同じ要領で、2006年10月1日を入力してください。・・・すると今度は、

 キョウ ナニヨウビ?
 <yes on Y>
 SUN.

 このように表示されます。例によって、Y以外のキーを押して曜日を選択し、Yキーを押すことによって、曜日を決定してください。この日は日曜日であったのでSUN.を選択決定してください。すると、ネンレイ 16サイ 7ツキ -3ニチと表示されます。ここでリターンキーを押します。すると、
 
 ウマレ
 ( 1990)ヘイ 2 3 4
 ゲンザイ
 ( 2006)ヘイ 18 10 1 ・・・という表示に変わります。

 もう一度、リターンキーを押すと、

 I live for 6042 days
 born on SUN.day

 ・・・・ とこのように回答が示されます。いろいろとさまざまに試してみて下さい。私もこのプログラムを検証しないまま表ざたにするのは気が引けるのであるが、まあ正常に機能すると思います。