回答編集履歴

3

※追加

2023/05/15 05:30

投稿

jimbe
jimbe

スコア12648

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 化、等

2023/05/15 05:22

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -4,37 +4,42 @@
4
4
 
5
5
  /** うるう年なら 1. 違うなら 0 を返す */
6
6
  int leap_year(int year) {
7
- return year%400 == 0 || (year%100 != 0 && year%4 == 0) ? 1 : 0;
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
- return month == 4 || month == 6 || month == 9 || month == 11 ? 30 : 31;
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; //2020年1月1日は水曜日
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
- return d%7;
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 (7+(d%7))%7;
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 >= 1) break; /*year1以上でループを抜ける*/
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 >= 1 && month <= 12) break; /*month1~12の間でループを抜ける*/
58
+ if(1 <= month && month <= 12) break; /*入力正常ならループ終了*/
54
59
  printf("月は1~12の範囲で入力してください。\n");
55
60
  }
56
61
 
57
- /* 1日の曜日を取得 */
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; d<=number_of_days(year, month); d++, w++) {
69
+ for(int d=1, n=number_of_days(year, month); d<=n; d++, dow=(dow+1)%7) {
65
- if(w != 0 && w%7 == 0) printf("\n");
70
+ if(d != 1 && dow == 0) printf("\n");
66
71
  printf(" %2d", d);
67
72
  }
68
73
  printf("\n");

1

関数名変更, 表示改行タイミング変更

2023/05/14 17:09

投稿

jimbe
jimbe

スコア12648

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 month_days(int year, int month) {
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_week(int year, int month) {
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 += month_days(y, m);
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 -= month_days(y, m);
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_week(year, month);
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<=month_days(year, month); d++, w++) {
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
  ```