質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1553閲覧

for文の意味を教えてください for (wd %= 7; wd < 7; wd++)

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/12/04 10:18

編集2016/12/04 10:49

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よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

変更されたソースが見えにくいので整形してみた。(以前の回答が崩れるのを防ぐ意味で、こちらに内容を開示)

/*--- 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])にタイトル用の年月を格納する for (k = 1; k < 7; k++) // タイトル以外のバッファをクリア s[k][0] = '\0'; // 日付の1行目の要素0から6行目までNULLを代入する。 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++; // 次の行へ進む } 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個の枠が埋まる } }

質問の回答(追加の質問)に関しては、対象となる日にち(0から始まるので実日にち-1)と解釈されれば良いのでは?

それにしても、このサイト質問に回答中にエラー??

イメージ説明
変な動作。。。

投稿2016/12/04 11:12

編集2016/12/04 11:21
MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

切り分けて考えれば良いかと思います。
元々for

for(開始時処理;繰り返し条件;再び繰り返す時の処理) ※各項目は省略も可能

で普通に例文などでは、

for(i=0;i<10;i++) { ....//なんかの処理 }

のように使われます。
また

wd %= 7;

は既知(既に定義された)変数wdに対して剰余(整数として、ある数で割った余り)が入ります。
例えば元々wdが10であれば質問のソースでは107で割った余りの3が格納され、3を開始時の値として7を超えない間に繰り返し処理を行います。
例ではforに至るまでにwdが宣言、何かの数字が格納されていると考えます。

投稿2016/12/04 10:29

編集2016/12/04 10:37
MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/04 10:55

ありがとうございましたよくわかりました。質問を更新しています。教科書の解説はこれで正しいのでしょうか?
MasahikoHirata

2016/12/04 11:03

一度質問を再編集されての投稿が良いかと。 質問編集の際に`<code>`を用いて、ソースをコピペ。するtこのサイトでは編集して読みやすく表示していただけます。しかしバグがあるようで、’ベストアンサー’がレポートでは出て、何で?状態に。 まずは質問文を再度編集される事を望みます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問