質問編集履歴

1

関数make_calendar

2016/12/04 10:49

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- for文の意味を教えてください 
1
+ for文の意味を教えてください for (wd %= 7; wd < 7; wd++)
test CHANGED
@@ -1,7 +1,111 @@
1
- ```- c言語
1
+ ```c言語
2
2
 
3
- 文の意味教えてください for (wd %= 7; wd < 7; wd++)
3
+ /*--- y年m月カレンダー2次元配列sに格納 ---*/
4
4
 
5
- wd %= 7がよくわからないですが
5
+ void make_calendar(int y, int m, char s[7][22]) // 1ヶ月分カレンダー用の文字列を作る関数
6
6
 
7
+ { // 7行22列の2次元配列sに格納する。タイトル1行+本体6行
8
+
9
+ int i, k;
10
+
11
+ int wd = dayofweek(y, m, 1); // y年m月1日の曜日
12
+
13
+ int mdays = monthdays(y, m); // y年m月の日数
14
+
15
+ char tmp[4];
16
+
17
+
18
+
19
+ sprintf(s[0], "%10d / %02d ", y, m); // 0行目(s[0])にタイトル用の年月を格納する
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+ for (k = 1; k < 7; k++) // タイトル以外のバッファをクリア
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+ s[k][0] = '\0'; // 日付の1行目の要素0から6行目までNULLを代入する。
36
+
37
+
38
+
39
+
40
+
41
+ k = 1; // 日付の1行目を表す。1日が入っている行である
42
+
43
+
44
+
45
+ sprintf(s[k], "%*s", 3 * wd, ""); // 第1日の左側を空白文字で埋める
46
+
47
+ // 第1日が金曜日であれば15個、曜日に応じて
48
+
49
+ // 適当な個数の空白文字で埋める
50
+
51
+
52
+
53
+ for (i = 1; i <= mdays; i++) {
54
+
55
+ sprintf(tmp, "%3d", i); // 日付を表す3桁の文字列を配列tmpに作る
56
+
57
+ strcat(s[k], tmp); // i日の日付を追加, strcat:文字列の連結
58
+
59
+ if (++wd % 7 == 0) // 土曜日の日付を格納して1行分の文字を
60
+
61
+ k++; // 次の行へ進む
62
+
63
+ }
64
+
65
+
66
+
67
+ if (wd % 7 == 0) // wd % 7 == 0はwdが日曜日である時
68
+
7
- ```
69
+ k--;
70
+
71
+ else {
72
+
73
+ for (wd %= 7; wd < 7; wd++) // 最終日の右側に空白文字を追加
74
+
75
+ // 11月はwd % 7-->wd,k==5のとき,wd %= 7はwd==2
76
+
77
+ strcat(s[k], " "); // 最終日の右側に3個の空白文字を追加,strcat:文字列の連結
78
+
79
+ // s[5][0]==29,s[5][1]==30これに空白文字" "をつないでいく
80
+
81
+ // wd < 7の間3個の空白文字を前の空白に繋いでいく
82
+
83
+
84
+
85
+ }
86
+
87
+ while (++k < 7){ // 日付が格納されていない未使用行を
88
+
89
+ sprintf(s[k], "%21s", ""); // 空白文字で埋めつくす。最後にNULL文字を
90
+
91
+ //入れるので、22個の枠が埋まる
92
+
93
+ }
94
+
95
+
96
+
97
+ }
98
+
99
+ 一応コメントをしたのですがいまいちわからないので解説をお願いします
100
+
101
+ for文のwd %= 7;ここのところです。K==5で日付が30日(月)で終わっています。火曜日から土曜日までを空白で埋めるところで、教科書のせつめいがいまいちわかりません。
102
+
103
+ 教科書の解説は、最終日の右側は空白文字で埋め尽くさなければなりません。この図の例では、30日の日付を格納した直後のwdの値は29となっています。
104
+
105
+ その値をインクリメントした値30を7で割った余りは、その翌日の曜日(火曜日)を示す2となります。
106
+
107
+ となっていますが、wdは0から6までしか変化しないと思うのですが、
108
+
109
+ どうしてwd==29なのでしょうか?
110
+
111
+ よろしくお願いいたします