質問 |
||
| 質問者:noname#53915 | 入力した日は何曜日か | |
|---|---|---|
困り度:
|
入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします #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; } } |
|
質問投稿日時:08/03/27 23:06 質問番号:3900603 |
||
回答 |
|
| 回答者:Tacosan | お〜, よく見たらこのプログラム, いろいろ変だ.... ・最初の for が最後までかかっているので無限ループになってそう. ・year をデクリメントしてからインクリメントしてる (しかもその間で year は使われていない) のはなぜ? ・そもそも sum の値は全く正しくないような気がする. 2009年か 2010年くらいにおかしい感じ. |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/28 16:24 回答番号:No.6 |
|
| この回答へのお礼 | 矛盾だらけでした、よく見たらわかることでしたね ありがとうございます。 |
回答 |
|
| 回答者:nora1962 | やりたいことはこういうことですか? #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; } |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/28 16:13 回答番号:No.5 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:Tacosan | .... 「曜日がずれる」のは「sum に問題があるから」に決まってますが.... ちなみに 2008/2/29 と 2008/3/1 で実行してみましたか? 同じ曜日になりませんでしたか? |
|---|---|
| 種類:補足要求 どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/28 14:11 回答番号:No.4 |
|
| この回答へのお礼 | おっしゃるとおりsumに問題ありました 無事解決できました ありがとうございました |
回答良回答20pt |
|
| 回答者:Tacosan | 私も Zeller の公式をお勧めしますが, このプログラムだと「少なくとも閏年の 2月28日までか 3月1日以降かのいずれかはおかしくなる」はずです. 曜日を出力する直前で sum の値を見てみればわかると思いますが, 例えば 2008/2/29 と 2008/3/1 が同じ値になりますね. |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/03/28 00:00 回答番号:No.3 |
|
| この回答への補足 | やっぱりsumに問題があるんですかね? |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答10pt |
|
| 回答者:okazaki0ko | 曜日を求めるなら「Zellerの公式」を使うのが良いでしょう。 |
|---|---|
| 種類:アドバイス どんな人:経験者 自信:自信あり |
|
| |
回答日時:08/03/27 23:28 回答番号:No.2 |
|
| この回答への補足 | スイマセン、ツェラーの公式は使わずに出したいので・・・ そっちの方が楽なんですけどね。よく使われてるみたいですし。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:auty | iyear と year が使われています。 |
|---|---|
| 種類:アドバイス どんな人:経験者 自信:参考意見 |
|
| |
回答日時:08/03/27 23:28 回答番号:No.1 |
|
| この回答への補足 | 失礼しました、あのままだとコンパイラできませんね。 #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; } } |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |