質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

9948閲覧

ツェラーの公式で曜日を求める。

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/11/25 17:21

編集2017/11/25 17:31

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;
とするとなぜかうまくいきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

詳しくは追っていませんが下記が原因ではないでしょうか。

c

1if (month = 1 || month == 2) {

monthは常に1となっています。


追記:

下記記述とすることで、両方の関数で同じ結果が返るようになるようでした。
また、d_yearの算出には剰余を使った方がよいかと思いましたのでそのようにしています。

c

1int day_of_zeller(int year, int month, int day) { 2 if (month == 1 || month == 2) { 3 year--; 4 month += 12; 5 } 6 int u_year = (int)(year / 100); 7 int d_year = (int)(year % 100);

if文での代入処理はバグの素なので、コンパイラでチェックすることで発見できる可能性があります。
たとえばgccですと、下記のように警告オプションをつけることで、今回のような箇所は警告を受けることができます。

text

1$ gcc -Wall a.c 2a.c: In function ‘day_of_zeller’: 3a.c:22:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses] 4 if (month = 1 || month == 2) { 5 ^

投稿2017/11/25 21:18

編集2017/11/25 22:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/11/26 04:01

あああ!! できました。 どうもありがとうございます。 ふぅぅ・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問