マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第7章 関数の学習

第10話 交換係社員に交換業務を任せる

前話課題解答例
#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

const int n = 8;//具体的な数字を使うのではなく、 n を使うと汎用性のあるプログラムになる!

//部長の任務は社長の仕事の一部を引き受け、
//社員(部の社員)に仕事を命令することです。
void 部長(int a[n][n]);

void 課長1(int a[n][n]);//自然配列担当社員と表示担当社員の統率を担当

void 課長2(int a[n][n]);//対角線部分交換社員fと表示担当職員の統率を担当

void 課長3(int a[n][n]);//緑部分交換社員gと表示担当職員の統率を担当

void 課長4(int a[n][n]);//明るい紫部分交換社員fと表示担当職員の統率を担当

void 自然配列担当社員(int a[n][n]);

void 表示担当社員(int a[n][n]);

void 交換係社員(int x[2]);

//fの任務は各対角線部分を点対称移動させることである
void f(int a[n][n]);

//gの任務は各対角線部分を点対称移動させることである
void g(int a[n][n]);

//hの任務は各対角線部分を点対称移動させることである
void h(int a[n][n]);

int main() {//私は社長だ。

  int a[n][n];//2次元配列を定義(用意)した。

  部長(a);//部長に統率を依頼 

  while (!_kbhit());//待機させるための命令

  return 0;//int main() を終わるためのお呪い

}

void 部長(int a[n][n]) {

  課長1(a);//自然配列担当社員と表示担当社員の統率を担当

  課長2(a);//対角線部分交換社員fと表示担当職員の統率を担当

  課長3(a);//緑部分交換社員gと表示担当職員の統率を担当

  課長4(a);//明るい紫部分交換社員fと表示担当職員の統率を担当

}

void 課長1(int a[n][n]) {

  自然配列担当社員(a);

  表示担当社員(a);

}

void 課長2(int a[n][n]) {

  f(a);//対角線部分交換

  cout << endl;

  表示担当社員(a);

}

void 課長3(int a[n][n]) {

  g(a);//緑部分交換

  cout << endl;

  表示担当社員(a);

}

void 課長4(int a[n][n]) {

  h(a);//明るい紫部分交換

  cout << endl;

  表示担当社員(a);

}


void 自然配列担当社員(int a[n][n]) {

  for (int i = 0; i < n; i++) {

    for (int j = 0; j < n; j++) {

      a[i][j] = n * i + j + 1;//自然配列を2次元配列に収納

    }

  }

}

void 表示担当社員(int a[n][n]) {

  //自然配列を体裁を整えてコンソール画面に表示する
  for (int i = 0; i < n; i++) {

    for (int j = 0; j < n; j++) {

      if (a[i][j] < 10)cout << " ";

      cout << a[i][j] << " ";

    }

    cout << endl;

  }

}

void 交換係社員(int x[2]) {

  int u;//交換のための受け皿

  u = x[0];//x[0]のデータがyのデータに上書きされる前にuにx[0]のデータを保存

  x[0] = x[1];//x[1]のデータでx[0]のデータを上書きする

  x[1] = u;//x[0]の元データでx[1]のデータを上書き

}

//fの任務は対角線部分を点対称移動させることである
void f(int a[n][n]) {

  //対角線点対称移動
  for (int i = 0; i < n / 2; i++) {

    int x[2];

    x[0] = a[i][i];

    x[1] = a[n - i - 1][n - i - 1];

    交換係社員(x);

    a[i][i] = x[0];

    a[n - i - 1][n - i - 1] = x[1];

  }
  //対角線点対称移動終了

}

//gの任務は緑部分を線対称移動させることである
void g(int a[n][n]) {

  //緑の部分の交換開始
  for (int i = 0; i < n / 2; i++) {

    int x[2];

    x[0] = a[i][(2 + i) % (n / 2)];

    x[1] = a[n - i - 1][(2 + i) % (n / 2)];

    交換係社員(x);

    a[i][(2 + i) % (n / 2)] = x[0];

    a[n - i - 1][(2 + i) % (n / 2)] = x[1];

}
//緑の部分の交換終了

}

//hの任務は明るい紫部分を線対称移動させることである
void h(int a[n][n]) {

  //明るい紫の部分の交換開始
  for (int i = 0; i < n / 2; i++) {

    int x[2];

    x[0] = a[i][(3 + i) % (n / 2)];

    x[1] = a[i][n - 1 - ((3 + i) % (n / 2))];

    交換係社員(x);

    a[i] [(3 + i) % (n / 2)] = x[0];

    a[i][n - 1 - ((3 + i) % (n / 2))] = x[1];

  }
  //明るい紫の部分の交換終了

}
実行結果


1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

64 2 3 4 5 6 7 8
9 55 11 12 13 14 15 16
17 18 46 20 21 22 23 24
25 26 27 37 29 30 31 32
33 34 35 36 28 38 39 40
41 42 43 44 45 19 47 48
49 50 51 52 53 54 10 56
57 58 59 60 61 62 63 1

64 2 59 4 5 6 7 8
9 55 11 52 13 14 15 16
41 18 46 20 21 22 23 24
25 34 27 37 29 30 31 32
33 26 35 36 28 38 39 40
17 42 43 44 45 19 47 48
49 50 51 12 53 54 10 56
57 58 3 60 61 62 63 1

64 2 59 5 4 6 7 8
16 55 11 52 13 14 15 9
41 23 46 20 21 22 18 24
25 34 30 37 29 27 31 32
33 26 35 36 28 38 39 40
17 42 43 44 45 19 47 48
49 50 51 12 53 54 10 56
57 58 3 60 61 62 63 1


ここで皆さんに質問です。

今回は

  int x[2];

を定義して送りましたが、

配列でなく
 
    int x = a[i][i];

    x[1] = a[n - i - 1][n - i - 1];

    交換係社員(x, y);

    a[i][i] = x;

    a[n - i - 1][n - i - 1] = y;

として、

void 交換係社員(int x, int y);//引数は複数可能

とした成功するでしょうか。







第7章第9話へ 第7章第11話へ

本講義トップへ