質問編集履歴

7

コード修正と新たな問題

2021/01/23 07:16

投稿

kkk69
kkk69

スコア2

test CHANGED
@@ -1 +1 @@
1
- コードを改良して1年間のカレンダーを作りたい
1
+ コードを改良して1年間のカレンダーを作りたい(曜日と日付の並びをそろえたい)
test CHANGED
@@ -126,13 +126,7 @@
126
126
 
127
127
  }
128
128
 
129
- //指定年月の1日の週の番号を求める(日:0、月:1、...、土:6)
130
129
 
131
- //year:年
132
-
133
- //month:月
134
-
135
- //this_year_wof1:当該年の1月1日の週の番号
136
130
 
137
131
  int getWeekOf1(int year,int month,int this_year_wof1)
138
132
 

6

コードを修正し新たに曜日と日付のずれが生じました

2021/01/23 07:16

投稿

kkk69
kkk69

スコア2

test CHANGED
File without changes
test CHANGED
@@ -8,29 +8,11 @@
8
8
 
9
9
 
10
10
 
11
- 2021年 1月
12
-
13
- 日 月 火 水 木 金 土
14
-
15
- 1 2
16
-
17
- 3 4 5 6 7 8 9
18
-
19
- 10 11 12 13 14 15 16
11
+ ![このように曜日か一つずつずれてしまいます。](cf05c3548676784041ac57f2e37ca6ab.png)
20
-
21
- 17 18 19 20 21 22 23
22
-
23
- 24 25 26 27 28 29 30
24
12
 
25
13
 
26
14
 
27
- いう感じ表示されます(*見やすいように編集してます。)
15
+ どうすれば曜日日付をそろえることがます
28
-
29
-
30
-
31
- mainの最後のfor文のようにすれば12ヶ月分は表示できそうなのですが月初の曜日のズレや縦に3ヶ月横に4ヶ月分などの表示の仕方がわかりません。
32
-
33
-
34
16
 
35
17
  言語はC言語です。
36
18
 
@@ -48,59 +30,67 @@
48
30
 
49
31
  #define MONTH 1
50
32
 
51
- #define WEEKof1 5
33
+ #define WEEKof1 5
52
34
 
53
- #define MON_WIDTH 30
35
+ #define MON_WIDTH 30
36
+
37
+ enum { ROW = 3, COL = (12/ROW) };
38
+
39
+
40
+
41
+ int dayOfMonth[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
42
+
43
+ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
44
+
45
+ };
46
+
47
+
48
+
49
+ int leapYear(int year)
50
+
51
+ {
52
+
53
+ return (year % 4) == 0;
54
+
55
+ }
56
+
57
+
58
+
59
+ void getCalender(char s[8][MON_WIDTH], int y, int m, int wof)
60
+
61
+ {
62
+
63
+ int cal[6][7];
64
+
65
+ int dom = dayOfMonth[leapYear(y)][m - 1];
66
+
67
+ int i, d;
54
68
 
55
69
 
56
70
 
57
71
 
58
72
 
59
- int dayOfMonth[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},
73
+ for (i = 0; i < wof; i++)
60
74
 
61
- {31,29,31,30,31,30,31,31,30,31,30,31}};
75
+ cal[0][i] = 0;
62
76
 
77
+ for (d = 0; d < dom; d++) {
63
78
 
79
+ int row = (wof + d) / 7;
64
80
 
65
- int leapYear(int year) {
81
+ int col = (wof + d) % 7;
66
82
 
67
- return (year % 4)==0;
68
-
69
- }
70
-
71
-
72
-
73
- void getCalender(char s[7][MON_WIDTH],int y, int m, int wof) {
74
-
75
- int cal[5][7];
76
-
77
- int dom = dayOfMonth[leapYear(y)][m-1];
78
-
79
- int i,d;
80
-
81
-
82
-
83
-
84
-
85
- for(i=0;i < wof;i++) cal[0][i] = 0;
86
-
87
- for(d=0;d < dom; d++) {
88
-
89
- int row = (wof+d) / 7;
90
-
91
- int col = (wof+d) % 7;
92
-
93
- cal[row][col] = d+1;
83
+ cal[row][col] = d + 1;
94
84
 
95
85
  }
96
86
 
97
- for(i=wof+dom;i < 7*5; i++) {
87
+ for (i = wof + dom; i < 7 * 6; i++) {
98
88
 
99
- int row = i / 7;
89
+ int row = i / 7;
100
90
 
101
- int col = i % 7;
91
+ int col = i % 7;
102
92
 
103
- cal[row][col] = 0;
93
+ cal[row][col] = 0;
104
94
 
105
95
  }
106
96
 
@@ -108,41 +98,97 @@
108
98
 
109
99
 
110
100
 
111
- sprintf(s[0]," %4d年%2d月",y,m);
101
+ sprintf(s[0], " %4d年%2d月", y, m);
112
102
 
113
- sprintf(s[1]," 日 月 火 水 木 金 土");
103
+ sprintf(s[1], " 日 月 火 水 木 金 土");
114
104
 
115
- for(i = 0; i < 5; i++) {
105
+ for (i = 0; i < 6; i++) {
116
106
 
117
- s[i+2][0] = '\0';
107
+ s[i + 2][0] = '\0';
118
108
 
119
- char tmp[10];
109
+ char tmp[10];
120
110
 
121
- for(d = 0; d < 7; d++) {
111
+ for (d = 0; d < 7; d++) {
122
112
 
123
- if(cal[i][d] == 0) sprintf(tmp, " ");
113
+ if (cal[i][d] == 0)
124
114
 
125
- else sprintf(tmp," %2d",cal[i][d]);
115
+ sprintf(tmp, " ");
126
116
 
127
- strcat(s[i+2],tmp);
117
+ else
128
118
 
119
+ sprintf(tmp, " %2d", cal[i][d]);
120
+
121
+ strcat(s[i + 2], tmp);
122
+
129
- }
123
+ }
130
124
 
131
125
  }
132
126
 
133
127
  }
134
128
 
129
+ //指定年月の1日の週の番号を求める(日:0、月:1、...、土:6)
135
130
 
131
+ //year:年
136
132
 
137
- void main(void) {
133
+ //month:月
138
134
 
139
- char calender[7][MON_WIDTH];
135
+ //this_year_wof1:当該年の1月1日の週の番号
140
136
 
141
- getCalender(calender,YEAR,MONTH,WEEKof1);
137
+ int getWeekOf1(int year,int month,int this_year_wof1)
142
138
 
143
- for(int i=0; i< 7; i++) {
139
+ {
144
140
 
141
+ int m;
142
+
145
- puts(calender[i]);
143
+ int serial_day = 0;
144
+
145
+ int wof1;
146
+
147
+ for (m = 1; m < month;m++){
148
+
149
+ serial_day += dayOfMonth[leapYear(year)][m-1];
150
+
151
+ }
152
+
153
+ wof1 = (serial_day + this_year_wof1) % 7;
154
+
155
+ return wof1;
156
+
157
+ }
158
+
159
+ void main(void)
160
+
161
+ {
162
+
163
+ char calender[12][8][MON_WIDTH];
164
+
165
+ int i,row,col;
166
+
167
+ int m;
168
+
169
+ int wof1;
170
+
171
+ for (m = 1; m <= 12; m++){
172
+
173
+ wof1 = getWeekOf1(YEAR,m,WEEKof1);
174
+
175
+ getCalender(calender[m-1], YEAR, m, wof1);
176
+
177
+ }
178
+
179
+ for (row = 0;row < ROW;row++){
180
+
181
+ for (int i = 0; i < 8; i++) {
182
+
183
+ for (col = 0; col < COL; col++){
184
+
185
+ printf("%-24s",calender[row*COL+col][i]);
186
+
187
+ }
188
+
189
+ printf("\n");
190
+
191
+ }
146
192
 
147
193
  }
148
194
 

5

実行結果を修正しました

2021/01/23 07:14

投稿

kkk69
kkk69

スコア2

test CHANGED
File without changes
test CHANGED
@@ -6,21 +6,21 @@
6
6
 
7
7
  現在実行すると
8
8
 
9
+
10
+
9
-   2021年1月
11
+ 2021年 1月
10
12
 
11
13
  日 月 火 水 木 金 土
12
14
 
13
- 1 2
15
+ 1 2
14
16
 
15
- 3 4 5 6 7 8 9
17
+ 3 4 5 6 7 8 9
16
18
 
17
- 10 11 12 13 14 15 16
19
+ 10 11 12 13 14 15 16
18
20
 
19
- 17 18 19 20 21 22 23
21
+ 17 18 19 20 21 22 23
20
22
 
21
- 24 25 26 27 28 29 30
23
+ 24 25 26 27 28 29 30
22
-
23
-
24
24
 
25
25
 
26
26
 

4

実行結果と日本語の誤りを修正しました

2021/01/22 10:53

投稿

kkk69
kkk69

スコア2

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  24 25 26 27 28 29 30
22
22
 
23
- 31
23
+
24
24
 
25
25
 
26
26
 
@@ -148,6 +148,4 @@
148
148
 
149
149
  }
150
150
 
151
- コード
152
-
153
151
  ```

3

コードの欠けていた部分を追記しました

2021/01/22 10:52

投稿

kkk69
kkk69

スコア2

test CHANGED
File without changes
test CHANGED
@@ -38,7 +38,9 @@
38
38
 
39
39
  よろしくお願いします。
40
40
 
41
+ ```
42
+
41
- ```#include <stdio.h>
43
+ #include <stdio.h>
42
44
 
43
45
  #include <string.h>
44
46
 
@@ -144,6 +146,8 @@
144
146
 
145
147
  }
146
148
 
149
+ }
150
+
147
151
  コード
148
152
 
149
153
  ```

2

2021/01/22 10:29

投稿

kkk69
kkk69

スコア2

test CHANGED
File without changes
test CHANGED
File without changes

1

2021/01/22 05:47

投稿

kkk69
kkk69

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,34 @@
1
+ 粗末な質問の仕方ですみませんでした。
2
+
3
+
4
+
1
- 下のコードを改良して、縦に3か月横に4か月分の1年間分のカレンダーを作りたいですがどこをどのように書き換えて、追記すればいいかわかりません
5
+ 下のコードを改良して、縦に3か月横に4か月分の1年間分のカレンダーを作りたいです。
6
+
7
+ 現在実行すると
8
+
9
+   2021年1月
10
+
11
+ 日 月 火 水 木 金 土
12
+
13
+ 1 2
14
+
15
+ 3 4 5 6 7 8 9
16
+
17
+ 10 11 12 13 14 15 16
18
+
19
+ 17 18 19 20 21 22 23
20
+
21
+ 24 25 26 27 28 29 30
22
+
23
+ 31
24
+
25
+
26
+
27
+ という感じで表示されます(*見やすいように編集してます。)
28
+
29
+
30
+
31
+ mainの最後のfor文のようにすれば12ヶ月分は表示できそうなのですが月初の曜日のズレや縦に3ヶ月横に4ヶ月分などの表示の仕方がわかりません。
2
32
 
3
33
 
4
34
 
@@ -8,13 +38,7 @@
8
38
 
9
39
  よろしくお願いします。
10
40
 
11
-
12
-
13
-
14
-
15
-
16
-
17
- #include <stdio.h>
41
+ ```#include <stdio.h>
18
42
 
19
43
  #include <string.h>
20
44
 
@@ -119,3 +143,7 @@
119
143
  puts(calender[i]);
120
144
 
121
145
  }
146
+
147
+ コード
148
+
149
+ ```