師匠T:さぁ、今回もVB.NETどたばた塾、張り切っていくとしようぞ! さっそく行くぞ!
弟子D:師匠、どうしてそんなに急いで講座に入ろうとしてるんですか?
何事もないぞ弟子よ! 何も見てないし見えない! さぁ、確か今回は、配列変数についてであったな!
何かに目をそらしておられるような……あ(建物の外を歩くカップルを見つける)
クリスマスに浮かれているカップルなぞ、わしの目には映らないし見てないぞ! さぁ、さっそく始めるとしようぞ!
はぁ……。
【 こんなときは!? 】
さて。数人の成績を合計して、その平均点を出したいとき、おぬしならどうする?
え? うーん。その人数分の変数を用意して格納し、それを計算……とか。こんな風に。
ほほう。では、例えば1クラス40人分の平均を出したりしたい場合はどうする?
……ぐわーーー!! 無理です、気力が持ちません!
それだけではないぞ。〇人目の点数を入力した点数に修正するという場合もどうする? IFやSELECT CASEで、対応した変数を修正する、という形にしてもかなりの労力がかかるであろう。
はぁはぁ……そ、そうですね。はっ! こんな時に、配列変数が役に立つのでは?
うむ、その通りじゃ。さすが我が弟子、配列変数についての学習は怠りないと見えるな。
えーと、配列変数ってなんでしたっけ?
はあっ!!(飛び蹴り)
うわあっ。
では改めて、配列変数について復習しておくとしようぞ。配列変数とは、一つの変数をいくつもの部屋に区切って、それぞれごとに別々の値を入れられるようにしたものじゃ。
あ、思い出してきたかも。それぞれの部屋は、添え字という数値で識別するんでしたっけ。
その通りじゃ。この添え字は、いわば部屋番号のようなものと考えるがよかろう。そして一番のポイントとしては、この添え字には変数も使える、ということじゃ。
例えば、2が入っている変数iを添え字に使った場合、2番の値を見たりすることができる。もちろん、この変数iが1増えて3になった場合は、3番の値を見たり操作したりできるのだ。
なるほど。ということは、For~Nextなどの繰り返しと組み合わせることで、大量のデータを処理することができそうですね!
そういうことじゃ。では次からは、その配列変数の使い方について説明していくことにしようぞ。
【 全てはDimから始まるのじゃ! 】
まず、変数と同じように、配列変数を使うにはDim文で定義する必要がある。書き方はこうじゃ。
----------
Dim 配列変数名(添え字の最大) As 変数の型
例:
Dim a(5) As Integer
----------
ここで注意するべきことが一つある。わかるかな?
??
それは、配列の添え字は0からスタートするので、実際には配列の部屋数は添え字の最大よりも1多くなる、ということじゃ。例の場合だと、実際には0~5までの6つの部屋が作られるのだ。
なるほど。
なお、Javaでは配列の宣言の後に、配列の確保をする必要があったが、VB.NETではそんなことはない。上のDim文だけで全てOKじゃ。
ふむふむ。
それと、昔のBASICとは違い、VB.NETのDim文には、書き方のバリエーションとして、配列を宣言すると同時に、初期値を入れてしまう書き方がある。その場合は、このように書くのじゃ。
----------
Dim 配列変数名() As 変数の型 = {値1, 値2……}
例:
Dim b() As Integer = {5, 2, 4}
----------
このように書いてやると、VB.NETは自動的に、値の数と同じだけの部屋を持つ配列変数を作り、この初期値を入れてくるのじゃ。便利じゃろう?
はいっ!
【 配列を使え! 】
さて。配列変数の使い方は、いたって簡単。このように書けばいいだけじゃ。
----------
配列変数名(添え字)
例:
a(3)
----------
この添え字の部分には変数も使えるというのは先ほど話した通りじゃ。ゆえに、先ほどお主が言った通り、For~Nextと組み合わせて、こんな使い方もできるのだ。
このように、多くのデータを、For~Nextなどの繰り返しと組み合わせることで、簡単に処理できるのが配列変数の強みじゃ。
ですね!
さて。昔のBASICとは違い、VB.NETの配列には、色々と役立つ機能が内臓されておる。まずはCloneからじゃ。
Clone?
これは、ある配列をコピーして、全く別の配列を作るというものじゃ。コピーしてできた配列は、元の配列とは全く別の配列なので、コピーしてできた配列をいじっても、元の配列には何の影響もないのがポイントじゃ。
なお、Cloneはこのように使う。
----------
新しい配列変数名 = 元となる配列変数名.Clone
例:
b = a.Clone
----------
これだけで済むのじゃ。簡単じゃろう?
はいっ。
次はRedimじゃ。これは配列の部屋数を自由自在を変えてしまう、というものじゃ。Redimはこのように書く。
----------
Redim 配列変数名(添え字の新しい最大値)
例:
Redim c(5)
----------
あれ? 師匠。やってみたんですけど、Redimを使ったら、配列の中身が0になっちゃったんですが……。
おぉ、それを忘れておったの。普通、Redimを使うと、その中身はクリアされてしまう。それを防ぐには、RedimのあとにPreserveを付ける必要があるのじゃ。
----------
Redim Preserve 配列変数名(添え字の新しい最大値)
----------
それでやってみよ。今度はちゃんと値が残るはずじゃ。
おおっ、ほんとだ!
次はLengthとGetLengthじゃ。これを使うと、その配列の部屋の数を取得することができる。2次元以上の多次元配列の場合、Lengthを使うと、全ての部屋数を合計して返してしまう。特定の次元の部屋数を使うには、Lengthではなく、GetLengthを使う必要がある……ってどうした?
あ、あのー、師匠。多次元配列とはなんぞや。
おっと、それを忘れておったな。多次元配列とは、複数の添え字を持つ配列のことじゃ。というより、1次元配列は一棟の建物、2次元配列は数階建ての建物、3次元配列は数階建ての建物が複数集まった団地……と例えればイメージが伝わるかな?
あー、わかる気がします。つまり、2次元配列の場合、Lengthはその建物(配列)の全ての部屋数を返して、GetLengthは指定した階の部屋の数を返す、というわけですね。
うむ、そんな感じじゃ。さて、話を戻すぞ。このLengthとGetLengthはそれぞれ、次のように使う。
----------
配列変数名.Length
例:
d.Length →配列変数dの、全ての部屋数を取得する
配列変数名(次元数[, 次元数……]).GetLength
例:
e(2).GetLength →配列変数eの、2次元目(2階)の全ての部屋数を取得する
----------
なお、GetLengthのところの[ ]は省略してよいことを表しているぞ。
ふむふむ。
そして最後に、IndexOfとLastIndexOfについて教えておくとしよう。これは、指定した値が入っている部屋を調べて教えてくれる、という代物じゃ。これはこのように使う。
----------
Array.IndexOf(調べる配列変数, 探す値)
Array.LastIndexOf(調べる配列変数, 探す値)
例:
Array.IndexOf(f, "ABC")
→配列変数fの部屋の中から、"ABC"という文字列が格納されている部屋を探し、その添え字を取得する
----------
IndexOfとLastIndexOfとはどう違うのですか?
うむ。IndexOfは配列の先頭から探す。LastIndexOfはその逆(つまり配列の最後)から探すのだ。
なるほど、わかりました!
では、今月はここまで。次回は、VB.NETにおけるクラスについて説明していくぞ。Java道場を読んでおくことを勧める。
ではさらばじゃ! いい年を過ごすのじゃぞ!!
==========
※次の更新は、『フリーソフトでゲームを作ろう!』の予定です。お楽しみに!