マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第4章 if文(もしもボックス))
第10話 第9話問題解答
void 2次元for文() {
//横と縦の2方向を持つ2次元for文体験
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (4 * i + j + 1 < 10)cout << " ";
cout << ? * i + j + 1;
}
cout << endl;
}
}
実行画面

(
1 2 3 4
5 6 7 8
9 10 11 12
)
解答
void 2次元for文() {
//横と縦の2方向を持つ2次元for文体験
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (4 * i + j + 1 < 10)cout << " ";
cout << 4 * i + j + 1;
}
cout << endl;
}
}
なぜ4なのでしょうか。納得できない方は前話の2例を再掲しますからよく読んで考えてください。
何度も申し上げてきたように、先を読んでから前に戻り読み返すことを繰り返す以外に
プログラミングを理解する方法はありません。
そろそろ、第1章第1話から読み返してもよい時期です。
そうするとなんとなくしかわかっていなかったことがかなりすっきりわかるはずです。
トレース対象3 * i + j + 1
| j = 0 | あ | j = 1 | あ | j = 2 | |||||||||||||||
| i = 0 | 3 * 0 + 0 + 1 = 1 | 3 * 0 + 1 + 1 = 2 | 3 * 0 + 2 + 1 = 3 | ||||||||||||||||
| i = 1 | 3 * 1 + 0 + 1 = 4 | 3 * 1 + 1 + 1 = 5 | 3 * 1 + 2 + 1 = 6 | ||||||||||||||||
少し2次元for文() のコードを修正します。
void 2次元for文() {
//横と縦の2方向を持つ2次元for文体験
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << 3 * i + j + 1;
}
cout << endl;
}
}
実行画面

(
1 2 3
4 5 6
7 8 9
)
修正版のトレース
トレース対象3 * i + j + 1
| j = 0 | あ | j = 1 | あ | j = 2 | |||||||||||||||
| i = 0 | 3 * 0 + 0 + 1 = 1 | 3 * 0 + 1 + 1 = 2 | 3 * 0 + 2 + 1 = 3 | ||||||||||||||||
| i = 1 | 3 * 1 + 0 + 1 = 4 | 3 * 1 + 1 + 1 = 5 | 3 * 1 + 2 + 1 = 6 | ||||||||||||||||
| i = 2 | 3 * 2 + 0 + 1 = 7 | 3 * 2 + 1 + 1 = 8 | 3 * 2 + 2 + 1 = 9 |
前話の場合の3はjが0,1,2の3通りの値をとるからです。
それに対してjが0,1,2,3と4通りの値をとるから
4 * i + j + 1となります。
納得できない方は
void 2次元for文() {
//横と縦の2方向を持つ2次元for文体験
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << 3 * i + j + 1;
}
cout << endl;
}
}
実行画面

(
1 2 3
4 5 6
7 8 9
)
の場合は1~9まで生成させることでした。
トレース対象3 * i + j + 1
| j = 0 | あ | j = 1 | あ | j = 2 | |||||||||||||||
| i = 0 | 3 * 0 + 0 + 1 = 1 | 3 * 0 + 1 + 1 = 2 | 3 * 0 + 2 + 1 = 3 | ||||||||||||||||
| i = 1 | 3 * 1 + 0 + 1 = 4 | 3 * 1 + 1 + 1 = 5 | 3 * 1 + 2 + 1 = 6 | ||||||||||||||||
| i = 2 | 3 * 2 + 0 + 1 = 7 | 3 * 2 + 1 + 1 = 8 | 3 * 2 + 2 + 1 = 9 |
1 2 3 の後は4 5 6です。差をとると3 3 3 とすべて3です。
つまり、3飛躍させなければならないから
3 * i + j + 1
となるわけです。
ですが、今回は

(
1 2 3 4
5 6 7 8
9 10 11 12
)
4飛躍させなければならないから
4 * i + j + 1
となるわけです。
横方向に 4 個あるから、4 を掛ける
iは行(横列)に対応しjは列(縦列)に対応します。
横方向と縦方向の2方向あるのが2次元for文です。
次にトレースです。
トレース対象4 * i + j + 1
| j = 0 | あ | j = 1 | あ | j = 2 | j = 3 | |||||||||||||
| i = 0 | 4 * 0 + 0 + 1 = 1 | 4 * 0 + 1 + 1 = 2 | 4 * 0 + 2 + 1 = 3 | 4 * 0 + 3 + 1 = 4 | ||||||||||||||
| i = 1 | 4 * 1 + 0 + 1 = 5 | 4 * 1 + 1 + 1 = 6 | 4 * 1 + 2 + 1 = 7 | 4 * 1 + 3 + 1 = 8 | ||||||||||||||
| i = 2 | 4 * 2 + 0 + 1 = 9 | 4 * 2 + 1 + 1 = 10 | 4 * 2 + 2 + 1 = 11 | 4 * 2 + 3 + 1 = 12 | ||||||||||||||
では第11話の課題です。
実行結果が

(
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
)
となるコードを考えてください。
第4章第9話へ 第4章第11話へ
本講義トップへ