見出し画像

配列を覚えて欲しい!

こんにちは「つけらっとゲームス」プログラム担当のとちです。

何度か記事にしているのでご存知の方もいらっしゃると思いますが、ゲームを作る以外にも母校の専門学校で外部講師をやってます。

担当科目は「システム設計」です。
なので、わたしが担当している時間は、設計部分(設計書、仕様書、アルゴリズム等々)の勉強がメインとなります。

さて「今回は配列を覚えて欲しい!」ということで配列について詳しく書いてみようと思います。

同テーマの関連記事として「変数を覚えて欲しい!」があります。
先に以下の記事を読むと今回のお話も分かりやすいです!



最初に理解したいこと

高校で2022年度からプログラミング教育が必修になったという話、ニュースか何かで聞いたことがあると思います。小学校や中学校でもプログラミング教育が必修となっていますね。

プログラミング教育必修といっても、学生全員がプログラマになる勉強をするというよりは、情報化社会における基礎知識と、それに付随するソフトの使い方を勉強するようです。

(新聞記事がリンク切れになってたらゴメンなさい…)
というわけで、いま高校でどんな勉強をしているのか気になって教科書を買いにいってきました。この歳になって自分用に高校の教科書を買うという経験はなかなか無いよねぇ。

変数や配列は詰みポイント

人にモノを教えている立場でもありますが、自分なりにも勉強していて思ったのが「理解していないと詰むポイントあるわ!」なんです。

前述の関連記事「変数を覚えて欲しい!」も詰みポイントのひとつですね。

「変数」「配列」はプログラミングを学ぶ上で、まず理解すべきポイント。これをふわっと、それっぽく、なんとなく覚えたつもりになると詰みます。

自分の中で納得できるところまで持って行けたら大丈夫。
なので、専門学校生だけじゃなく、学校で「配列」って習ったけど、いまいち分かってないんだよなーって高校生も、この記事で復習しましょう。

大丈夫。怖くない!
わたしも高校生の頃は情報処理科のクラスの中で最下位争いをしていた学生でした。でも、それなりなゲームをそれなりに作れてますから!


配列とはなんぞや?

ここでいう「配列」は、あくまでコンピュータ関連、プログラミング関連で使われる「配列」と言われるモノ(この記事を読んでいる方で配列と言われてDNAの塩基配列などを思い浮かべる方もいないと思いますが念のため…)

では改めて「配列」をウィキペディアさんに説明してもらうと、

配列とは

複数の要素(値)の集合を格納・管理するのに用いられるデータ構造が配列である。数学のベクトルおよび行列に近い概念であり、実際にベクトルおよび行列をプログラム上で表現する場合に配列が使われることが多い。同様に複数要素の集合を管理するデータ構造(コレクションあるいはコンテナ)には連結リストハッシュテーブルなどがあるが、通常はメモリアドレス上での連続性の違いなどから配列とは区別される。1次元の配列は特に線形配列 (linear array) とも呼ばれる。

ウィキペディア(Wikipedia)より冒頭部を引用

うん、わからん!
何を書いているのか読んでもわかりませんね!

このあとウィキペディアではC言語で解説しているのですが、
まずは図を使って「変数を使った場合」の解説してみます。


変数を使った場合

とあるテストの点数です。五教科の合計点と平均点を求めます。
頑張れば手計算で求められますが大量にデータがあったら大変です。
コンピュータにやらせましょう。

まずは用意する変数を図で表現してみますね。
前回「変数を覚えて欲しい!」で解説したように箱を用いて説明しますと、

変数を用意

こんな感じになります。各教科の点数を入れる箱を用意しました!
合計点と平均点の箱も必要となりますね。一緒に用意しておきます。

koku = 国語の点数を入れる変数
suug = 数学の点数を入れる変数
rika = 理科の点数を入れる変数
syak = 社会の点数を入れる変数
eigo = 英語の点数を入れる変数
Goukei = 合計点を入れる変数
Heikin = 平均点を入れる変数

各教科の点数を代入

各教科の点数を入れました。
では、次に合計点と平均点を計算します。

