回答編集履歴
3
※追加
test
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
2020年1月1日水曜日を基点に月の日数を加減算して指定年月の月初の曜日を求めています。
|
2
|
+
|
3
|
+
※ fflush(stdout) はこちらの環境(Eclipse)で必要だったもので、削除して構いません。
|
2
4
|
```c
|
3
5
|
#include <stdio.h>
|
4
6
|
|
2
// コメントを /**/ 化、三項演算子を if 化、等
test
CHANGED
@@ -4,37 +4,42 @@
|
|
4
4
|
|
5
5
|
/** うるう年なら 1. 違うなら 0 を返す */
|
6
6
|
int leap_year(int year) {
|
7
|
-
|
7
|
+
if(year%400 == 0 || (year%100 != 0 && year%4 == 0)) return 1;
|
8
|
+
return 0;
|
8
9
|
}
|
9
10
|
|
10
11
|
/** 指定年月の日数を返す */
|
11
12
|
int number_of_days(int year, int month) {
|
12
13
|
if(month == 2) return 28 + leap_year(year);
|
13
|
-
|
14
|
+
if(month == 4 || month == 6 || month == 9 || month == 11) return 30;
|
15
|
+
return 31;
|
14
16
|
}
|
15
17
|
|
16
18
|
/** 指定年月の1日の曜日を返す(0=日) */
|
17
19
|
int day_of_week_of_first_day(int year, int month) {
|
18
|
-
int d = 3; /
|
20
|
+
int dow = 3; /*2020年1月1日は水曜日*/
|
19
21
|
|
20
22
|
if(year >= 2020) {
|
21
|
-
/
|
23
|
+
/*指定年月まで日数を加算(指定年月自体の日数は含まない)*/
|
22
24
|
for(int y=2020; y<=year; y++) {
|
23
25
|
for(int m=1; m<=12; m++) {
|
24
|
-
if(y == year && m == month) break;
|
26
|
+
if(y == year && m == month) break; /*指定年月ならループ終了(y==year なので y のループも終わる)*/
|
25
|
-
d += number_of_days(y, m);
|
27
|
+
dow += number_of_days(y, m);
|
26
28
|
}
|
27
29
|
}
|
30
|
+
} else { /*year < 2020*/
|
31
|
+
/*指定年月まで日数を減算(指定年月自体の日数を含む)*/
|
32
|
+
for(int y=2020-1; y>=year; y--) {
|
33
|
+
for(int m=12; m>=1; m--) {
|
28
|
-
|
34
|
+
dow -= number_of_days(y, m);
|
35
|
+
if(y == year && m == month) break; /*指定年月ならループ終了(y==year なので y のループも終わる)*/
|
29
|
-
}
|
36
|
+
}
|
30
|
-
//指定年月まで減算
|
31
|
-
for(int y=2020-1; y>=year; y--) {
|
32
|
-
for(int m=12; m>=1; m--) {
|
33
|
-
d -= number_of_days(y, m);
|
34
|
-
if(y == year && m == month) break;
|
35
37
|
}
|
36
38
|
}
|
39
|
+
|
40
|
+
dow %= 7;
|
41
|
+
if(dow < 0) dow = 7 + dow;
|
37
|
-
return
|
42
|
+
return dow;
|
38
43
|
}
|
39
44
|
|
40
45
|
int main(void) {
|
@@ -43,26 +48,26 @@
|
|
43
48
|
while(1) {
|
44
49
|
printf("西暦:"); fflush(stdout);
|
45
50
|
scanf("%d", &year);
|
46
|
-
if(year
|
51
|
+
if(1 <= year) break; /*入力が正常ならループ終了*/
|
47
52
|
printf("西暦は1以上で入力してください。\n");
|
48
53
|
}
|
49
54
|
int month = 0;
|
50
55
|
while(1) {
|
51
56
|
printf("月:"); fflush(stdout);
|
52
57
|
scanf("%d", &month);
|
53
|
-
if(month
|
58
|
+
if(1 <= month && month <= 12) break; /*入力が正常ならループ終了*/
|
54
59
|
printf("月は1~12の範囲で入力してください。\n");
|
55
60
|
}
|
56
61
|
|
57
|
-
/*
|
62
|
+
/* 初日の曜日を取得 */
|
58
|
-
int w = day_of_week_of_first_day(year, month);
|
63
|
+
int dow = day_of_week_of_first_day(year, month);
|
59
64
|
|
60
65
|
/* 表示 */
|
61
66
|
printf(" 日 月 火 水 木 金 土 \n");
|
62
67
|
printf(" -------------------- \n");
|
63
|
-
for(int i=0; i<w; i++) printf(" ");
|
68
|
+
for(int i=0; i<dow; i++) printf(" ");
|
64
|
-
for(int d=1
|
69
|
+
for(int d=1, n=number_of_days(year, month); d<=n; d++, dow=(dow+1)%7) {
|
65
|
-
if(
|
70
|
+
if(d != 1 && dow == 0) printf("\n");
|
66
71
|
printf(" %2d", d);
|
67
72
|
}
|
68
73
|
printf("\n");
|
1
関数名変更, 表示改行タイミング変更
test
CHANGED
@@ -7,14 +7,14 @@
|
|
7
7
|
return year%400 == 0 || (year%100 != 0 && year%4 == 0) ? 1 : 0;
|
8
8
|
}
|
9
9
|
|
10
|
-
/** 指定月の日数を返す */
|
10
|
+
/** 指定年月の日数を返す */
|
11
|
-
int mo
|
11
|
+
int number_of_days(int year, int month) {
|
12
12
|
if(month == 2) return 28 + leap_year(year);
|
13
13
|
return month == 4 || month == 6 || month == 9 || month == 11 ? 30 : 31;
|
14
14
|
}
|
15
15
|
|
16
16
|
/** 指定年月の1日の曜日を返す(0=日) */
|
17
|
-
int firstday
|
17
|
+
int day_of_week_of_first_day(int year, int month) {
|
18
18
|
int d = 3; //2020年1月1日は水曜日
|
19
19
|
|
20
20
|
if(year >= 2020) {
|
@@ -22,7 +22,7 @@
|
|
22
22
|
for(int y=2020; y<=year; y++) {
|
23
23
|
for(int m=1; m<=12; m++) {
|
24
24
|
if(y == year && m == month) break;
|
25
|
-
d += mo
|
25
|
+
d += number_of_days(y, m);
|
26
26
|
}
|
27
27
|
}
|
28
28
|
return d%7;
|
@@ -30,7 +30,7 @@
|
|
30
30
|
//指定年月まで減算
|
31
31
|
for(int y=2020-1; y>=year; y--) {
|
32
32
|
for(int m=12; m>=1; m--) {
|
33
|
-
d -= mo
|
33
|
+
d -= number_of_days(y, m);
|
34
34
|
if(y == year && m == month) break;
|
35
35
|
}
|
36
36
|
}
|
@@ -55,16 +55,17 @@
|
|
55
55
|
}
|
56
56
|
|
57
57
|
/* 1日の曜日を取得 */
|
58
|
-
int w = firstday
|
58
|
+
int w = day_of_week_of_first_day(year, month);
|
59
59
|
|
60
60
|
/* 表示 */
|
61
61
|
printf(" 日 月 火 水 木 金 土 \n");
|
62
62
|
printf(" -------------------- \n");
|
63
63
|
for(int i=0; i<w; i++) printf(" ");
|
64
|
-
for(int d=1; d<=mo
|
64
|
+
for(int d=1; d<=number_of_days(year, month); d++, w++) {
|
65
|
+
if(w != 0 && w%7 == 0) printf("\n");
|
65
66
|
printf(" %2d", d);
|
66
|
-
if(w%7 == 6) printf("\n");
|
67
67
|
}
|
68
|
+
printf("\n");
|
68
69
|
}
|
69
70
|
```
|
70
71
|
```
|