プロが教える店舗&オフィスのセキュリティ対策術

入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします

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

A 回答 (6件)

私も Zeller の公式をお勧めしますが, このプログラムだと「少なくとも閏年の 2月28日までか 3月1日以降かのいずれかはお

かしくなる」はずです. 曜日を出力する直前で sum の値を見てみればわかると思いますが, 例えば 2008/2/29 と 2008/3/1 が同じ値になりますね.

この回答への補足

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

補足日時:2008/03/28 00:53
    • good
    • 0

お~, よく見たらこのプログラム, いろいろ変だ....


・最初の for が最後までかかっているので無限ループになってそう.
・year をデクリメントしてからインクリメントしてる (しかもその間で year は使われていない) のはなぜ?
・そもそも sum の値は全く正しくないような気がする. 2009年か 2010年くらいにおかしい感じ.
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/29 01:01

やりたいことはこういうことですか?



#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;

}
    • good
    • 0

....


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

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

お礼日時:2008/03/29 00:59

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

この回答への補足

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

補足日時:2008/03/28 00:50
    • good
    • 0

iyear



year
が使われています。

この回答への補足

失礼しました、あのままだとコンパイラできませんね。
#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;
}
}

補足日時:2008/03/28 00:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!