合計点の求め方は、Goukei = koku + suug + rika + syak + eigo ですね。
平均点の求め方は、Heikin = Goukei ÷ 5 となります。

合計点と平均点を求めます!

ここで大事なのが
「Goukei = 90 + 98 + 82 + 76 +84」 ではなく、
「Goukei = koku + suug + rika + syak + eigo」 だという部分です。

誰のテストの点数でもデータが同じであれば、合計点数を求める方法に変わりはありません。

事前に合計点を求めてしまえば平均点の計算の仕方も
「Heikin = 430 ÷ 5」 ではなく、
「Heikin = Goukei ÷ 5」  という考え方ですね。

では、これをプログラムコードで表現してみます。
わたしはUnity(c#)を使うので、以下はUnityを起動して試してみました。

//
// 変数を定義する
//

int koku;												// 変数[国語の点数]
int suug;												// 変数[数学の点数]
int rika;												// 変数[理科の点数]
int syak;												// 変数[社会の点数]
int eigo;												// 変数[英語の点数]

int Goukei;												// 変数[合計点]
int Heikin;												// 変数[平均点]

//
// データを読んで各変数に五教科の点数を入れたとする...
//

Goukei = koku + suug + rika + syak + eigo;				// 合計点の計算
Heikin = Goukei / 5;									// 平均点の計算
print("合計点:" + Goukei + " / 平均点:" + Heikin);		// コンソールに表示
コンソールの表示(例のデータを読んだ場合)

配列を使った場合

先程と同じデータですが今度は配列で表現してみますね。

箱で表現している部分に注目してください。
koku だった箱の名前が Ten[0] になってますね。他の点数も変化してます。

suug が Ten[1]
rika が Ten[2]
syak が Ten[3]
eigo が Ten[4] になっています。

これまでの例では1つのデータに対し、1つの変数を用意していました。
今は五教科ですが教科が増えたら、名前を付けた変数をその分だけ用意しないといけません。面倒くさいですよね……

そこで、その代わりに Ten と名前を付けた配列を用意しました。
この配列のデータを入れる箱、それぞれの箱を要素と呼びます。

Ten の後にカッコ付けで数字が付けられています。
これを添字、添え字(そえじ)と言います。

配列を図で表現するとこんな感じでしょうか

これをプログラムコード(c#)で表現してみます。

//
// 変数を定義する
//

int[] Ten = new int[5];									// 配列
int   Goukei;											// 変数[合計点]
int   Heikin;											// 変数[平均点]

//
// データを読んで各変数に五教科の点数を入れたとする...
//

Goukei = Ten[0] + Ten[1] + Ten[2] + Ten[3] + Ten[4];	// 合計点の計算
Heikin = Goukei / 5;									// 平均点の計算

print("合計点:" + Goukei + " / 平均点:" + Heikin);
結果は同じです!

はい、これが配列です。わかりましたか!?

待って待って! 前より面倒臭くない!?

そうなんですよね、この例では配列の必要性がわかりません。
やはり、必要性を感じないと覚えないと思うんです。

そこでプログラムコード的には少し難しいかもしれませんが、
「こういう処理なら配列を使うね!」という例をお見せしたいと思います。


90点以上の教科名を表示する

90点以上の教科名をコンソールに表示するプログラムを考えてみましょう。

変数のみの場合

まずは変数のみを使った場合で考えてみます!
以下のデータを使用します。

期末テストって教科が多くて大変ですよね!

このデータの90点以上は「国語」「数学」「音楽」「技術家庭」です。
まずフローチャートを書いてみましょう。

フローチャートとは?

コンピュータにやらせる処理の流れを、わかりやすく図で表現したものをフローチャート(流れ図)と言います。

※ フローチャートについては次の記事に詳しく書きましたが、いまは単純に「そういうものがある」と頭の片隅に置いてください。

フローチャートで表現するとこんな感じです。

処理を図で表現したモノをフローチャート(流れ図)といいます!

プログラムコード

では、先ほどのフローチャートをプログラムコードにしてみます。

int koku = 90;								// 変数[国語の点数]
int suug = 98;								// 変数[数学の点数]
int rika = 82;								// 変数[理科の点数]
int syak = 76;								// 変数[社会の点数]
int eigo = 84;								// 変数[英語の点数]
int onga = 91;								// 変数[音楽の点数]
int hota = 87;								// 変数[保健体育の点数]
int biju = 79;								// 変数[美術の点数]
int gika = 93;								// 変数[技術家庭の点数]

if(koku >= 90){print("国語");}				// 国語の点数が90点以上か?
if(suug >= 90){print("数学");}				// 数学の点数が90点以上か?
if(rika >= 90){print("理科");}				// 理科の点数が90点以上か?
if(syak >= 90){print("社会");}				// 社会の点数が90点以上か?
if(eigo >= 90){print("英語");}				// 英語の点数が90点以上か?
if(onga >= 90){print("音楽");}				// 音楽の点数が90点以上か?
if(hota >= 90){print("保健体育");}			// 保健体育の点数が90点以上か?
if(biju >= 90){print("美術");}				// 美術の点数が90点以上か?
if(gika >= 90){print("技術家庭");}			// 技術家庭の点数が90点以上か?

プログラムコードの中身を軽く説明しますと…
9つある教科の変数を作り、その変数にデータも代入しています。
各変数に対し90点以上か判断し、90点以上なら教科名を表示しています。

このプログラムコードを実行してみるとコンソールの表示は「国語」「数学」「音楽」「技術家庭」となりました。想定通りですね。

配列を用いた場合

次は配列を用いて考えてみましょう。
まずは図で表現しますね。

点数を入れておく変数の代わりに、配列 Ten を用意しました。
ついでに教科名を入れておく、配列 Mei も用意しておきます。
90点以上は「国語」「数学」「音楽」「技術家庭」でしたよね。

こちらも一旦、フローチャートにしてみます。

置いている図形の数が減りましたね!

配列を用いたプログラムコード

では、先ほどのフローチャートをプログラムコードにしてみます。

int[]    Ten = new int[9]{90,98,82,76,84,91,87,79,93};						
string[] Mei = new string[9]{"国語","数学","理科","社会","英語","音楽","保健体育","美術","技術家庭"};

for(int ix = 0; ix < Ten.Length; ix++)		// ixは0から1ずつ増えて、Tenの配列長未満の間は繰り返す
{
	if(Ten[ix] >= 90){print(Mei[ix]);}		// その教科が90点以上の場合、配列Meiを表示する
}

何か難しそうなコードになりましたが、さっきに比べると短いですね。

要素が9個の配列TenMei を定義し、その中にデータを入れています。

for文はコードの中のコメントの通り、変数ix が0から1ずつ増えて、Tenの配列長未満の間は繰り返す処理です。

プログラムコードの中身、いまいち分からなくてもいいです。
今は、そういうもんだと思ってください。

そのかわり添字に注目してください。添字ってなんでしたっけ?
要素の順番、番号を示す数字でしたよね?

Ten[添字] ですし、Mei[添字] です。

※ プログラム言語によっては Ten(添字) の様に丸カッコで表記します。

その添字に数字ではなく変数ix を入れています。変数は変化します。
つまり、ixの変化を利用すると類似処理をするなら、1行のコードでOKなんですよ。

当たり前ですが処理結果は同じですね!

おわりに

いかがでしょうか? 難しいですよね?
でも、これが分からないと詰んじゃうんですよ。

説明されると何となくわかる、じゃぁ飲み込めたかというと難しい。
これを自分の中で納得できるレベルまで飲み込みましょう。

関連記事としてこんなのもあります。お時間あったらご覧くださいね~!

ちなみにプログラミング学習の関連記事は以下にまとめてます!

すごく難しそうなことを書いていますが、普段はこんなゲームを作っているサークルの人です。ご興味がございましたらご覧ください(↓)

それでは、また別の記事でお会いできるのを楽しみにしております!

弊サークルの活動を応援してもいいなと感じていただけたら嬉しいです。 いただいたサポートは「地域/若者向けの展示会費用」「ゲーム開発費」として使わせていただきます! サポートよろしくお願い致します~🐱🐭