• 締切済み

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); }

みんなの回答

回答No.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; }

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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 が返ります。

dasuthin
質問者

補足

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

回答No.2

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

回答No.1

閏年判定しましょう。 閏年とは、  ・西暦の年が4で割り切れる年  ・ただし、年が100で割り切れて、かつ、400で割り切れない場合はうるう年ではない。 なのです。 この条件で、「がんばって自分でロジック組むぞ!」と 思ったら、是非がんばってください。 (その方が上達しますよ~。) もう十分がんばったんで、ちょっとズルしたかったら 下のURLを参考にしてください(^-^; うまく動くといいですね。

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

お礼

すいませんできました。自力でー単純な関数でできるんですね。ありがとうございました。 #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); }

関連するQ&A

専門家に質問してみよう