こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

c言語初心者です。ついに。。

西暦月日にちを入れると何曜日かを表示できるプラグラムをつくれましたー。まだif switch do while文しかしらないけど、switch文だけでできました。でも欠点があってうるう年の1月と2月はうまくできなんです。原因わわかっていてさいごの式bに-1をしなければいけないのですがそのうるう年だけ-1という計算をどうすればできるのかが思いつきません。もし詳しい人がいたら教えてくださいーー。
#include <stdio.h>

int main(void)
{
int y, m, l, z,v,h,q,f,x,o,j,e,a,r,b;


printf("西暦何年何月か入力してください\n");
printf("西暦。:"); scanf("%d",&y);
printf("何月。:"); scanf("%d",&m);
printf("何日。:"); scanf("%d",&l);

z=y%400;
v=y%100;
h=z-v;
f=h/100;
switch(f) {
case 3 : q=0; break;
case 1 : q=4; break;
case 2 : q=2; break;
case 0 : q=6; break;
}

o=y%100;
j=o/4;
e=o+j;

a=m;
switch(a) {
case 1 : r=0; break;
case 2 : r=3; break;
case 3 : r=3; break;
case 4 : r=6; break;
case 5 : r=1; break;
case 6 : r=4; break;
case 7 : r=6; break;
case 8 : r=2; break;
case 9 : r=5; break;
case 10 : r=0; break;
case 11 : r=3; break;
case 12 : r=5; break;
}

b=q+e+r+l;
switch (b % 7){
case 0 : puts("日曜日です。"); break;
case 1 : puts("月曜日です。"); break;
case 2 : puts("火曜日です。"); break;
case 3 : puts("水曜日です。"); break;
case 4 : puts("木曜日です。"); break;
case 5 : puts("金曜日です。"); break;
case 6 : puts("土曜日です。"); break;
}

return (0);
}

投稿日時 - 2006-12-20 17:00:18

QNo.2614771

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

変数名には分かりやすい名前をつけましょう。
各処理にはコメントをつけて後から見ても分かるようにしましょう。

同じようなプログラム以前作りました(面白かったです)。

ちなみにうるう年を計算する関数を書いてみます。

// うるう年計算関数
// 返り値 TRUE:うるう年でない、FALSE:うるう年
// 引数  YearNum:うるう年か計算したい年
BOOL LeapYearJudge( int YearNum )
{
int LeapYearJudgeFlag;// うるう年判定フラグ

// 400年に1回はうるう年
if( YearNum % 400 == 0 )
{
// うるう年なのでFALSEを返す
return FALSE;
}
// 100年に1回はうるう年でない
if( YearNum % 100 == 0 )
{
// うるう年でないのでTRUEを返す
return TRUE;
}
// 4年に一度はうるう年
if( YearNum % 4 == 0 )
{
// うるう年なのでFALSEを返す
return FALSE;
}
// 残りはうるう年でない
return TRUE;
}

投稿日時 - 2006-12-27 22:04:56

ANo.3

★閏年について
(1)4で割れる年をうるう年とする
(2)ただし、100で割れる年は平年にする
(3)ただし、400で割れる年は閏年とする
(4)以上。サンプル関数を紹介。

/* 西暦から閏年の判定 */
static BOOL FuncIsLeapYear( INT nYear )
{
 if ( !(nYear % 4) && (nYear % 100) ){
  return( TRUE ); ←閏年
 }
 if ( !(nYear % 400) ){
  return( TRUE ); ←閏年
 }
 return( FALSE ); ←平年
}

補足:
・私がカレンダー・ソフトを作成したときに、実際に利用している関数です。
・nYear に西暦を入れると閏年なら TRUE が返され、平年は FALSE が返ります。

投稿日時 - 2006-12-20 17:18:06

補足

そのやりかた大変参考になりました。本当にありがとうございました。

投稿日時 - 2006-12-26 22:56:33

ANo.2

ツェラーの公式で調べてみましょう。

投稿日時 - 2006-12-20 17:17:42

ANo.1

閏年判定しましょう。
閏年とは、
 ・西暦の年が4で割り切れる年
 ・ただし、年が100で割り切れて、かつ、400で割り切れない場合はうるう年ではない。
なのです。

この条件で、「がんばって自分でロジック組むぞ!」と
思ったら、是非がんばってください。
(その方が上達しますよ~。)

もう十分がんばったんで、ちょっとズルしたかったら
下のURLを参考にしてください(^-^;

うまく動くといいですね。

参考URL:http://katsura-kotonoha.sakura.ne.jp/prog/c/tip00004.shtml

投稿日時 - 2006-12-20 17:14:14

お礼

すいませんできました。自力でー単純な関数でできるんですね。ありがとうございました。
#include <stdio.h>

int main(void)
{
int y, m, l, z,v,h,q,f,x,o,j,e,a,r,b,t,p,i,aa,bb,cc,dd;

do{
printf("西暦何年何月か入力してください\n");
printf("西暦。:"); scanf("%d",&y);
printf("何月。:"); scanf("%d",&m);
printf("何日。:"); scanf("%d",&l);

aa=y%100;
t=y-aa;
t=t%400;
p=y%4;
if (t==0 && p==0)
i=-1;
else i=0;


z=y%400;
v=y%100;
h=z-v;
f=h/100;
switch(f) {
case 3 : q=0; break;
case 1 : q=4; break;
case 2 : q=2; break;
case 0 : q=6; break;
}

o=y%100;
j=o/4;
e=o+j;

a=m;
switch(a) {
case 1 : r=0; break;
case 2 : r=3; break;
case 3 : r=3; break;
case 4 : r=6; break;
case 5 : r=1; break;
case 6 : r=4; break;
case 7 : r=6; break;
case 8 : r=2; break;
case 9 : r=5; break;
case 10 : r=0; break;
case 11 : r=3; break;
case 12 : r=5; break;
}

b=q+e+r+l+i ;
switch (b % 7){
case 0 : cc=0; break;
case 1 : cc=1; break;
case 2 : cc=2; break;
case 3 : cc=3; break;
case 4 : cc=4; break;
case 5 : cc=5; break;
case 6 : cc=6; break;
}


puts("何曜日でしょう?");
puts("数字を入れてください");
puts("日曜 0 月曜 1 火曜 2 水曜 3 木曜 4 金曜 5 土曜 6 を入力");

do {

scanf("%d",&bb);
if(bb!=cc)
puts("\a違いますよ。");
}while(bb!=cc);
puts("当たりです。おめでとう。");
puts("もう一度やりますか? やる1 やらない0を入力");

scanf("%d",&dd);
}while(dd==1);





return (0);
}

投稿日時 - 2006-12-26 22:54:16

あなたにオススメの質問