c言語
1/*--- y年m月のカレンダーを2次元配列sに格納 ---*/ 2void make_calendar(int y, int m, char s[7][22]) // 1ヶ月分のカレンダー用の文字列を作る関数 3{ // 7行22列の2次元配列sに格納する。タイトル1行+本体6行 4 int i, k; 5 int wd = dayofweek(y, m, 1); // y年m月1日の曜日 6 int mdays = monthdays(y, m); // y年m月の日数 7 char tmp[4]; 8 9 sprintf(s[0], "%10d / %02d ", y, m); // 0行目(s[0])にタイトル用の年月を格納する 10 11 12 13 for (k = 1; k < 7; k++) // タイトル以外のバッファをクリア 14 15 16 17 s[k][0] = '\0'; // 日付の1行目の要素0から6行目までNULLを代入する。 18 19 20 k = 1; // 日付の1行目を表す。1日が入っている行である 21 22 sprintf(s[k], "%*s", 3 * wd, ""); // 第1日の左側を空白文字で埋める 23 // 第1日が金曜日であれば15個、曜日に応じて 24 // 適当な個数の空白文字で埋める 25 26 for (i = 1; i <= mdays; i++) { 27 sprintf(tmp, "%3d", i); // 日付を表す3桁の文字列を配列tmpに作る 28 strcat(s[k], tmp); // i日の日付を追加, strcat:文字列の連結 29 if (++wd % 7 == 0) // 土曜日の日付を格納して1行分の文字を 30 k++; // 次の行へ進む 31 } 32 33 if (wd % 7 == 0) // wd % 7 == 0はwdが日曜日である時 34 k--; 35 else { 36 for (wd %= 7; wd < 7; wd++) // 最終日の右側に空白文字を追加 37 // 11月はwd % 7-->wd,k==5のとき,wd %= 7はwd==2 38 strcat(s[k], " "); // 最終日の右側に3個の空白文字を追加,strcat:文字列の連結 39 // s[5][0]==29,s[5][1]==30これに空白文字" "をつないでいく 40 // wd < 7の間3個の空白文字を前の空白に繋いでいく 41 42 } 43 while (++k < 7){ // 日付が格納されていない未使用行を 44 sprintf(s[k], "%21s", ""); // 空白文字で埋めつくす。最後にNULL文字を 45 //入れるので、22個の枠が埋まる 46 } 47 48} 49一応コメントをしたのですがいまいちわからないので解説をお願いします 50for文のwd %= 7;ここのところです。K==5で日付が30日(月)で終わっています。火曜日から土曜日までを空白で埋めるところで、教科書のせつめいがいまいちわかりません。 51教科書の解説は、最終日の右側は空白文字で埋め尽くさなければなりません。この図の例では、30日の日付を格納した直後のwdの値は29となっています。 52その値をインクリメントした値30を7で割った余りは、その翌日の曜日(火曜日)を示す2となります。 53となっていますが、wdは0から6までしか変化しないと思うのですが、 54どうしてwd==29なのでしょうか? 55よろしくお願いいたします
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。