ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者: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;
}
}
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示良回答のみ表示