2019年12月16日

師匠のVB.NETどたばた塾~第4回

sisyo.gif
師匠T:さぁ、今回もVB.NETどたばた塾、張り切っていくとしようぞ! さっそく行くぞ!

deshi.gif
弟子D:師匠、どうしてそんなに急いで講座に入ろうとしてるんですか?

sisyo.gif
何事もないぞ弟子よ! 何も見てないし見えない! さぁ、確か今回は、配列変数についてであったな!

deshi.gif
何かに目をそらしておられるような……あ(建物の外を歩くカップルを見つける)

sisyo.gif
クリスマスに浮かれているカップルなぞ、わしの目には映らないし見てないぞ! さぁ、さっそく始めるとしようぞ!

deshi.gif
はぁ……。

【 こんなときは!? 】

sisyo.gif
さて。数人の成績を合計して、その平均点を出したいとき、おぬしならどうする?

deshi.gif
え? うーん。その人数分の変数を用意して格納し、それを計算……とか。こんな風に。

vb1912-01.JPG

sisyo.gif
ほほう。では、例えば1クラス40人分の平均を出したりしたい場合はどうする?

deshi.gif
……ぐわーーー!! 無理です、気力が持ちません!

sisyo.gif
それだけではないぞ。〇人目の点数を入力した点数に修正するという場合もどうする? IFやSELECT CASEで、対応した変数を修正する、という形にしてもかなりの労力がかかるであろう。

deshi.gif
はぁはぁ……そ、そうですね。はっ! こんな時に、配列変数が役に立つのでは?

sisyo.gif
うむ、その通りじゃ。さすが我が弟子、配列変数についての学習は怠りないと見えるな。

deshi.gif
えーと、配列変数ってなんでしたっけ?

sisyo.gif
はあっ!!(飛び蹴り)

deshi.gif
うわあっ。

sisyo.gif
では改めて、配列変数について復習しておくとしようぞ。配列変数とは、一つの変数をいくつもの部屋に区切って、それぞれごとに別々の値を入れられるようにしたものじゃ。

deshi.gif
あ、思い出してきたかも。それぞれの部屋は、添え字という数値で識別するんでしたっけ。

vb1912-p01.gif

sisyo.gif
その通りじゃ。この添え字は、いわば部屋番号のようなものと考えるがよかろう。そして一番のポイントとしては、この添え字には変数も使える、ということじゃ。
例えば、2が入っている変数iを添え字に使った場合、2番の値を見たりすることができる。もちろん、この変数iが1増えて3になった場合は、3番の値を見たり操作したりできるのだ。

deshi.gif
なるほど。ということは、For~Nextなどの繰り返しと組み合わせることで、大量のデータを処理することができそうですね!

sisyo.gif
そういうことじゃ。では次からは、その配列変数の使い方について説明していくことにしようぞ。

【 全てはDimから始まるのじゃ! 】

sisyo.gif
まず、変数と同じように、配列変数を使うにはDim文で定義する必要がある。書き方はこうじゃ。

----------
Dim 配列変数名(添え字の最大) As 変数の型

例:
Dim a(5) As Integer
----------

sisyo.gif
ここで注意するべきことが一つある。わかるかな?

deshi.gif
??

sisyo.gif
それは、配列の添え字は0からスタートするので、実際には配列の部屋数は添え字の最大よりも1多くなる、ということじゃ。例の場合だと、実際には0~5までの6つの部屋が作られるのだ。

deshi.gif
なるほど。

sisyo.gif
なお、Javaでは配列の宣言の後に、配列の確保をする必要があったが、VB.NETではそんなことはない。上のDim文だけで全てOKじゃ。

deshi.gif
ふむふむ。

sisyo.gif
それと、昔のBASICとは違い、VB.NETのDim文には、書き方のバリエーションとして、配列を宣言すると同時に、初期値を入れてしまう書き方がある。その場合は、このように書くのじゃ。

----------
Dim 配列変数名() As 変数の型 = {値1, 値2……}

例:
Dim b() As Integer = {5, 2, 4}
----------

sisyo.gif
このように書いてやると、VB.NETは自動的に、値の数と同じだけの部屋を持つ配列変数を作り、この初期値を入れてくるのじゃ。便利じゃろう?

deshi.gif
はいっ!

【 配列を使え! 】

sisyo.gif
さて。配列変数の使い方は、いたって簡単。このように書けばいいだけじゃ。

----------
配列変数名(添え字)

例:
a(3)
----------

sisyo.gif
この添え字の部分には変数も使えるというのは先ほど話した通りじゃ。ゆえに、先ほどお主が言った通り、For~Nextと組み合わせて、こんな使い方もできるのだ。

