マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第4章 if文(もしもボックス))
第11話 4×4(4行4列)行列
実行画面が

(
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
)
実行画面のように数字が並んでいるものを行列と言います。
行(横列 行という言葉を忘れる前の反復をやって覚えてください。ここまで読んできたあなたはプログラマーです。正しい用語を使いましょう)
列(縦列 列という言葉も忘れる前の反復をやって覚えてください)
行と列を持つので行列です。
となるコード例
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
#include <ctime>//time()(←現時刻発生する関数)を使うために必要
using namespace std;//coutを使うときに必要なお呪い
void 2次元for文();//横と縦の2方向を持つ2次元for文体験
int main() {//私は社長だ。
2次元for文();
while (!_kbhit());//待機させるための命令
return(0);//int main()終わるためのお呪い
}
void 2次元for文() {
//横と縦の2方向を持つ2次元for文体験
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (4 * i + j + 1 < 10)cout << " ";
cout << 4 * i + j + 1 << " ";
}
cout << endl;
}
}
トレース対象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 | |||||||||||||||
| i = 3 | 4 * 3 + 2 + 1 = 13 | 4 * 3 + 2 + 1 = 14 | 4 * 3 + 2 + 1 = 15 | 4 * 3 + 2 + 1 = 16 | |||||||||||||||

(
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
)
を作っていただいたことには理由があります。
これを少しいじっただけで4次魔方陣ができるのです。
対角線部分を中心に対して点対称移動すると

(
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
)
4次魔方陣になるのです。
実際に4行の合計、4列の合計、2本の対角線の合計を計算してみてください。
1行目
16 + 2 + 3 + 13 = 34
2行目
5 + 11 + 10 + 8 = 34
3行目
9 + 7 + 6 + 12 = 34
4行目
4 + 14 + 15 + 1 = 34
1列目
16 + 5 + 9 + 13 = 34
2列目
2 + 11 +7 +14 = 34
3列目
3 + 10 + 6 + 15 = 34
4列目
13 + 8 + 12 + 1 = 34
対角線
16 + 11 + 6 + 1 = 34
逆対角線
13 +10 + 7 + 4 = 34
ですべての合計が34です。
不思議ですね。
自然配列を対角線部分だけ点対称移動するでけで4次魔方陣になるのです。
2次元配列(配列は次章で学ぶ項目です)を学んでいない段階で

4次魔方陣を作り出すことは至難の業です。
私も大分苦労しました。
ですが、ときには『ねばってねばって』をやることがプログラミングには必要です。
とはいえ、いきなり次話の課題にしたのでは初心者には負担が大きすぎます。
そこで、次話ではデータの交換を学びます。
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
#include <ctime>//time()(←現時刻発生する関数)を使うために必要
using namespace std;//coutを使うときに必要なお呪い
void データ交換();//二つのデータを交換する
int main() {//私は社長だ。
cout << "データ交換プログラム" << endl;
データ交換();//二つのデータを交換する
while (!_kbhit());//待機させるための命令
return(0);//int main()終わるためのお呪い
}
void データ交換() {
//二つのデータを交換する
int a, b;//整数型の変数を二つ用意
a = 1 + rand() % 10;
b = 1 + rand() % 10;
cout << "a = " << a << " b = "
<< b << endl;
}
実行画面

(
データ交換プログラム
a = 2 b = 8
)
皆さん a のデータと b のデータを交換するにはどうしたらよいか考えてください。

(
データ交換プログラム
a = 2 b = 8
データ交換
a = 8 b = 2
)
簡単そうに見えますが、結構難しいですよ。
第4章第10話へ 第4章第12話へ
本講義トップへ