- ベストアンサー
F-BASIC ツェラーの公式 年月を入力してカレンダー表示
F-BASICの下記の問題がどうしても分からなくて困っています。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ツェラーの公式を使い、年と月を入力すればその月のカレンダーを以下の例のように表示するプログラムを作成せよ。ただし、ツェラーの公式は次のように与えられる。西暦年、月、曜日を y%,m%,d% とすると (y%+y%\4-y%\100+y%\400+(13*m%+8)\5+d%)MOD 7 ただし、m%<=2 のときは上の式で y%=y%-1,m%=m%+12 とおく。 この結果、0なら日曜、1なら月曜・・・、6なら土曜となる。 例 2003年6月 1 日 2 月 3 火 4 水 5 木 ・ ・ ・ ・ 28 土 29 日 30 月 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 一週間悩んだのですが、分かりませんでした。 どうかよろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>たてに全部表示したいのですが 1日から月末日まで 1 火 2 水 ・・ ・・ 31 木 のように画面に出したいと言うことだと思いますが そうなりませんか。掲出のプログラムのロジック上はそうなると思いますが。 >半分で切れてしまいます。 半分で切れるとは? ----- 横にならべては。 '----月前半 for i=1 to 15 print i;" ";week$((K-i+1)mod 7); next i print '----月後半 for i=16 to days(M) print i;" ";week$((K-i+1)mod 7); next i print
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17070)
#3です。補足に対して。 >F-BASICでどうしても作らないといけないのです だから、#3のVBAは旧DOS-BASICで書いたようなものですから、Cells()の行をPrint文に置きかえれば、どんなBASICでも動くはずです。 Cellsを除くと、Int、Mod,ForNextしか使ってないじゃないですか。 一応のロジックを紹介するために載せました。 (1)月末対応と(2)1,2月対応が入れてないので 、そっくりそのまま使えなくて申し訳ないですが、その点はお出来になると言うことでよろしく。
- imogasi
- ベストアンサー率27% (4737/17070)
サイトを参考にして作りました。 F-Basicが私にはなくて、エクセルVBAでやりました。 ツェラーの公式は完全には理解で来てないのですが 4年1回100年1回400年1回のグレゴリオ歴修正 が入っていることは判ります。 コーディングのご参考になれば幸いです。2003年 6,7,8月はあっています。 Sub test02() y = 2003 ' 2003 m = 8 '6 '------ c = Int(y / 100) y = y - c * 100 w1 = Int(c / 4) w2 = -2 * c w3 = Int(y / 4) w4 = y w5 = Int((26 * m + 16) / 10) + 14 '------ For d = 1 To 31 w6 = d Cells(d, "A") = d Cells(d, "B") = (w1 + w2 + w3 + w4 + w5 + w6) Mod 7 Next d End Sub Cells(・・)のところ2箇所はPrint文で置換えて見てください。 1,2月の13,14月にする部分は組み入れていません。月末日対応もしていません。For d=1 to 31 の部分。 http://www.mogami-wire.co.jp/unix/isholiday.html と http://cluster.f7.ems.okayama-u.ac.jp/~t2/textinf/calendar.htmlを参考にしましたが 後者の式(誤り)を修正しました。w5の+14も私が入れました。
お礼
ごめんなさい、F-BASICでどうしても作らないといけないのです・・・。 エクセルVBAがどんなものなのか知らないのですが 私なんかのために時間を割いてくださり、どうも ありがとうございました。感謝します。
- ymmasayan
- ベストアンサー率30% (2593/8599)
No.1のymmasayanです。 >>年、月、日 ですよね。 >いえ、入力するのは年と月だけなのです。 >年と月だけ入力してその年のその月の >カレンダー表示をするプログラムなんです。 問題で入力するのは年月ですが、ツェラーの公式には年月日が必要です。 だから日=1をプログラムで入れてやるのです。 >閏年や、月によって日数が違う時には >どうすればよいのでしょうか? これは自分で月の日数を決めてやるしかありません。 大の月、小の月、2月の3つに分けた処理をします。 うるう年については (1)西暦が400の倍数なら閏年。 (2)西暦が4で割リ切れて100で割リ切れなければ閏年。 ということから2月の日数が決まります。 注意して欲しいのはツェラーの公式の但し書きです。 「ただし、m%<=2 のときは上の式でy%=y%-1,m%=m%+12 とおく。」 これはツェラーの式の計算前に実行する必要があります。 少しだけ添削しておきます。 input "年";y% input "月";m% ここで日付けd%に1代入。 ここで但し書き実行・・IF文 N=y%+y%\4-y%\100+y%\400+(13*m%+8)\5+d%)MOD 7 ここで閏年の判定 ここでその月の日数の決定(S) ここでループをまわす.(For i=1to S) J=(N-1+I) MOD 7 Jを日本語の曜日に変換(表示) NEXT I end
補足
添削してくださり、ありがとうございました。 ですが、BASIC初心者の私には難しく お恥ずかしながら、ヒントを頂いてもほとんど 分かりませんでした。 差し出がましいお願いなのですが、全部作ってくださると大変うれしいです。 よろしくお願いします。
- ymmasayan
- ベストアンサー率30% (2593/8599)
ヒントだけ。 >西暦年、月、曜日を y%,m%,d% とすると 年、月、日 ですよね。 2003年6月なら2003年6月1日を式で計算します。結果をNとします。 1日から30日までの日付をIとするとIに対する曜日(数字)Jは J=(N-1+I) MOD 7となります。 あとはJで曜日テーブルを引けばいいでしょう。 曜日テーブルは0~6が日曜~土曜に対応するものです。
補足
>年、月、日 ですよね。 いえ、入力するのは年と月だけなのです。 年と月だけ入力してその年のその月の カレンダー表示をするプログラムなんです。 お答えくださってありがとうございます。 しかし、私の能力不足で分かりません。 閏年や、月によって日数が違う時には どうすればよいのでしょうか? ↓できるところまで作ってみました。 よろしくお願いいたします。 input "年";y% input "月";m% y%+y%\4-y%\100+y%\400+(13*m%+8)\5+d%)MOD 7 (この間分かりません) d$=input$(1) end
補足
遅くなってしまい申し訳ありません。 あれから教えていただいたのを参考に 自分なりにやってみました。 ですがどうもうまくいきません。 たてに全部表示したいのですが、半分で切れて しまいます。そこで、スペースキーなどを 押して前半部分、後半部分を表示したいのですが どうすればよいでしょうか? 以下、imogasiさんのを参考にして 自分なりに考えたものです。 var Y as integer var M as integer var D as integer var K as integer var CURX as integer var cury as integer dim days(12) AS INTEGER for I=1 TO 12 read days(I) next I data 31,28,31,39,31,30,31,31,30,31,30,31 dim weeks(6) weeks$(0)="日" weeks$(1)="月" weeks$(2)="火" weeks$(3)="水" weeks$(4)="木" weeks$(5)="金" weeks$(6)="土" input "西暦年、月";Y,M if Y mod 4=0 and Y mod 100>0 or Y mod 400=0 then DAYS(2)=29 endif D=1 if M<3 then Y=Y-1 M=M+12 endif K=(Y+Y¥4-Y¥100+Y¥400+(13*M+8)¥5+D) mod 7 for i=1 to days(M) print i;week$((K-i+1)mod 7) next i DUMMY$=input$(1) end