vb1912-02.JPG

sisyo.gif
このように、多くのデータを、For~Nextなどの繰り返しと組み合わせることで、簡単に処理できるのが配列変数の強みじゃ。

deshi.gif
ですね!

sisyo.gif
さて。昔のBASICとは違い、VB.NETの配列には、色々と役立つ機能が内臓されておる。まずはCloneからじゃ。

deshi.gif
Clone?

sisyo.gif
これは、ある配列をコピーして、全く別の配列を作るというものじゃ。コピーしてできた配列は、元の配列とは全く別の配列なので、コピーしてできた配列をいじっても、元の配列には何の影響もないのがポイントじゃ。
なお、Cloneはこのように使う。

----------
新しい配列変数名 = 元となる配列変数名.Clone

例:
b = a.Clone
----------

sisyo.gif
これだけで済むのじゃ。簡単じゃろう?

deshi.gif
はいっ。

sisyo.gif
次はRedimじゃ。これは配列の部屋数を自由自在を変えてしまう、というものじゃ。Redimはこのように書く。

----------
Redim 配列変数名(添え字の新しい最大値)

例:
Redim c(5)
----------

deshi.gif
あれ? 師匠。やってみたんですけど、Redimを使ったら、配列の中身が0になっちゃったんですが……。

vb1912-03.JPG

vb1912-r01.JPG

sisyo.gif
おぉ、それを忘れておったの。普通、Redimを使うと、その中身はクリアされてしまう。それを防ぐには、RedimのあとにPreserveを付ける必要があるのじゃ。

----------
Redim Preserve 配列変数名(添え字の新しい最大値)
----------

sisyo.gif
それでやってみよ。今度はちゃんと値が残るはずじゃ。

deshi.gif
おおっ、ほんとだ!

vb1912-r02.JPG

sisyo.gif
次はLengthとGetLengthじゃ。これを使うと、その配列の部屋の数を取得することができる。2次元以上の多次元配列の場合、Lengthを使うと、全ての部屋数を合計して返してしまう。特定の次元の部屋数を使うには、Lengthではなく、GetLengthを使う必要がある……ってどうした?

deshi.gif
あ、あのー、師匠。多次元配列とはなんぞや。

sisyo.gif
おっと、それを忘れておったな。多次元配列とは、複数の添え字を持つ配列のことじゃ。というより、1次元配列は一棟の建物、2次元配列は数階建ての建物、3次元配列は数階建ての建物が複数集まった団地……と例えればイメージが伝わるかな?

vb1912-p02.jpg

deshi.gif
あー、わかる気がします。つまり、2次元配列の場合、Lengthはその建物(配列)の全ての部屋数を返して、GetLengthは指定した階の部屋の数を返す、というわけですね。

sisyo.gif
うむ、そんな感じじゃ。さて、話を戻すぞ。このLengthとGetLengthはそれぞれ、次のように使う。

----------
配列変数名.Length

例:
d.Length →配列変数dの、全ての部屋数を取得する

配列変数名(次元数[, 次元数……]).GetLength
例:
e(2).GetLength →配列変数eの、2次元目(2階)の全ての部屋数を取得する
----------

sisyo.gif
なお、GetLengthのところの[ ]は省略してよいことを表しているぞ。

deshi.gif
ふむふむ。

sisyo.gif
そして最後に、IndexOfとLastIndexOfについて教えておくとしよう。これは、指定した値が入っている部屋を調べて教えてくれる、という代物じゃ。これはこのように使う。

----------
Array.IndexOf(調べる配列変数, 探す値)
Array.LastIndexOf(調べる配列変数, 探す値)

例:
Array.IndexOf(f, "ABC")
→配列変数fの部屋の中から、"ABC"という文字列が格納されている部屋を探し、その添え字を取得する
----------

deshi.gif
IndexOfとLastIndexOfとはどう違うのですか?

sisyo.gif
うむ。IndexOfは配列の先頭から探す。LastIndexOfはその逆(つまり配列の最後)から探すのだ。

deshi.gif
なるほど、わかりました!

sisyo.gif
では、今月はここまで。次回は、VB.NETにおけるクラスについて説明していくぞ。Java道場を読んでおくことを勧める。
ではさらばじゃ! いい年を過ごすのじゃぞ!!

==========
※次の更新は、『フリーソフトでゲームを作ろう!』の予定です。お楽しみに!

posted by 裏編 at 15:08| Comment(0) | 師匠のVB.NETどたばた塾 | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください