• ベストアンサー

C言語でわからないところががあります。

入力された年月日で曜日を求める問題で このサイトでも似たような質問がいくつかあり(他のサイトでも) 参考になりました、閏年とか日数とか特に助かりました。 (参考と言うよりパクった感じですが #include<stdio.h> int main() { int ,months,day,year,sum,i;  //「変数 月 日 年 sum iを宣言」 int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//「その月の最後の日 char*cweek[7] = {"日","月","火","水","木","金","土"};//曜日(1週間) sum =0;// 「sumを0で初期化」 printf ("input (e.g. ****/**/**)\n>>");//ここで入力 scanf ("%d/%d/%d",&year,&months,&day);//「年 月 日を10進数で出力」 for(i=1;i<year;i++){//「1からユーザーが入力した年までループ」 sum++; if((i%4==0)&&((i%100!=0))||(i%400==0)){//「閏年かどうか判定し、閏年なら1(29日)を足す」 sum++; } } for (i =0; i < months-1; i++) { sum += m_array[i]; } if((i%4==0)&&((i%100!=0))||(i%400==0))//「年が閏年で月が3月以降なら閏年分の1を足す」 if(months>=3){ sum++; } } sum=sum+day-1; printf("%s曜日",cweek[sum%7]);//曜日の計算と出力// return 0;   } このソースの意味で質問なんですけど このソースでいう前年度の総日数は最初の方に出ているループでだされてますよね?あと最後に出ているfor分、これは前月?までの総日数を求めてる・・・と思います。あと最後のsum=sum+day-1;なんですがこれはdayがその月の日数って事なんですよね?sumは前月で。 ちょっとわかりにくり質問で申し訳ないです。

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

★コンパイルして、例えば今日の日付で、正しく曜日が表示されなかったので「質問」された、ということですね。  西暦元年1月1日を起点としたプログラムとなっていますが、  そもそも(「グレゴリオ暦をベース」とした)、 ★西暦元年1月1日は、何曜日なんだろう、という疑問が浮かぶかと・・。 http://www.benricho.org/nenrei/youbi.html によると、 ★西暦元年1月1日は、「土曜日」と出ます。  示されたソースを目でたどると「日曜日」となる。直さなきゃ。 ---------ざっとソースをみると-------------------- ☆冒頭ループ内の sum++; は sum += 365; を省略したもの、ということは判っていますか?   ( 365 % 7 ) が 1 だからだよね。 ☆後半の  if((i%4==0)&&((i%100!=0))||(i%400==0))  の i は year じゃないの?  というか、    if( months >= 3 ){   if( 0 == ( year % 4 ) ) sum++;   if( 0 == ( year % 100 ) ) sum--;   if( 0 == ( year % 400 ) ) sum++;  }  と月の判定を外にした方が分かり易い。   ---------ところで--------------------------- ☆私の子供の頃は、カレンダーは、「月曜から始まり日曜で改行」  されていたんだけど、いつ頃から「日曜から始まり土曜で改行」  のものが普及したんだろう。 ☆週の始まりが日曜なら、週末は土曜まで?「週末の予定は?」  と聞かれたら・・。 ☆赤穂浪士の討ち入りは、元禄15年12月14日(西暦1703年1月30日)  らしいけど、12月の始めにマスコミが騒ぐのは・・?。 ★年寄りは、そんなこと考えていると、寝つきがいい(笑)。

noname#69958
質問者

お礼

なるほど、分かりやすいように作るのも必要なんですね 勉強になります 今日の日付はまだ試していませんでした・・ 他の年とか日付はすんなりいけたのでこれでいいかなと思っていました どうやらまだダメみたいですね

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.5

ここはひとつ、素直にZellerの公式を使う一手でありましょう。

noname#69958
質問者

お礼

その手がありましたか、なるほど~ 参考になります、ありがとうございました。

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

現在のグレゴリオ暦をさかのぼるんだったら, 紀元元年1月1日は土曜日にも日曜日にもなりませんぜ>#3. おまけ: グレゴリオ暦では 400年に 97回の閏年が入ります. つまり 400年で合計 365×400+97 = 146097日あるんですが, この数字はたまたまですが 7 で割切れます. ということは, 「ある年のカレンダー」と「その 400年前のカレンダー」は曜日に関して全く同じになります.

noname#69958
質問者

お礼

ご説明ありがとうございましたw 勉強になります!

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.2

# ソースの解釈はほぼ良いと思われます。 バグがあるようです、さぁどこでしょう? 全角文字が混入してるとか , が余分とか { が少ないとかではなくて 今日の日付を入れてみたら曜日が異なっておりました。 それとも単に投稿される時の記述間違いなのでしょうか?

noname#69958
質問者

お礼

いえ、私のコードに間違いがあるようです(足りない?といった感じでしょうか・・よくわかりませんが) 4月4日で入力するとズレがでてるみたいですね 気付きませんでした・・・・ 他は大丈夫だったのでこれでいけると思ってて・・・ 考え直してみます。

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

言われているとおりです。少しだけ正確な言葉で言うと、 > 前年度の総日数 1からユーザーが入力した年の前年度まで > sumは前月で。 右辺のsumは前月の末までの日数。

noname#69958
質問者

お礼

確かにその方が相手にも分かりやすいですね sum=「sum+day」-1 「前月の末までの日数 その月の日数」 なるほど。 ってことはこのー1の存在する意味は・・・?

関連するQ&A