回答編集履歴
1
文言追記しました。
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か月分の印字が終了後、改行を印字します。
|