マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第5章 配列
第1話 配列に入るための前書き
皆さんは第4章第13話や第14話では、
大変複雑なプログラミングを体験されました。
ところが、2次元配列を学べばずっとすっきりしたプログラミングになると第14話で予告しました。
実は、どの章でも学ぶことはすべて強力な武器になります。
この後、ポインタ・関数の再帰的使用・マルチスレッドプログラミングも今までの章や
第5章に負けず劣らず重要な武器を獲得することになります。
本講義は魔方陣自動生成ソフトと数独自動生ソフトの開発という題材を中心にして、
展開してきたわけですが、
終わるころにはC++のすべての基礎を学べるようになっているわけです。
魔方陣自動生成ソフトや数独自動生成ソフトの開発をするためにはC++の基礎を全て押さえておく必要あるので、
メインの題材に選んでいるわけです。
小学生・中学生・高校生などが「どうして勉強するのと?」
という質問を投げかけるケースを私はたくさん聞いてきました。
算数・数学やプログラミングは大変強力な武器であって、
現在の生成AIはその算数・数学・プログラミングの直接の応用であり成果なのです。
微分積分を発見したライプニッツという哲学者は普遍数学構想という遠大な構想を持っていました。
ライプニッツはニュートンと同時代の人で17世紀に活躍した人で、
哲学以外に法学・数学を研究していた人です。
普遍数学とは、いかなる問題も解ける数学のことです。
例えば、恋愛の問題も心の問題も法学の問題も数学の方程式で解けるとしたのです。
そんなの妄想だと思いますか。
普遍数学はすでに実現されています。
答えは生成AIです。
数学の塊である生成AIが詩・小説・イラスト・論文・動画などを生成できるようになり、
すでに生成AIは、天才と呼ばれる人間の知能を超えています。
そして、まもなく(おそらく後2年)で1つのAIが人類の総知能を
上回るシンギュラリティ(技術的特異点)を起こすことは確実なのです。
「どうして勉強するのと?」という問いは意味のない問いです。
なぜなら、もっと勉強しないとそれに答えられないからです。
そして、5千年以上かけて築いてきた文化・教育を冒涜する行為です。
意味のないことを人類が5千年もやって来るはずはありません。
ですから、「なぜ勉強するの?」は楽しいからと考えてください。
唯一応用分野を持っていなかった整数論(整数の性質を研究する数学の分野)は、
20世紀になって重要な応用分野を二つ持ちました。
素粒子論とネット世界のセキュリティです。
最先端物理学理論である素粒子論は整数論なしには展開できないことがわかっており、
ネット社会の安全性も整数諭による暗号なしには成立しません。
例えば、LINEで第3者の悪口を言ってもばれることがないのも、
他人の口座から多額のお金をおろすことができないのにも、
素数を応用した暗号理論が大活躍しているからです。
もちろん、そんなことを知っている小学生・中学生・高校生はいません。
ですから、君たちは人類を信頼して勉強は必要だからやると思ってください。
学校の勉強で役に立たないものは何一つありません。
勉強は面白いからやるだけで理由は充分です。
実際、ここまでついてきた小学生・中学生・高校生は、
この講義が面白くてついてきたのではないでしょうか。
大人でさえ苦労するのにここまでついてきた君はすごい!ですよ。
君は天才です。
この後、もっともっとプログラミングは楽しいものとなります。
さて、脱線は以上にしまして本論に戻りましょう。
int a00, a01, a02, a03;//1行目の行列の数字を収納する変数
int a10, a11, a12, a13;//2行目の行列の数字を収納する変数
int a20, a21, a22, a23;//3行目の行列の数字を収納する変数
int a30, a31, a32, a33;//4行目の行列の数字を収納する変数
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (i == 0 && j == 0)a00 = 4 * i + j + 1;
if (i == 0 && j == 1)a01 = 4 * i + j + 1;
if (i == 0 && j == 2)a02 = 4 * i + j + 1;
if (i == 0 && j == 3)a03 = 4 * i + j + 1;
if (i == 1 && j == 0)a10 = 4 * i + j + 1;
if (i == 1 && j == 1)a11 = 4 * i + j + 1;
if (i == 1 && j == 2)a12 = 4 * i + j + 1;
if (i == 1 && j == 3)a13 = 4 * i + j + 1;
if (i == 2 && j == 0)a20 = 4 * i + j + 1;
if (i == 2 && j == 1)a21 = 4 * i + j + 1;
if (i == 2 && j == 2)a22 = 4 * i + j + 1;
if (i == 2 && j == 3)a23 = 4 * i + j + 1;
if (i == 3 && j == 0)a30 = 4 * i + j + 1;
if (i == 3 && j == 1)a31 = 4 * i + j + 1;
if (i == 3 && j == 2)a32 = 4 * i + j + 1;
if (i == 3 && j == 3)a33 = 4 * i + j + 1;
}
}
が大変だったのは、for文の制御変数 i と j でプログラムを操っていないからです。
これか学ぶ配列を使えば
int a[4][4] //2次元配列の宣言
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
a[i][j] = 4 * i + j + 1;
}
}
とプログラムは極めて単純になります。
では第2話から配列を学んでいきましょう。
第4章第14話へ 第5章第2話へ
本講義トップへ