電子書籍の厳選無料作品が豊富!

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 月

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一週間悩んだのですが、分かりませんでした。
どうかよろしくお願いいたします。

A 回答 (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
    • good
    • 0

#3です。

補足に対して。
>F-BASICでどうしても作らないといけないのです
だから、#3のVBAは旧DOS-BASICで書いたようなものですから、Cells()の行をPrint文に置きかえれば、どんなBASICでも動くはずです。
Cellsを除くと、Int、Mod,ForNextしか使ってないじゃないですか。
一応のロジックを紹介するために載せました。
(1)月末対応と(2)1,2月対応が入れてないので
、そっくりそのまま使えなくて申し訳ないですが、その点はお出来になると言うことでよろしく。

この回答への補足

遅くなってしまい申し訳ありません。
あれから教えていただいたのを参考に
自分なりにやってみました。
ですがどうもうまくいきません。
たてに全部表示したいのですが、半分で切れて
しまいます。そこで、スペースキーなどを
押して前半部分、後半部分を表示したいのですが
どうすればよいでしょうか?

以下、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

補足日時:2003/07/12 21:12
    • good
    • 2

サイトを参考にして作りました。


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/textin …を参考にしましたが
後者の式(誤り)を修正しました。w5の+14も私が入れました。
    • good
    • 0
この回答へのお礼

ごめんなさい、F-BASICでどうしても作らないといけないのです・・・。
エクセルVBAがどんなものなのか知らないのですが
私なんかのために時間を割いてくださり、どうも
ありがとうございました。感謝します。

お礼日時:2003/06/29 14:36

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初心者の私には難しく
お恥ずかしながら、ヒントを頂いてもほとんど
分かりませんでした。
差し出がましいお願いなのですが、全部作ってくださると大変うれしいです。
よろしくお願いします。

補足日時:2003/06/29 14:32
    • good
    • 0

ヒントだけ。



>西暦年、月、曜日を 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

補足日時:2003/06/27 23:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!