• ベストアンサー

入力した日は何曜日か

入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします #include<stdio.h> int main() { int iyear,imonths,iday; int sum,i; int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; char*cweek[7] = {"日","月","火","水","木","金","土"}; sum =0; printf ("input (e.g. ****/**/**)\n>>"); scanf ("%d/%d/%d",&iyear,&imonths,&iday); /*閏年の判定*/ for(i=1;i<year;i++){ if((year%4==0)&&((year%100!=0))||(year%400==0)){ sum++; i++; } year--; /*前月までの日数*/ for (i =0; i < imonths-1; i++) { sum += m_array[i]; } year++; sum=sum+day; //曜日の出力 printf("%s曜日",cweek[sum%7]); return 0; } }

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

私も Zeller の公式をお勧めしますが, このプログラムだと「少なくとも閏年の 2月28日までか 3月1日以降かのいずれかはおかしくなる」はずです. 曜日を出力する直前で sum の値を見てみればわかると思いますが, 例えば 2008/2/29 と 2008/3/1 が同じ値になりますね.

noname#53915
質問者

補足

やっぱりsumに問題があるんですかね?

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

お~, よく見たらこのプログラム, いろいろ変だ.... ・最初の for が最後までかかっているので無限ループになってそう. ・year をデクリメントしてからインクリメントしてる (しかもその間で year は使われていない) のはなぜ? ・そもそも sum の値は全く正しくないような気がする. 2009年か 2010年くらいにおかしい感じ.

noname#53915
質問者

お礼

矛盾だらけでした、よく見たらわかることでしたね ありがとうございます。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.5

やりたいことはこういうことですか? #include<stdio.h> int main() { int iyear,imonths,iday; int sum,i; int year; int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; char*cweek[7] = {"日","月","火","水","木","金","土"}; sum =0; printf ("input (e.g. ****/**/**)\n>>"); scanf ("%d/%d/%d",&iyear,&imonths,&iday); /*閏年の判定*/ for(year=1;year<iyear;year++){ if((year%4==0)&&((year%100!=0))||(year%400==0)){ sum+=366; }else{ sum+=365; } } printf( "year sum = %d\n", sum ); if((year%4==0)&&((year%100!=0))||(year%400==0)){ m_array[1] = 29; }else{ m_array[1] = 28; } /*前月までの日数*/ for (i =0; i < imonths-1; i++) { sum += m_array[i]; } printf( "months sum = %d\n", sum ); sum=sum+iday; //曜日の出力 printf("%s曜日",cweek[sum%7]); return 0; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

.... 「曜日がずれる」のは「sum に問題があるから」に決まってますが.... ちなみに 2008/2/29 と 2008/3/1 で実行してみましたか? 同じ曜日になりませんでしたか?

noname#53915
質問者

お礼

おっしゃるとおりsumに問題ありました 無事解決できました ありがとうございました

回答No.2

曜日を求めるなら「Zellerの公式」を使うのが良いでしょう。

noname#53915
質問者

補足

スイマセン、ツェラーの公式は使わずに出したいので・・・ そっちの方が楽なんですけどね。よく使われてるみたいですし。

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

iyear と year が使われています。

noname#53915
質問者

補足

失礼しました、あのままだとコンパイラできませんね。 #include<stdio.h> int main() { int year,months,day; int sum,i; int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; char*cweek[7] = {"日","月","火","水","木","金","土"}; sum =0; printf ("input (e.g. ****/**/**)\n>>"); scanf ("%d/%d/%d",&year,&months,&day); /*閏年の判定*/ for(i=1;i<year;i++){ if((year%4==0)&&((year%100!=0))||(year%400==0)){ sum++; i++; } year--; /*前月までの日数*/ for (i =0; i < months-1; i++) { sum += m_array[i]; } year++; sum=sum+day; //曜日の出力 printf("%s曜日",cweek[sum%7]); return 0; } }

関連するQ&A