Visual Basic 6.0 初級講座 |
第19回 配列1 静的配列
今回は、「配列」(はいれつ)というものをやります。以前にも少し顔を出しましたが、今度は正式に登場で、基本事項を中心に解説します。配列はVBに限らずプログラミングの重要な要素の一つです。また、配列をうまくつかいこなせば、そうでない場合に比べて格段に優れたプログラムを作ることができるでしょう。
1.配列の基礎知識
配列とは変数の一種です。たとえば、3つの国の名前を変数に格納するプログラムは次のようになりますね?
Dim Country1 As String Dim Country2 As String Dim Country3 As String Country1 = "日本" Country2 = "韓国" Country3 = "台湾" |
(知らなかった人のために言っておきますと、変数の名前の一部分として数字も使ってよいのです。ただし変数の名前の先頭を数字にすることはできません。)
このようにして、いくつでも国の名前を変数に入れていくことができます。さて、それでは2番目の国の名前は何でしたっけ?これを知るには次のようにプログラムすればよいわけです。
MsgBox Country2 |
このくらいでしたら変数も便利なものですから役に立ってくれます。しかしK番目の国の名前を知りたいときはどうしますか?次のようにしたいところですがだめです。
'このプログラムはまちがいです。 MsgBox CountryK |
これがなぜだめかというと、CountryKという変数が宣言されていないからです。人間の感覚とコンピュータの感覚は違うものだということを再認識してください。
では、配列に登場してもらいましょう。配列とは一口に言えば変数を順番に並べたものです。配列を使えば今の問題のようにK番目の国の名前を知ることができます。その方法を次に解説しましょう。
2.基本的な配列
配列も変数と同様に宣言する必要があります。変数の場合は宣言をしなくてもVBがうまく処理してくれたりもしますが配列の場合はだめです。必ず宣言してください。
以下の例はCountryという名前の配列を宣言しています。
Dim Country(3) As String |
この配列は変数を4つ並べたものです(0番目、1番目、2番目、3番目の4つ)。この配列はAs Stringからわかるように文字列型です。このように配列と変数の明確な区別は後ろにかっこがあるかないかでなされます。今は最初なので少なめに変数を4つ並べた配列をつくりました。これら変数を配列の「要素」といいます。つまりこの配列は4つの要素をもっているといいます。要素の数は相当大きくても大丈夫です。
かっこの中の数字のことを添字(そえじ、てんじ)、インデックスと言ったりします。インデックスは通常0から始まりますが、1からはじめたいときは Dim Country(1 To 3)のようにすればOKです。この方法を使えば2からはじめるなど、好きな数からインデックスを開始することができます。
しかし、インデックスはできるだけ 0 からはじめるようにしてください。通常は0空始まるのに、0以外のものから始まるように配列を宣言すると後々混乱を招きます。
この配列に国の名前を格納するプログラムは次のようになります。
Country(1) = "日本" Country(2) = "韓国" Country(3) = "台湾" |
2番目の国の名前を知りたいときは次のようにします。
MsgBox Country(2) |
K番目の国の名前を知りたいときは次のようにします。
MsgBox Country(K) |
このかっこの中に変数を入れられるというのが配列の最大の魅力だと思います。この機能のおかげで次のような処理も可能になります。
For K = 1 To 3 Print Country(K) Next K |
配列の要素が何十個、何百個もあるときにこのような手法は重宝します。とても変数にはまねができませんね。
以上が配列の基本です。ここまで知っているだけで知らないのに比べたら大違いです。いろいろと試してみてください。自分のプログラムの中に積極的に配列を取り入れることをお勧めします。
3.2次元配列
学校を配列で表現して見ましょう。ここはVisual Basic中学校です。1年生は100人、2年生は150人、3年生は120人いるとしましょう。これを配列 Grade() を使ってあらわすと次のようになります。
Dim Grade(3) As Integer Grade(1) = 100 Grade(2) = 150 Grade(3) = 120 |
こうしておけば、あとでK年生の人数を知りたくなったときにGrade(K)で取得することができますね。
しかし、現実は込み入っています。1年生は3クラスに分かれていて1組は35人、2組は40人、3組は25人います。同様に2年生は4クラスに分かれて・・・面倒くさいのでVisual Basic中学校の生徒の人数を表にまとめてみます。
学年 | 1組 | 2組 | 3組 | 4組 |
1年 | 35 | 40 | 25 | |
2年 | 40 | 35 | 30 | 45 |
3年 | 35 | 40 | 45 |
このような分布を配列でどう表現しましょうか。まず、要素が10個ある配列を考えるという手が浮かびます。たとえば配列Kumi()を宣言して、Kumi(1)= 35, Kumi(2) = 40, Kumi(3) = 25 などとしていきます。そうするとKumi(4)は2年1組を表していて =40 ということになるでしょう。
しかし、これはわかりにくい。たとえば、Kumi(8)は何年何組だと考えるときにいちいちこの表を思い浮かべることになります。
なぜ、この表が配列で表現しにくいかを考えてみると、それはそのまま 表 だからですね。1直線に並んだものであれば Kumi(1), Kumi(2), ・・・ と並べていくのは大変有効ですが、表のように2次元上にならんでいるものは必ずしもそうではありません。
そこで 2次元配列の登場です。表のように2次元で並んでいるものを表現するために2次元配列を使うことができます。それでは、新しい2次元配列 Kumi() を見てみましょう。
Dim Kumi(3, 4) AS Integer Kumi(1,1) = 35 Kumi(1,2) = 40 Kumi(1,3) = 25 Kumi(2,1) = 40 |
2次元配列はたてと横を表現する必要から、かっこの中にカンマで区切って2つの数字を入れます。最初の数字が横を表すようにしましたが、それはプログラマーの自由です。このようにしてK年N組の人数を取得するには次のようにすればよいでしょう。
MsgBox Kumi(K,M) |
2年生全体の人数を求めるには次のようにします。
For K = 1 To 4
Next K |
学校全体の人数を求めるには次のようにします。
For X = 1 To
3 'Xは学年を表す。 For Y = 1 To 4 'Yは組を表す。 Goukei = Goukei + Kumi(X,Y) Next Y Next X |
この2次元配列は座標を表したりするのに特に便利です。そのためゲームには非常によく使われます。そのほかにも本来表でないものを表形式に捉えてうまく処理したりすることもできます。
なお、3次元配列、4次元配列も可能で、これらをひっくるめて「多次元配列」と呼びます。多次元配列はメモリの消費が思ったより多くなる場合があるので使用する前に要素の数を数えてみてください。たとえば3次元配列 Sample(6,6,6)の要素の数は216個もあります。(6×6×6で計算できますね)。
また、Variant型(バリアント型)はもっともメモリの消費が大きいので、この型で配列を使用することは極力避けてください。あまり巨大な配列を宣言するとアプリケーションの動作速度に極度の影響を及ぼします。(要素の数が1000くらいなら心配はないでしょう。私のパソコンは要素の数が60000個(6万)の配列を宣言したらちょっとだけ重くなりました。ようするに100や200は問題ないということなのでどしどし使いましょう。)
4.配列を利用したプログラム
最後に配列を利用して電車の時間を求めるごく単純なサンプルを作りましょう。(もっと一般的で実用的なサンプルは初級講座第15回、16回の英単語練習プログラムです。そちらをもういちど見直すのもよいでしょう。)
出来上がるプログラムは出発駅と目的地の名前を入力してボタンを押すとそこまで行くのにかかる時間を計算してくれるというものです。
具体的な話に入る前に今回はすこし趣向をこらします。いままでのようにプログラムを少しずつ作り上げていく方式を今回はとりません。私はプログラムの部分部分を示していくだけにします。みなさんはそれを自分で組み立ててうまく動作するようにしてみてください。もちろん完成版を見たい人のために一応完成版ものせておくことにはします。
さて、次のような路線があると仮定します。(駅名は総武線からとっていますが、時間は適当なので信用しないでください。)
津田沼 → 東船橋 → 船橋 → 西船橋 → 下総中山 → 本八幡 → 市川
3分 2分 3分 2分 4分 4分
さて、駅の名前を配列に格納します。配列の名前は Station() にしましょう。このプログラムは次のようになります。
Dim Station(7) As String
Station(1) = "津田沼" Station(2) = "東船橋" Station(3) = "船橋" Station(4) = "西船橋" Station(5) = "下総中山" Station(6) = "本八幡" Station(7) = "市川" |
いちいち配列にするのは面倒くさいと思うでしょうね。実際私もこんなことはあまりやりません。配列の要素が少ないときだけです。では、多きときはどのようにして配列に代入したらよいでしょうか?これは少し発展的な内容なのでこの下にサンプルだけ載せておきます。よくわからない人は無視してください。(それでもいままで解説してきた内容の範囲内ではあります。)
'この例は不完全です。
Dim Station(7) As String |
次にもうひとつ時間の配列を作りましょう。1つ目の駅「津田沼」から次の駅まで3分ですから、配列 TrainTime(1) = 3 のようにしましょう。このコードは次のようになります。
Dim TrainTime(7) As Integer
TrainTime(1) = 3 TrainTime(2) = 2 TrainTime(3) = 3 TrainTime(4) = 2 TrainTime(5) = 4 TrainTime(6) = 4 |
これで準備完了です。このあと、3つ目の駅から6つ目の駅までかかる時間を求めるには次のようにすればよいですね。
For K = 3 To 5
Jikan = Jikan + TrainTime(K) Next K |
では、ユーザーが自由に駅の名前を入力できるようにしましょう。ユーザーには駅の名前を漢字で入力してもらいます。入力された要素が配列にあれば何番目の要素か覚えておくようにしましょう。たとえば、出発する駅を取得するコードは次のようにします。(フォームにText1をはりつけた状態を想定しています。)
Target = Text1.Text For K = 1 To 7
Next K |
ユーザーがこれ以外の駅の名前を入力したときはなにかメッセージを表示するようにするのもいいでしょう。どうように目的地が何番目の駅かを取得することもできますね。
最後に、計算の部分は次のようになります。
For K = StartStation To EndStation - 1
Next K |
あと書き忘れましたが、配列 Station() と TrainTime() の宣言はフォームの宣言セクションにしてください。これはこの配列をフォームのどこからでも参照できるようにするためです。(プロシージャの中で宣言された配列や変数はそのプロシージャのなかでだけ有効です)。フォームの宣言セクションって何?という人はこちらを見てください。
以上で最低限必要な部品はでそろったはず。皆さんはプログラムを完成させることができましたか?完成版を見たい人はここをクリックしてください。
5.最後に
最後に作ったサンプルを配列なしで作ろうと思ったら大変です。配列は他にもいろいろなシーンで活躍していますからみなさん腕を磨いてください。配列の便利な使い方をあみだした人はぜひ掲示板にてお知らせください。それでは。