配列とループを一緒に使おう

配列とループの使い方を個別に学びましたので、ここでは、配列とループをいっしょに使用したプログラムを書いてみましょう。その前に、少し復習をします。

配列の復習

配列を使用する場合には、まず配列を使う為の宣言をしなくてはいけません。配列を宣言する場合には、

が必要でしたね。たとえば、次のようになります。

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)関数

配列の先頭の添え字の値を取得したい場合には 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;

例題1

配列のそれぞれの要素にランダムな値を代入して、その一覧をリストボックスに表示させるプログラムを書いてみましょう。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 などで呼び出します。ランダムな色を表示しようを参照してください。

まとめ


up next
Last updated 2003/12/13