C
1#include<stdio.h> 2#include<stdlib.h> 3#include<time.h> 4 5time_t make_date(int year, int month, int date) { 6 struct tm t; 7 8 t.tm_year = year - 1900; 9 t.tm_mon = month - 1; 10 t.tm_mday = date; 11 t.tm_hour = 0; 12 t.tm_min = 0; 13 t.tm_sec = 0; 14 t.tm_isdst = -1; 15 16 if (mktime(&t) == (time_t)-1) 17 return -1; 18 return t.tm_wday; 19} 20 21int day_of_zeller(int year, int month, int day) { 22 if (month = 1 || month == 2) { 23 year--; 24 month += 12; 25 } 26 int u_year = (int)(year / 100); 27 int d_year = (int)(year - ( u_year * 100)) + 1; 28 29 printf("%d, %d\n", u_year, d_year); 30 31 return (day + (int)((month + 1)*26 / 10) + d_year + (int)(d_year / 4) + (int)(u_year/4) -2*u_year) % 7; 32} 33 34int main() { 35 int year, month, day, we, we2; 36 char *ws[] = { "日", "月", "火", "水", "木", "金", "土" }; 37 char *wd[] = { "土", "日", "月", "火", "水", "木", "金"}; 38 39 printf("曜日を求めます。 \n"); 40 printf("年 : "); scanf("%d", &year); 41 printf("月 : "); scanf("%d", &month); 42 printf("日 : "); scanf("%d", &day); 43 44 we = make_date(year, month, day); 45 we2 = day_of_zeller(year, month, day); 46 47 printf("それは%s曜日です。\n", ws[we]); // こちらの表示は問題なし 48 printf("それは%s曜日です。\n", wd[we2]); // こちらは合ってないです。 49 50 return 0; 51}
int u_year = (int)(year / 100); int d_year = (int)(year - ( u_year * 100)) + 1; return (day + (int)((month + 1)*26 / 10) + d_year + (int)(d_year / 4) + (int)(u_year/4) -2*u_year) % 7;
ツェラーの公式で、1997年、8/13が、何曜日だったか計算していただけませんか?
この3行で曜日を計算していますが・・・
1つ目の疑問です。
u_year はupという意味で上位2桁。d_yearはdownという意味で下位2桁を代入しています。
例えば、 1997 年なら、u_year = 19; d_year = 97; となるはずです。
しかし、d_yearの方は最後に +1しないと合いません。
なぜでしょうか???
キャストが原因でしょうか?
2つ目の疑問。
day + (int)((month + 1)26 / 10) + d_year + (int)(d_year / 4) + (int)(u_year/4) -2u_year) % 7
この数式、どこがおかしいのか分かりません。
(q+[(m+1)×26/10]+K+[K/4]+[J/4]-2J) (mod 7) (リンク先の数式)
結果は、
それは水曜日です。
それは火曜日です。
どこがおかしいのでしょうか?
例えば、今日の日付、2017.11.26を入れてみると、
それは日曜日です。
それは金曜日です。
となります。
困っています。
分かる方います??
ちなみに、有名なこちらの数式でもやってみましたが、合いません。(最初はこちらでやりましたが、合わなかったので、やり方を変えました。)
(y + y/4 - y/100 + y/400 + (13 * m + 8)/5 + d)%7;
ツェラー(Zeller)の公式をC言語で書いた場合
教えてください。
「追記」
今、確認したところ、関数の中のreturn に記述するとうまくいかないですね。
関数を作らずに直接、
we2 =(year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + day) % 7;
とするとなぜかうまくいきます。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/26 04:01