• ベストアンサー

曜日を求めるプログラムはどうやるの?

ただいま、C言語に苦戦中です。教えてください 2001年の月日の入力データから、曜日を求めるプログラム。 (実行結果例) 月を入力してください: 9↓ 日を入力して下さい : 15↓ 9月15日は土曜日です。

質問者が選んだベストアンサー

  • ベストアンサー
  • arthur
  • ベストアンサー率34% (15/43)
回答No.2

またまたarthurです。 1月~12月までの各月の日数を12コの配列に入れ、 1月から入力してもらった月の1つ前の月までの日数を合計します。 例)9月と入力された場合 1月の日数(31日)+2月の日数(28日)+・・・+8月の日数(31日) さらに入力された日にち分を加算します。 例)15日と入力された場合 1月~8月の合計日数+15日 その合計の値をさらに7(1週間=7日)で割ります。 7で割った余りの数字によって曜日を割り当てます。 1月1日(月)が最初なので、余りが1の時月曜日とすると、余りが2の時は・・・ と、まぁ、ヒントはここまでです^^; 後は自分の力でがんばってください。

noname#1519
質問者

お礼

ヒントありがとうございます。只今製作中です。しかしエラーが多くなかなか進みませんがarturさんのおかげで ずいぶん進むことができました。

その他の回答 (4)

  • kazubon-X
  • ベストアンサー率25% (5/20)
回答No.5

月と日だけではわかりませんので、年(西暦)も入力できるようにして 以下のURLを見てください。 EXCELで確認したところ完璧でした。

参考URL:
http://www.top.or.jp/~cpop/sitiyo.htm
noname#1519
質問者

お礼

ホームページ参考にさせていただきました!

  • arata
  • ベストアンサー率49% (139/279)
回答No.4

宿題の回答としては、 1.ある基準日(例えば1900/01/01)の曜日を調べておいて、その日から何日たっているかを閏年も考慮して計算して、7で割って計算する。 2.Zellerの公式を利用する。 の2つがあります。 演習問題としては、1が正しいアプローチのような気がしますが、Zellerの公式も紹介しておきます。 式は下記のようになります。intは、小数点以下切り捨てmodは剰余を求めます。 ( [日] + int( ( [月] + 1 ) * 26 / 10 ) + [年の下2桁] + int([年の下2桁]/4) + int([年の上2桁]/4) - 2*[年の上2桁] ) mod 7 ※但し[月]が1月,2月の場合は「前年の13月、14月」として計算します。 むかし、むかし買ったPascalの自習書に乗っていました。 そうそう、Zellerの公式の結果は、土曜日が0になります。

noname#1519
質問者

お礼

7で割るやり方でやってみます(^o^)。これで完成に近づきそうです。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.3

【ヒント】 time.h関連を探してみましょう。 課題は極力自力で調査しましょう!

noname#1519
質問者

お礼

そのとおりです。皆さんにいただいたヒントを元に、だいぶ進みました、あと1歩というところです。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

あまり良い方法とは思っていませんが私は次のような方法を使っています。 これはWindowsでしか使えないのでご了承あれ。 SYSTEMTIME構造体の年、月、日その他もろもろを、代入ます。 それでSystemTimeToFileTime関数に渡してFILETIMEに変換します。 そのとき、曜日を指定してあっても無視されます。 得られたFILETIMEをFileTimeToSystemTime関数に渡して、再度SYSTEMTIMEに変換すれば、正しい曜日が入っていると言うわけです。 詳しくはSystemTimeToFileTime関数とFileTimeToSystemTime関数のヘルプを見ましょう。

noname#1519
質問者

お礼

細かく書いてくださりありがとうございます。なんだかとても高度なものに思われますが、ヘルプを参照してみます。

関連するQ&A