マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第11章 マルチスレッドプログラミング
第10話 第9話Ⅰの答え合わせ

(
私は派生スレッド:私は派生スレッド:0です。私は派生スレッド:1です。私は派生スレッド:4です。私は派生スレッド:3です。私は派生スレッド:5です。私は派生スレッド:6です。2私は派生スレッド:7です。です。私は派生スレッド:8私は派生スレッド:です。9です。私は派生スレッド:10です。私は派生スレッド:11です。私は派生スレッド:12です。私は派生スレッド:13です。私は派生スレッド:14です。私は派生スレッド:15です。
)
#pragma warning(disable: 4996)//第2編のために必要
#include<iostream>//インクルードファイルiostreamの読み込み
#include<conio.h>//while(!_kbhit());を使うためのお呪い
#include<string> //文字列変数を使えるようにするために組み込む
#include <iomanip> //setprecisionを使えるように組み込む
#include <cmath>//powなどを使うときに必要
#include <ctime>//time()(←現時刻発生する関数)を使うために必要
using namespace std;//coutを使うときに必要なお呪い
#include <process.h>//_beginthreadを使うために必要
void 変身の術関数(void* aa);//スレッドを派生させる関数
const size_t th = 16;
size_t 継続[th];//第11章第5話のようにしてもよいが5次で25個の1、6次で36個の1が必要になるので下記の赤色のようにして問題をクリア
int main() {
clock_t hj, ow;
hj = clock();
size_t ii[th];
for (size_t i = 0; i < th; i += 1) {
ii[i] = i;
_beginthread(変身の術関数, 0, &ii[i]); //新しいスレッドを起動して、そのスレッド上で変身の術関数を展開せよの命令
}
while (1) {//全スレッドが終了するまで待機させる
size_t 合計 = 0;
for (size_t i = 0; i < th; i++)合計 += 継続[i];
if (合計 == 0)break;
}
while (!_kbhit());//待機させるための命令
return(0);
}
void 変身の術関数(void* aa) {//マルチスレッド
size_t a = *(size_t*)aa;
cout << "私は派生スレッド:" << a << "です。";
継続[th] = 0;
}
Ⅱ 各スレッド毎部屋番号0にのみ生徒の出席番号を入れてください。
その際のⅠの表示は外します。
int main()の上に
size_t a[th][n][n];//魔方陣を形成するための作業用3次元配列
size_t y[th];//縦座標
size_t x[th];//横座標
size_t b[n][n];//y座標・x座標形成のための2次元配列
を定義して、魔方陣自動生成で使った
void 2次座標生成();のプロトタイプ宣言と本体も入れておいてください。
本体
void 2次座標生成() {//y横座標とx縦座標生成
int i, j, c;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
b[i][j] = -1;
}
}
for (i = 0; i < n; i++) {
b[i][i] = i;
}
c = n - 1;
for (i = 0; i < n; i++) {
if (b[i][n - 1 - i] == -1) {
c++;
b[i][n - 1 - i] = c;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (b[i][j] == -1) {
c++;
b[i][j] = c;
}
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
x[b[i][j]] = j;
y[b[i][j]] = i;
}
}
}
も入れておいて、a[p][y[0]][x[0]]に生徒の出席番号を代入してコンソール画面への表示も忘れずに行ってください。

(
出席番号出席番号出席番号出席番号出席番号6 2出席番号 出席番号出席番号出席番号出席番号出席番号14 出席番号出席番号4 出席番号12 5 13 1 15 7 出席番号8 10 11 16 出席番号9 3
)
16のスレッドがコンソール画面に同時に書き込むので表示はぐちゃぐちゃになります。
に挑戦してください。