回答編集履歴

1

文言追記しました。

2021/01/24 00:23

投稿

tatsu99
tatsu99

スコア5438

test CHANGED
@@ -191,3 +191,95 @@
191
191
 
192
192
 
193
193
  ![イメージ説明](ae603abb4059e12fa2ca7a44153dcf52.png)
194
+
195
+
196
+
197
+ ①getWeekOf1ですが、指定された年月に対応するの1日の週番号を求めています。
198
+
199
+ 2021年1月なら5
200
+
201
+ 2021年2月なら1
202
+
203
+ 2021年3月なら1
204
+
205
+ 2021年4月なら4、以下同様
206
+
207
+ を返します。
208
+
209
+ この値は、getCalenderのwofへ渡す値として使用されます。
210
+
211
+ この値をどのようにして算出するかということですが、
212
+
213
+ 1案:if 文で判断して直接返す。
214
+
215
+ 2案:1月1日は、#define WEEKof1 5 で与えられているので、それを利用して算出する。
216
+
217
+ のどちらかになります。
218
+
219
+ 1案なら
220
+
221
+ if month == 1 return 5;
222
+
223
+ if month == 2 return 1;
224
+
225
+ if month == 3 return 1;
226
+
227
+ if month == 4 return 4;
228
+
229
+ のように書きます。
230
+
231
+ この案の利点は、深く考える必要がないということです。
232
+
233
+ 欠点は、来年のカレンダーを作る場合は、全て書き換えないといけない、ということです。
234
+
235
+ 今回は2案を採用しています。
236
+
237
+ 2案の場合は、来年になった場合、#define WEEKof1 5のみを書き換えれば、済みます。
238
+
239
+ 算出方法は、
240
+
241
+ 2021年1月なら、WEEKof1の値を返す。
242
+
243
+ 2021年2月なら、WEEKof1に1月分の日付を加算した値(31)を7で割った余りを返す。(5+31)%7=1
244
+
245
+ 2021年3月なら、WEEKof1に2月分までの日付を加算した値(31+28)を7で割った余りを返す。(5+31+28)%7=1
246
+
247
+ 以降同様です。
248
+
249
+
250
+
251
+ ②mainについて
252
+
253
+ 一か月分のカレンダーは、char calender[8][MON_WIDTH];を確保し、
254
+
255
+ getCalender(calender, YEAR, 1, 5);
256
+
257
+ で作成しています。
258
+
259
+ つまり、getCalenderに作成したい年、月、及び週番号を与えると、calenderにその内容が設定されて
260
+
261
+ 返ってきます。そして、それを印字すれば、完了です。
262
+
263
+ 縦に1年分のカレンダーを印字する場合は、これを12回繰り返せば、それが実現できます。
264
+
265
+ しかしながら、横に4列の場合は、1行を印字するときに、横に4か月ぶんのカレンダーの内容を
266
+
267
+ 一度に印字しないといけません。(一度、改行してしまうと、前の行に戻ることはできない為)
268
+
269
+ その為、12か月分のカレンダー領域を確保し、12月分のカレンダーをまず作成します。
270
+
271
+ 領域はchar calender[12][8][MON_WIDTH];のようになります。
272
+
273
+ for (m = 1; m <= 12; m++){のループの部分で、12月分のカレンダーを作成しています。
274
+
275
+
276
+
277
+ 次にカレンダーの印字です。
278
+
279
+ for (row = 0;row < ROW;row++){の部分で、以下の処理(4か月分の印字)3回繰り返します。
280
+
281
+ for (int i = 0; i < 8; i++) {の部分で、4か月分のカレンダーの1行目から8行目の印字を繰り返します。
282
+
283
+ for (col = 0; col < COL; col++){の部分で各月の印字(4か月分の各月)を4回繰り返します。
284
+
285
+ 4か月分の印字が終了後、改行を印字します。