配列とループの使い方を個別に学びましたので、ここでは、配列とループをいっしょに使用したプログラムを書いてみましょう。その前に、少し復習をします。
配列を使用する場合には、まず配列を使う為の宣言をしなくてはいけません。配列を宣言する場合には、
が必要でしたね。たとえば、次のようになります。
var Arr: array[0..9] of Integer; // 配列の宣言
上の例では、配列の名前は Arr, 配列のサイズは 10, 型は Integer です。この場合、添え字の先頭は 0 で、末尾は 9 となります。
配列の個々の要素にアクセスするには添え字を使用するんでした。実際に次のサンプルで確認してみましょう。
procedure TForm1.Button1Click(Sender: TObject); var Arr: array[0..2] of Integer; begin Arr[0] := 12; Arr[1] := 33; Arr[2] := 90; ShowMessage(IntToStr(Arr[0])); // 12 ShowMessage(IntToStr(Arr[1])); // 33 ShowMessage(IntToStr(Arr[2])); // 90 end;
上のサンプルでは、サイズ 3 の配列 Arr を宣言して、それぞれの要素に値(整数)を代入しています。そして最後に、配列のそれぞれの要素を表示しています。
上のサンプルで、配列のそれぞれの要素に格納されている値の合計を表示するプログラムを書くとしたらどうしますか?
たとえば、次のように書くことも出来ます(ページ後半で、ループを使用した例を見ます)。
procedure TForm1.Button1Click(Sender: TObject); var Arr: array[0..2] of Integer; Sum: Integer; begin Arr[0] := 12; Arr[1] := 33; Arr[2] := 90; // 配列のそれぞれの要素に格納されている値を全部たす Sum := Arr[0] + Arr[1] + Arr[2]; ShowMessage(IntToStr(Sum)); // 135 end;
次のプログラムを実行すると、どんなメッセージが表示されますか(ヒント: 型に注目してください)
procedure TForm1.Button1Click(Sender: TObject); var Arr: array[0..2] of string; Sum: string; begin Arr[0] := 'Delphi '; Arr[1] := 'プログラミング '; Arr[2] := '入門'; // 配列のそれぞれの要素に格納されている値を全部たす Sum := Arr[0] + Arr[1] + Arr[2]; ShowMessage(Sum); end;
配列の先頭の添え字の値を取得したい場合には Low 関数を使い、同様に末尾の添え字を値を取得したい場合には、High 関数が使用できます(関数についての解説は、後で出てきます)。
procedure TForm1.Button1Click(Sender: TObject); var Arr: array[0..2] of string; x, y: Integer; begin x := Low(Arr); // 配列 Arr の先頭の添え字を x に代入 y := High(Arr); // 配列 Arr の末尾の添え字を y に代入 ShowMessage('Arr の先頭の添え字は '+IntToStr(x)); // 0 ShowMessage('Arr の末尾の添え字は '+IntToStr(y)); // 2 end;
この Low 関数と High 関数は、重要ですので忘れないで下さい。もう少し練習してみましょう。
procedure TForm1.Button1Click(Sender: TObject); var Arr1: array[0..12] of Integer; Arr2: array[3..34] of string; x, y: Integer; begin x := Low(Arr1); y := High(Arr1); ShowMessage(IntToStr(x)); // 0 ShowMessage(IntToStr(y)); // 12 ShowMessage(IntToStr(Low(Arr2))); // 3 ShowMessage(IntToStr(High(Arr2))); // 34 end;
配列についての復習は、これでおしまいです。以上が理解できていれば大丈夫です。
ループについては、 ループについてのまとめを参照してください。次の練習問題に挑戦してください。
次のプログラムの変数 Sum の値はいくらですか。
procedure TForm1.Button1Click(Sender: TObject); var Sum, i: Integer; begin Sum := 0; for i := 0 to 10 do Inc(Sum); // Sum := Sum + 1; と同じ ShowMessage(IntToStr(Sum)); // Sum はいくつ ? Sum := 0; for i := 0 to 10 do Inc(Sum, i); // Sum := Sum + i; と同じ ShowMessage(IntToStr(Sum)); // Sum はいくつ ? Sum := 120; while Sum < 10 do Inc(Sum, 99); ShowMessage(IntToStr(Sum)); // Sum はいくつ ? Sum := 0; repeat Inc(Sum); until Sum = 10; ShowMessage(IntToStr(Sum)); // Sum はいくつ ? end;
要素数 100 の配列の個々の要素に値 20 を代入したい場合には、もちろん、次のように一つずつ値を代入していくことも出来ます。
var Arr: array[0..99] of Integer; begin Arr[0] := 20; Arr[1] := 20; Arr[2] := 20; ............ // 延々、値を代入していく ............ Arr[98] := 20; Arr[99] := 20; end;
しかし、このような時には for ループを使用します。for 文でのループでは、ループ制御変数というものを使用して、初期値と終値に指定された値までループを繰り返します。ですから、この初期値に配列の先頭の添え字を指定し、終値に配列の末尾の値を指定すれば、配列の先頭から末尾までのループを作ることが出来ます。
procedure TForm1.Button1Click(Sender: TObject); var Arr: array[0..99] of Integer; i: Integer; begin for i := Low(Arr) to High(Arr) do // ここがポイント Arr[i] := 20; // 配列の全ての要素には 20 が格納されている ShowMessage(IntToStr(Arr[0])); // 20 ShowMessage(IntToStr(Arr[1])); // 20 ShowMessage(IntToStr(Arr[23])); // 20 ShowMessage(IntToStr(Arr[99])); // 20 end;
大切なのは、次の箇所です
for i := Low(Arr) to High(Arr) do
これは、Low(Arr) が返す値がループ制御変数の初期値となり、High(Arr) が返す値がループ制御変数の終値となります。Low(Arr) は配列の先頭の値が返され、High(Arr) は配列の末尾の値が返されますね。ですから、結果として、配列の先頭から末尾までの要素にアクセスできるループとなっていることになります。
そうすると、配列のそれぞれの要素に格納されている値の合計は、for 文で記述することができますね。次のようになります。
procedure TForm1.Button1Click(Sender: TObject); var Arr: array[0..2] of Integer; i, Sum: Integer; begin Arr[0] := 12; Arr[1] := 23; Arr[2] := 34; Sum := 0; for i := Low(Arr) to High(Arr) do // ここがポイント Inc(Sum, Arr[i]); ShowMessage(IntToStr(Sum)); // 69 end;
配列のそれぞれの要素にランダムな値を代入して、その一覧をリストボックスに表示させるプログラムを書いてみましょう。Standard タブにある ListBox をフォームに貼り付けて下さい。
ランダムな値は、Random 関数で取得できます。
procedure TForm1.Button1Click(Sender: TObject); var Arr: array[0..9] of Integer; i: Integer; begin Randomize; for i := Low(Arr) to High(Arr) do Arr[i] := Random(150); for i := Low(Arr) to High(Arr) do ListBox1.Items.Add('Arr[' + IntToStr(i) + ']: ' + IntToStr(Arr[i])); end;
※ Randomize 関数は、一度呼べば十分です。通常は、OnCreate などで呼び出します。ランダムな色を表示しようを参照してください。