マルチスレッド版数独自動生成ソフト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話へ

本講義トップへ