見出し画像

ハジメの一歩会④ 配列編

はい、かーでぃです。
早いもので、もう4回目ですね。今回から後半戦に突入です。前半はプログラミングの基本である変数・条件分岐・繰り返し処理を学びました。

後半戦はこれらを使いつつ、より可読性が高く、効率的なプログラムが組めるように、配列・関数・クラスについて説明したいと思います。
今回は、その中から配列の説明です。

配列とは何か…に入る前に、自分が配列と出会ったきっかけから。
中学か高校のころなので、もう30年以上前ですが、BASICでプログラムを作っているときに、大量の変数が必要になりました。
BASICなので宣言しなくてもいいんですが、大量の変数を扱うのがめんどい…って思って、なんかないかな…と調べたんですね。
そしたら、配列っていうのを見つけまして。でも、その時はこんな便利なモンだとは知らず、ただ大量の変数を一括で扱える、ぐらいにしか思っていませんでした。

ここで改めて配列とは…
連続した箱をイメージしてもらえばわかりやすいかと思います。りなたむ先生からは「たんすみたいなもの」というお言葉も頂きましたので、箱もあながち間違いではないかと(笑)
下の画像の右端に箱が縦に重なっている絵がありますが、これが配列をイメージするのにわかりやすいかと。
箱の中には、値が入っています。この例で行くと、一番上の箱には「安室零」、2番目の箱には「小林隼人」など。
箱を引き出しと置き換えれば、まさに「たんす」ですよね。
安室零や小林隼人を参照するためには、箱の番号(引き出しの番号)を指定します。それがname[0]の0や、name[1]の1になります。
この0や1のことを、添え字とかインデックスと呼びます。

この添え字、name[0]やname[1]のように直接指定することもできますが、変数を使って指定することもできます。

i=2
print(name[i])
--
八島未来

配列には、同じ意味を持つ値が連続して入ります。しかもそれを変数で変化させながら参照することもできます。
という話を前提にして、下記ですね。
配列変数nameに登録されている名前を全件出力するための処理はどうするのか…。
もちろん、name[0]、name[1]のように直接指定して書くこともできますし、仕様を満たすだけであれば、それでもOKです。
でもプログラムの効率性は低くなってしまいますよね。

で、前回やった繰り返し処理が活きるわけですね!!!

繰り返し処理を使うことで、下記のようにプログラムが短くて済むようになりました。

ここで、前回登場したfor文とは若干スタイルの違うfor文が出てきています。Pythonはfor ~in文、C#はfor each文になりますが、どちらも同じことを行うfor文です。
for文ではループする回数を指定する必要がありました。配列の数がわかっていれば、for文で回しても大丈夫です。ただ、1つ問題があります。わかりますか?
例えば配列の長さが変わってしまった場合。これまで30個だった配列が50個に増えた場合、通常のfor文では条件式を変更する必要がありました。
ところが、このfor~in文やfor each文ではその必要はありません。指定した配列の個数分ループする仕組みになっているからです。
下記の例では、配列変数nameの1番目の値"安室零"を変数nmに代入して、一回目のループを処理します。次に、2番目の値"小林隼人"を変数nmに代入して、2回目のループを処理します。
という風に、自動的に配列の添え字を進めながら最後まで処理してくれる便利な命令です。

それから添え字の話。勉強会の中でも少し話に上がりましたが、添え字がスタートする数値については、言語系や開発ツールによって、0から始まるか1から始まるか分かれるところです。

ということで、プチ問題ですね。
下記は第2回の条件分岐編で出した問題です。国語・数学・理科・社会・英語の5教科の得点を、第2回では下記のようにそれぞれを変数に入れて計算していました。
ここまでの会の中で、繰り返し処理と配列が使えるようになったので、それらを使ってプログラムを修正してみましょう!

配列にすると、下記のようなイメージになろうかと思います。0~4の添え字が付いた箱が準備されて、それぞれに各教科の点数が保存されているわけですね。
配列としては、数右側の上段(Pythonでの例です)
→ k=[80,67,90,100,50] が配列の宣言と初期化になります。
その後、for in文を使って配列を回して変数ttlに足し込みを行い、最後にif文で条件分岐を行って、合格/不合格の判定を行っています。

ちなみに、変数の時は変数名にintKokugoScoreとかintRikaScore等、どの強化の点数なのかをわかりやすく設定することもできるのですが、配列だとそれらは添え字による番号管理になります。
ので、添え字0=国語、添え字1=数学…のように、開発者が意識しなければなりません。
意識してないと、例えば国語の点数を修正しなければならなくなった時、配列の何番を修正すべきかわからなくなってしまいます。
そのためには仕様書に残すとか、プログラム中にコメントを残す等しましょう!!

ここまでは1次元配列と呼ばれるものです。エクセルでいうところの1列のみに該当します。でもエクセルは列と行の2つのベクトルがありますよ。配列では、これを2次元配列と呼びます。
下記はとある中学校のクラス人数を配列で表したものになります。1年1組は30人、1年2組は28人、1年3組は29人となっています。
配列で表すと…
 class[0][0]=30 … 1年1組
 class[0][1]=28 … 1年2組
 class[0][2]=29 … 1年3組
という風になります。2年生は最初の添え字が1に上がりますので、
 class[1][0]=28 … 2年1組
 class[1][1]=28 … 2年2組
となります。
エクセルではA列1行目、A列2行目と列と行でセルを指定できますが、配列では列や行ではなく、それぞれの添え字で指定することになります。

2次元配列まで考えが理解できれば、あとは次元数が増えても考え方は同じです。
エクセルでいうと、3次元だとシート別、4次元だとファイル別、5次元だとフォルダ別みたいな感じですかね?(余計にわからんか…??)

ということで、今週も宿題を用意しました。
先ほどはA中学1校でしたが、今度はB中学、C中学も加わり3校になりました。A中学のみの時は2次元配列でしたが、学校が増えたことで3次元配列で考えるのが一番スマートなやり方かな、と思います。

3次元配列で考えるのが一番スマートだとは思うのですが、2次元配列やなんだったら1次元配列でも組めたりします。
次元を落として処理するのは実用的ではないかもしれませんが、考え方を鍛えることもできますので、3次元で成功した方は是非2次元や1次元でも挑戦してみください。

初参加のもくだいさんから、素敵なお言葉頂きました!
そういって貰えると嬉しいです♪ありがとうございます!!

正解例

正解例(こんなやり方もあるよ編!)


ジャグ配列とは…
配列の中に配列を入れて、親子関係にする方法ですね。
C#だとDataTableというのがあって、エクセルのようにRowとColunmで管理するのですが、それと同じ考え方ですかね。

せっかくジャグ配列というものを教えて頂いたので、もう1つ連想配列というものを…
連想配列は、添え字の代わりにキーワードを指定できるモノです。
5教科の点数を求める際にk[0]は国語の点数、k[1]は数学の点数…などのように設定が必要でしたが、この添え字をキーワード指定できるのが連想配列になります。
k["国語"]=80, K["数学"]=67 のように添え字の代わりにキーワードを指定できるので可読性があがります。
ただ、連想配列が使える言語や開発ツールは、結構限られてる感じがします。PHP、JavaScript、Python(辞書というらしい?)…などなど。

勉強会の資料はこちらです。


この記事が気に入ったらサポートをしてみませんか?