きむきむ暦 by きむきむ

再生

 月単位のカレンダーを表示するミニユーティリティー。
 操作は十字ボタン左右で月・LRボタンで年の移動だ。
 このプログラムのポイントは、曜日を割り出す方法。「ツェラーの公式」がその秘密だが、くわしくはCHECK POiNTコーナーを見てみよう。

私が作りました

きむきむ
作者サイト

きむきむ暦などを作って公開してます。
BASICはMZ-80Kからの長ーい付き合いです。


 CHECK POiNT 

博士
ツェラーの公式を使ったカレンダーじゃな。日付を使うプログラムの基本じゃのう。

ワンパク
ガッデム! リンク先を見たところでかけらも意味がわからねェぜ!

インテリ
詳しい話はおいておくと、「『(年)+(年÷4)−(年÷100)+(年÷400)+((13×月+8)÷5)+(日)』を7で割ったときのあまり」が0なら日曜、1なら月曜、2なら火曜……で始まるという公式だよ。

神崎
48行以降でその公式をあてはめているんだね。

博士
最後の「7で割ったときのあまり」を出すために、F-FLOOR(F/7)*7という計算をしているのがポイントじゃな。

ワンパク
それはそれで割り算のあまりを出すための方法ってことか?

インテリ
ほかには「」を使う方法もあるね。A=B%3で、変数Aに「Bを3で割った余り」が入るしくみだよ。BASICではあんまり見ない仕様なんだけど……

博士
ウォッホン! うるう年の求め方は「『年÷4』で割り切れたならうるう年、しかし『年÷100』でも割り切れるならうるう年ではない、が『年÷400』でも割り切れればやっぱりうるう年」というグレゴリオ歴の法則にのっとっておる。ここでもFLOORが活躍しておるな。

プログラムリスト

  1. VISIBLE 1,1,0,0,0,0
  2. CLS:CLEAR:COLOR 0
  3. DATA ”Sun”,”Mon”,”Tue”,”Wed”
  4. DATA ”Thu”,”Fri”,”Sat”
  5. DIM D$(50)
  6. FOR I=0 TO 6:READ D$(I):NEXT
  7. FOR I=7 TO 49:D$(I)=””:NEXT
  8. DTREAD(DATE$),Y,M,D
  9. D=1:GOSUB @ZERRER
  10. GOSUB @LONG
  11. GOSUB @DISP
  12. @LOOP
  13. P=BUTTON()
  14. IF P==4 THEN M=M-1:GOTO @W
  15. IF P==8 THEN M=M+1:GOTO @W
  16. IF P==256 THEN Y=Y-1:GOTO @W
  17. IF P==512 THEN Y=Y+1:GOTO @W
  18. GOTO @LOOP
  19. @W
  20. COLOR 0
  21. IF M<1 THEN M=12:Y=Y-1
  22. IF M>12 THEN M=1:Y=Y+1
  23. D=1:GOSUB @ZERRER
  24. FOR I=7 TO 49:D$(I)=””:NEXT
  25. VSYNC 10
  26. GOSUB @DISP
  27. GOTO @LOOP
  28. @DISP
  29. CLS
  30. ? ”キムキム コヨミ ”;Y;” ”;M
  31. FOR I=1 TO L
  32. D$(I+G+6)=STR$(I):NEXT
  33. COLOR 13:FOR I=0 TO 6
  34. LOCATE 0,3+I*2:? D$(I*7)
  35. NEXT
  36. COLOR 0
  37. FOR J=1 TO 5
  38. FOR I=0 TO 6
  39. LOCATE J*4,3+I*2:? D$(I*7+J)
  40. NEXT
  41. NEXT
  42. COLOR 9:FOR I=0 TO 6
  43. LOCATE 24,3+I*2:? D$(I*7+6)
  44. NEXT
  45. RETURN
  46. @ZERRER
  47. ’G=0:SUN,1:MON,2:TUE..7:SAT
  48. A=Y+FLOOR(Y/4)
  49. B=FLOOR(Y/100)
  50. C=FLOOR(Y/400)
  51. E=FLOOR((13*M+8)/5)
  52. F=A-B+C+E+D:G=F-FLOOR(F/7)*7
  53. RETURN
  54. @LONG
  55. R=M-FLOOR(M/2)*2
  56. IF M<8 THEN L=30+R
  57. IF M>7 THEN L=31-R
  58. IF M==2 THEN GOSUB @URU
  59. RETURN
  60. @URU
  61. L=28:R=Y-FLOOR(Y/4)
  62. IF R==0 THEN L=29
  63. R=Y-FLOOR(Y/100)
  64. IF R==0 THEN L=28
  65. R=Y-FLOOR(Y/400)
  66. IF R==0 THEN L=29
  67. RETURN