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

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

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

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

Q&A

解決済

5回答

5130閲覧

C言語 入力された西暦月日の曜日を表示したい

kokok

総合スコア145

C

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

0グッド

1クリップ

投稿2019/07/31 01:52

c

1 2 3 4#pragma warning(disable: 4996) 5#include<stdio.h> 6 7//プロトタイプの宣言 8int januaryoneday(int year); 9int leapyear(int year); 10 11 12int main(void) { 13 14 15 enum M_LIST {JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOW,DEC, N_MONTH}; 16 enum W_LIST{SUN,MON,TUE,WED,THU,FRI,SAT , N_WEEK}; 17 18 int monthdays[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //月の日数 19 20 21 int year; //入力された西暦 22 int month; //入力された月 23 int day; //入力された日 24 int week; // 曜日 25 int judgment; //入力された値がうるう年だったかどうか 26 int sumday; // 入力された誕生日までの合計の日数 27 int birthw; //入力された誕生日の曜日 28 int monthdaysum = 0; // 入力された誕生日の月までの合計の日数 29 30 printf("西暦を入力してください(入力された西暦の1月1日の曜日が表示されます)または、誕生日の西暦月日を入力してください(例:2019 01 01)生年月日の間はスペースを入れてください)"); 31 scanf("%d%d%d", &year,&month,&day); 32 33 34 35 week = januaryoneday(year); 36 printf("%d\n",week); 37 38 judgment = leapyear(year); 39 40 if (judgment == 0) { // うるう年であれば2月を29日に変更 41 42 printf("うるう年"); 43 monthdays[FEB] = 29; 44 } 45 46 for (int i = 0; i < month; i++) { //入力された誕生日の月までの合計の日数 47 48 monthdaysum += monthdays[i]; 49 50 } 51 52 53 sumday = ((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + monthdaysum + day;// 入力された誕生日までの合計の日数 54 55 birthw = sumday % 7; 56 57 printf("%d", birthw); 58 59} 60 61 62//入力された西暦の1月1日の曜日を返す 63int januaryoneday(int year){ 64 65 int sumday; // 入力された西暦までの累計日数 66 int dayw; // 曜日計算 67 68 sumday = ((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1; //入力された1月1日までの日数 69 70 dayw = sumday % 7; 71 72 return dayw; 73} 74 75 76//入力された西暦がうるう年かの判定 77int leapyear(int year) { 78 79 int leap; 80 81 leap = (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) ? 0 : -1; 82 83 return leap; 84 85} 86

入力された西暦の一月一日の曜日と(enumの数値で返す),西暦月日の入力された曜日を返したいのですが

一月一日の 曜日は上手くいくのですが  西暦月日 の方が上手くいきません。 計算がも違ってるかもしれませんが、 アドバイス頂けると幸いです。

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

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

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

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

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

guest

回答5

0

グレゴリオ暦(400年間で97回閏年)では、400年間の総日数が 365*400+97 = 146097 ですが、これは7で割り切れます(146097 = 7 * 20871)
ということは、グレゴリオ暦のカレンダーは「400年周期」なんです。つまりある年の1月1日が月曜日だった場合、「その400年後の1月1日」も月曜日になります。
これくらいなら表を持っていて参照するだけというのも手ですね。

投稿2019/08/01 00:18

tacsheaven

総合スコア13703

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

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

0

年月日から曜日は簡単に求まりますよ。

C

1#include <stdio.h> 2 3int dayofweek(int y, int m, int d) 4{ 5 return y-=m<3,(y+y/4-y/100+y/400+".\0\3\2\5\0\3\5\1\4\6\2\4"[m]+d)%7; 6} 7 8int main(void) 9{ 10 int year, month, day, week; 11 printf("年月日を入力してください(例 2019 7 31): "); 12 if (scanf("%d%d%d", &year, &month, &day) != 3) return 1; 13 week = dayofweek(year, month, day); 14 static const char *name[] = { "日", "月", "火", "水", "木", "金", "土" }; 15 printf(" %s曜日\n", name[week]); 16}

投稿2019/07/31 10:03

編集2019/07/31 15:00
kazuma-s

総合スコア8224

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

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

0

西暦1年1月1日からの通算日数を求めるルーチン、通算日数から西暦年月日を求めるルーチンを作っておきましょう
#ぐぐればそういうモジュールの制作例はたくさん出てきます

そゆのをつくっておいとけば、後でいろいろ役に立ちます
今回の例では、通算日数出して7の余り出すだけだし

投稿2019/07/31 02:44

y_waiwai

総合スコア87774

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

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

0

自己解決

for (int i = 0; i < month; i++) { //入力された誕生日の月までの合計の日数

ではなく

for (int i = 0; i < month -1; i++) { //入力された誕生日の月までの合計の日数

でした。

投稿2019/07/31 02:28

kokok

総合スコア145

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

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

rubato6809

2019/07/31 02:51

その通り。 ところで、すでに 1月1日の曜日をweek に求めてあるのだから、誕生日の曜日を求めるために、再び ((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) を計算するのはムダというもの。 sumday = week + monthdaysum + day; から曜日を求められるじゃないか。
guest

0

どうしても自分で作成したい、というので無ければ、ありものを使った方が早いと思います。

[参考]
ツェラー(Zeller)の公式をC言語で書いた場合

投稿2019/07/31 02:03

FiroProchainezo

総合スコア2401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問