/*--- y年m月のカレンダーを2次元配列sに格納 ---*/ void make_calendar(int y, int m, char s[7][22]) // 1ヶ月分のカレンダー用の文字列を作る関数 { // 7行22列の2次元配列sに格納する。タイトル1行+本体6行 int i, k; int wd = dayofweek(y, m, 1); // y年m月1日の曜日 int mdays = monthdays(y, m); // y年m月の日数 char tmp[4]; // sprintf(s[0], "%10d / %02d ", y, m); // 0行目(s[0])にタイトル用の年月を格納する // タイトル(年/月),10桁の年を表示してその後に空白1個が // 入ってしる。2桁の月の前に1個の空白が入れてある。 // 02というのは月が1桁の時その前の0を入れるということ for (k = 1; k < 7; k++) // タイトル以外のバッファをクリア // 先頭文字にナル文字を代入すると文字列 // 全体が空になる。k = 1~ k = 6まで変化する s[k][0] = '\0'; // 日付の1行目の要素0から6行目までNULLを代入する。 // 先頭文字になる文字を代入すると文字列sは空になる k = 1; // 日付の1行目を表す。1日が入っている行である sprintf(s[k], "%*s", 3 * wd, ""); // 第1日の左側を空白文字で埋める // 第1日が金曜日であれば15個、曜日に応じて // 適当な個数の空白文字で埋める for (i = 1; i <= mdays; i++) { sprintf(tmp, "%3d", i); // 日付を表す3桁の文字列を配列tmpに作る strcat(s[k], tmp); // i日の日付を追加, strcat:文字列の連結 if (++wd % 7 == 0) // 土曜日の日付を格納して1行分の文字を k++; // 使い切るとkをインクリメントして次の // 行へ進む、++wd % 7 == 0はwdが土曜日である // 次の行へ進む } if (wd % 7 == 0) // wd % 7 == 0はwdが日曜日である時 k--; else { for (wd %= 7; wd < 7; wd++) // 最終日の右側に空白文字を追加 // 11月はwd % 7-->wd,k==5のとき,wd %= 7はwd==2 strcat(s[k], " "); // 最終日の右側に3個の空白文字を追加,strcat:文字列の連結 // s[5][0]==29,s[5][1]==30これに空白文字" "をつないでいく // wd < 7の間3個の空白文字を前の空白に繋いでいく } while (++k < 7){ // 日付が格納されていない未使用行を sprintf(s[k], "%21s", ""); // 空白文字で埋めつくす。最後にNULL文字を //入れるので、22個の枠が埋まる } }コード
wd %= 7 は丁寧な説明をいただき、わかりました。ありがとうございます。
ここのところですfor (wd %= 7; wd < 7; wd++) 。K==5で日付が30日(月)で終わっています。火曜日から土曜日までを空白で埋めるところで、教科書のせつめいがいまいちわかりません。
「教科書の解説は、最終日の右側は空白文字で埋め尽くさなければなりません。この図の例では、30日の日付を格納した直後のwdの値は29となっています。
その値をインクリメントした値30を7で割った余りは、その翌日の曜日(火曜日)を示す2となります。」
となっていますが、wdは0から6までしか変化しないと思うのですが、
どうしてwd==29なのでしょうか?
よろしくお願いいたします
編集
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/12/05 01:19