マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第7章 関数の学習
第11話 1次元配列でなく2つの引数にして送ったらどうか?
前話課題解答例
#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,int y);
//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, int y) {
int u;//交換のための受け皿
u = x;//xのデータがyのデータに上書きされる前にuにxのデータを保存
x = y;//yのデータでxのデータを上書きする
y = u;//xの元データでyのデータを上書き
}
//fの任務は対角線部分を点対称移動させることである
void f(int a[n][n]) {
//対角線点対称移動
for (int i = 0; i < n / 2; i++) {
int x = a[i][i];
int y = a[n - i - 1][n - i - 1];
交換係社員(x, y);
a[i][i] = x;
a[n - i - 1][n - i - 1] = y;
}
//対角線点対称移動終了
}
//gの任務は緑部分を線対称移動させることである
void g(int a[n][n]) {
//緑の部分の交換開始
for (int i = 0; i < n / 2; i++) {
int x = a[i][(2 + i) % (n / 2)];
int y = a[n - i - 1][(2 + i) % (n / 2)];
交換係社員(x, y);
a[i][(2 + i) % (n / 2)] = x;
a[n - i - 1][(2 + i) % (n / 2)] = y;
}
//緑の部分の交換終了
}
//hの任務は明るい紫部分を線対称移動させることである
void h(int a[n][n]) {
//明るい紫の部分の交換開始
for (int i = 0; i < n / 2; i++) {
int x = a[i][(3 + i) % (n / 2)];
int y = a[i][n - 1 - ((3 + i) % (n / 2))];
交換係社員(x, y);
a[i] [(3 + i) % (n / 2)] = x;
a[i][n - 1 - ((3 + i) % (n / 2))] = x;
}
//明るい紫の部分の交換終了
}
このコードは一見正しそうです。
ですが、本当でしょうか。
F5を押せば答が出ます。
F5を押すと驚愕の結果が出ます。
第7章第10話へ 第7章第12話へ
本講義トップへ