法政大学国際文化学部
情報コミュニケーションI
担当 重定 如彦
2003年12月4日
配列変数 (続き)
·
配列変数と繰り返し
配列変数のインデックスは、0から順番に1ずつ増加するという、規則正しく並んだ数字を使います。従って、For文を使った繰り返し計算と相性が抜群です。
例題8−3 繰り返しを使った配列変数の使用例
例題8−2で、生徒全員の合計点と平均点を計算するプログラムを配列変数と繰り返しを使って記述します。
1.コントロールの配置とプロパティの設定
例題8−1のフォームの下にラベルを2つ、テキストボックスを2つ追加し、それぞれのプロパティを以下のように設定し、図8−5のようなフォームを作成して下さい。
オブジェクト |
プロパティ |
設定値 |
テキストボックス |
(name) |
左から「国語の合計点」、「国語の平均点」 |
Text |
すべて空白に設定 |
図8−5
2. イベントハンドラを作成する
例題8−2のプログラムの後ろに、以下のプログラムを追加してください。
1行目:For文で使うカウンタ変数「i」と、合計点数を計算する変数「合計点」を宣言する。
2行目:変数合計点を初期化する。
3〜5行目:繰り返しを使って、国語の点数(1)〜国語の点数(5)の合計を計算し、変数「合計点」に格納する。
6,7行目:結果をテキストボックスに表示する。平均点は合計点を人数の5で割る。
3.プログラムの実行と確認
プログラムを実行し、正しく動作することを確認して下さい(図8−6)。また、5人の国語の点数の数字を変更してもプログラムが正しく動作することを確認して下さい。
図8−6
同じプログラムを繰り返しを使わなかった場合、合計点の計算部分は
国語の合計点.Text = 国語の点数(1) + 国語の点数(2) + 国語の点数(3)
+ 国語の点数(4) + 国語の点数(5)
と記述すればOKです。一見すると通常の変数を使った場合のほうが1行で記述できるので良さそうに見えるかもしれませんが、繰り返しを使わない場合のプログラムは、合計得点の計算部分の行が非常に長くなってしまい、記述が大変になる傾向があります。上記の例の場合生徒の数が5人程度なので、まだ記述することは可能ですが、もし、生徒の数が1000人、10000人のように多くなった場合は、計算式を記述することすら困難になってしまいます。
·
コレクションと配列
例題8−1〜例題8−3では、テキストボックスに入力した数字を、一つ一つ配列変数に代入していましたが、テキストボックスの数が増えるとこれは大変な作業です。Visual
Basic .Netではコレクションと呼ばれる配列変数を使ってコントロールをまとめて扱うことが可能です。コレクションは、フォームやグループボックスなど、他のオブジェクトをその中に複数配置するタイプのオブジェクトのプロパティの一つです。ここではグループボックスのコレクションの使い方を説明します。
例題8−4 グループボックスのコレクションを使って、複数のテキストボックスの内容を配列変数に代入する。
1.コントロールの配置とプロパティの設定
例題8−1のフォームを縦方向に広げ、国語の点数が格納されたテキストボックスを下に移動して下さい。これは、次に配置するグループボックスの邪魔にならないようにする為なので、位置は適当でかまいません(図8−7)。
図8−7
次にツールボックスで「GroupBox」というコントロールをクリックし、国語の点数の場所に、5つのテキストボックスが収まるようなサイズのグループボックスを作成して下さい。グループボックスの位置は最後に調整するので、このときグループボックスの枠が上下左右の他のコントロールの一部に重なってもかまいません(図8−8)。グループボックスは図のように、灰色の四角い枠で囲まれたコントロールで、この中に他のコントロールを配置することで、配置したコントロールをグループにして扱うことができます。グループボックス内に配置したコントロールはグループボックスのコレクションになり、グループボックスのControlsというプロパティを使って参照することができます。
図8−8
次に配置したグループボックスの上に、下に移動した国語の点数のコントロールを配置して下さい。このとき必ず左から一つずつ順番に配置する必要がある点に注意が必要です(図8−9)。
図8−9
最後に、グループボックスのプロパティを以下のように変更し、グループボックスが他のコントロールに重ならないようにサイズを調整し、フォームのサイズを元に戻してください。(図8−10)。
オブジェクト |
プロパティ |
設定値 |
グループボックス |
(name) |
国語のグループ |
Text |
空白 |
図8−10
2. イベントハンドラを作成する
例題8−1の最初の6行を以下のように変更して下さい。
Dim 国語の点数(5), i As Integer '配列変数とカウンタの宣言()
For i = 1 To 5
'コレクションを使って代入する
国語の点数(i) = Val(国語のグループ.Controls(i - 1).Text)
Next
1行目:For文で使うカウンタ変数「i」の定義を追加しています。
2〜4行目:繰り返しを使って配列変数「国語の点数」にテキストボックスの内容を代入する。
グループボックス内のコントロールは、グループボックスの「Controls」というプロパティに格納されています。Controlsは配列変数であり、要素番号とコントロールの対応は以下のように、コントロールをグループボックスに配置した順番に対応しています。
要素番号 |
コントロール |
0 |
最初にグループボックス内に配置したコントロール |
1 |
2番目にグループボックス内に配置したコントロール |
2 |
3番目にグループボックス内に配置したコントロール |
・・・ |
・・・ |
n |
n+1番目にグループボックス内に配置したコントロール |
この時、要素番号が1ではなく、0から始まっているために、n番目に配置したコントロールの要素番号はn−1になる点に注意が必要です。従って、3行目の代入文では、配列の要素に i−1 を記述しています。
以下に例題8−4までで完成した全体のプログラムを表示します。
Dim 国語の点数(5), i As Integer '配列変数とカウンタの宣言()
For i = 1 To 5
'コレクションを使って代入する
国語の点数(i) = Val(国語のグループ.Controls(i - 1).Text)
Next
If Val(国語の生徒番号.Text) >= 1 And
Val(国語の生徒番号.Text) <= 5 Then
'インデックスが1〜5の場合点数をテキストボックスに表示
国語.Text = 国語の点数(Val(国語の生徒番号.Text))
Else
'インデックスが1〜5でない場合テキストボックスにエラーと表示
国語.Text = "エラー"
End If
Dim 合計点 As Integer
'カウンタ変数と合計点を格納する変数を宣言
合計点
= 0
'合計点を初期化する
For i = 1 To 5
'繰り返しを使って、合計点にそれぞれの
合計点 = 合計点 + 国語の点数(i) '国語の点数を加算する
Next
国語の合計点.Text
= 合計点
'結果をテキストボックスに表示する
国語の平均点.Text
= 合計点 / 5
3.プログラムの実行と確認
プログラムを実行し、正しく動作することを確認して下さい。例題8−4は例題8−3と同じ動作を行うプログラムを別の方法で記述したものなので、動作そのものは例題8−3と何もかわらないはずです。
8.6 2次元配列変数
配列変数を使うことで、同じ種類のデータを一つの変数名で扱うことが可能になりました。しかし、ここまでで解説した方法では、同じ種類のデータに複数の要素が存在した場合はやはり複数の配列変数を用意する必要があります。
この説明ではわかりにくいと思いますので例を挙げます。例えば、ある40人のクラスの生徒の国語、算数、理科、社会の成績を管理するプログラムを作成するには、これまでの方法では、
Dim 国語の点数(40), 算数の点数(40), 理科の点数(40), 社会の点数(40) As Integer
のように、4つの配列変数が必要です。もし、科目数が10に増えた場合は、10の配列変数を定義する必要があり、変数名の管理が大変になります。
このように、同じ種類(この場合点数)のデータに対して「生徒」と「科目」の2つの要素が存在する場合は、2次元配列と呼ばれる配列変数を利用します。二次元配列変数の定義は以下のように記述します。
Dim 変数名(1つ目の要素の要素数, 2つめの要素の要素数) As Integer
これによって、以下の表のような、(1つ目の要素数+1)*(2つ目の要素数+1)個の変数を定義することができるようになります。下の表の灰色の長方形1つ1つが定義された変数です。
|
0 |
1 |
2 |
・・・ |
二つ目の要素数 |
0 |
|
|
|
|
|
1 |
|
|
|
|
|
2 |
|
|
|
|
|
・・・ |
|
|
|
|
|
一つ目の要素数 |
|
|
|
|
|
2次元配列変数に対し、これまでに説明した配列変数のことを区別して1次元配列変数と呼ぶこともあります。 2次元配列変数の各要素は1次元配列変数と同様に
変数名(1つ目の要素番号, 2つ目の要素番号)
と記述することで参照することができます。
先ほどの成績の場合、一つ目の要素を「生徒番号」、二つ目の要素を「科目」とし、それぞれの科目を 1:国語 2:算数 3:理科 4:社会 とすることで2次元配列変数をつかって全ての生徒の成績を以下のように表すことが可能になります。
Dim
成績(40, 4) As Integer
例えば5番目の生徒の理科の成績は以下のように表現します。
成績(5,
3) '5は生徒番号、3は理科の番号を表す
例題8−5 2次元配列変数を使ったプログラム例
2次元配列変数を使って、5人の生徒の国語、算数、理科の3科目の成績の合計点を計算するプログラムを作成します。
1.コントロールの配置とプロパティの設定
新しく「例題8−5」というプロジェクトを作成して下さい。この例題では、同じようなコントロールを複数配置する際のテクニックについて順を追って説明します。
ます、フォームにラベルを9つ、グループボックス1つ配置し、配置したグループボックスの上にテキストボックスを7つ並べて下さい。そして、グループボックスのTextプロパティを空白に設定し、図8−11のような配置にして下さい。これで、国語の点数の部分が完成しました。
図8−11
算数と理科の部分は以下の手順で配置して下さい、
・
「国語の点数のラベル」と「グループボックス」を選択状態にする。なお、グループボックスを選択する際は、中に配置されたコントロールは選択する必要はありません。
・
メニューの「編集」→「コピー」を実行し、選択したコントロールをクリップボードにコピーする。
・
メニューの「編集」→「貼り付け」を実行し、コピーしたコントロールを貼り付ける。
・
貼り付けられたコントロールを国語の点数の下に移動する。
・
再びメニューの「編集」→「貼り付け」を行い、コピーしたコントロールをさらに下に移動する。
・
コピーした2つのラベルのText属性をそれぞれ「算数の点数」、「理科の点数」に変更する。
これで、図8−12のようなフォームが完成するはずです。
図8−12
このように同じようなコントロールを複数配置するにはコピーアンドペーストを使うと便利です。
次にフォームを下方向に伸ばし、今作成した3つのグループボックスが入るような大きさのグループボックスを作成しTextプロパティを空白に設定してから、その中に3つのグループボックスを一つずつ順番に入れてください(図8−13)。この時、既に入れたグループボックスに重なるように次のグループボックスを入れると思ったように配置できない場合があります。そのような場合は、メニューから「編集」→「元に戻す」を実行して操作をやり直して下さい。
図8−13
最後に大きなグループボックスのサイズと配置を調整し、ボタンを一つ配置し、コントロールのプロパティを以下のように変更して下さい(図8−14)。
オブジェクト |
プロパティ |
設定値 |
グループボックス |
(name) |
外側のグループボックスの名前を「成績のグループ」に設定。 それ以外の3つのグループボックスの名前は変更しなくても良い。 |
テキストボックス |
Text |
1,2,3,4,5のラベルの下のテキストボックスに0〜100までの 好きな整数を入力する。図8−13と同じである必要はありません。 |
ボタン |
Text |
計算 |
図8−14
プログラムを記述する前に、それぞれのコントロールがどう表現されるかを説明します。
最後に作成した「成績のグループ」というグループボックスには、3つのグループボックスが配置されています。従って、3つのグループボックスは以下のように表現することができます。
国語の点数の右のグループボックス |
成績のグループ.Controls(0) |
算数の点数の右のグループボックス |
成績のグループ.Controls(1) |
理科の点数の右のグループボックス |
成績のグループ.Controls(2) |
国語の点数の右のグループボックスの中の7つのテキストボックスは以下のように表現することができます。
生徒番号1の下のテキストボックス |
成績のグループ.Controls(0).Controls(0) |
生徒番号2の下のテキストボックス |
成績のグループ.Controls(0).Controls(1) |
・・・ |
|
生徒番号5の下のテキストボックス |
成績のグループ.Controls(0).Controls(4) |
合計点の下のテキストボックス |
成績のグループ.Controls(0).Controls(5) |
平均点の下のテキストボックス |
成績のグループ.Controls(0).Controls(6) |
Controlsが2つ続いている為に、意味が良くわからないと思われる方が多いと思いますが、落ち着いて考えればそれほど難くはありません。下の図のように、「成績のグループ.Controls(0)」が国語の点数の右のグループボックスのことを表しているということが理解できれば、この後に .Controls(0) と記述すれば、国語の点数の右のグループボックスの中に最初に配置したコントロールを表すということが理解できるのではないでしょうか。
国語の点数の右の グループボックスを表す
成績のグループ.Controls(0).Controls(0)
理科と社会のテキストボックスも全く同様の方法で表すことができます。それぞれどのように表されるか、各自考えてみてください。
2. イベントハンドラを作成する
それぞれのテキストボックスをどう表現すれば良いかがわかりましたので、次はイベントハンドラを記述してみましょう。計算ボタンをダブルクリックし、イベントハンドラを作成し、以下のようなプログラムを入力して下さい。
このプログラムは以下の4つの部分から構成されています。それぞれ順を追って説明します。
・ 定数の宣言
・ 変数の宣言
・ テキストボックスの内容を2次元配列変数「成績」に代入する。
・ 変数「成績」を使って、それぞれの科目の合計点を計算し、テキストボックスに表示する。
定数の宣言:
Const で始まる以下のプログラムは定数を宣言しています。
定数は以下のように宣言します。
Const 定数名 As 型 = 値
定数は変数と非常に良く似ていますが以下の点で異なります。
・ 宣言時に「Dim」ではなく「Const」と記述する。
・ 宣言時に最後に「= 値」を記述し、宣言時に定数の値を設定する必要がある。
・ 定数は変数と異なり、宣言時に設定した値で固定される。従って、代入文を使って定数に別の値を代入することはできない。
定数を使う利点には以下のようなものがあります。
・ 意味のある数字に名前をつけることで、プログラムを読みやすくすることができる。
例えば、このプログラムでは、For文で、生徒数の数だけ繰り返し計算を行います。この時、
For i = 1 To 5
と記述した場合と、生徒数という定数を宣言し、
For I =
1 To 生徒数
と記述した場合を比べてみてください。後者のほうがはるかにプログラムの意味がわかりやすいはずです。定数を使って、プログラムの意味をわかりやすくすることで、プログラムのエラーを見つけやすくなるという利点がありますので、積極的に使うことをお勧めします。
・ プログラムで、数字を変更する場合に変更を簡単に行うことができる。
例えば、この例題では生徒数が5人の場合の計算を行いました。もし、このプログラムで計算する生徒の数を5人から4人に変更した場合、生徒数を定数で宣言し、それを使ってプログラムを記述しているので、定数の宣言の部分を
Const 生徒数 As Integer = 4
'生徒の数(4人)を表す定数
と変更するだけでOKです。
もし、定数を使わなかった場合は、この例題のプログラムの中の「生徒数」と記述されている部分はすべて5と記述する必要があります。この場合、計算する生徒数を4人に変更するには、該当する5をすべて4に変更する必要があります。これはプログラムの数字の一つ一つの意味を考えながら行わなければならないため、かなり大変な作業ですし、一つでも数字を変更し忘れるとプログラムは正しく変更されなくなります。
変数の宣言:
Dim文で記述された2行で、成績を格納する2次元配列変数「成績」と、カウンタ変数「i」,「j」、合計点を計算数変数「合計」を宣言しています。2次元配列変数「成績」のそれぞれの要素は以下のような意味をことにします。
・
1つ目の要素:科目を表す
数字の意味は1:国語、2:理科、3:社会とします。
・
2つ目の要素:生徒番号を表す
テキストボックスの内容を2次元配列変数「成績」に代入する:
2次元配列変数「成績」にテキストボックスの内容を繰り返しを使って代入します。2次元配列変数を繰り返しを使って扱う場合、上記のプログラムのように、繰り返しを2つ入れ子にして記述することで、全ての要素に対して計算を行うことができるようになります。外側の繰り返しで、「それぞれの科目」について繰り返しを行い、内側の繰り返しで「それぞれの科目」に対する、「それぞれの生徒」について繰り返しを行います。
プログラミングに慣れないうちはこのような繰り返しの入れ子は理解しにくい方が多いのではないかと思います。うまく理解できない方は、フローチャートを書くなどして、プログラムの流れを追って何故このプログラムで正しく代入できるかどうかを確認してください。
変数「成績」を使って、それぞれの科目の合計点を計算し、答えをテキストボックスに表示する:
こちらも同様に、繰り返しを入れ子にすることで、それぞれの科目の合計を計算しています。計算結果をテキストボックスに代入する部分は、外側の繰り返しのブロックに記述する必要がある点に注意して下さい。こちらについても同様に、うまく理解できない方は、プログラムの流れを追ってください。
3.プログラムの実行と確認
プログラムを実行し、正しく動作することを確認して下さい(図8−15)。
図8−15
Tips 3次元以上の配列変数
Visual Basic .Netでは3次元以上の配列変数を使うこともできます。3次元配列変数を定義するには、以下のように、要素数を,で3つ区切ります。
Dim 変数名(1つ目の要素数,2つ目の要素数,3つ目の要素数) As 型名
同様の方法で、4次元以上の配列変数も宣言することができます。
質問のメールなどは、sigesada@edu.i.hosei.ac.jpまでお願いします。
授業の資料の最新版はhttp://www.edu.i.hosei.ac.jp/~sigesada/にあります。