ループについてのまとめ

for 文、while 文、repeat 文では、同じ文を繰り返し実行するのに使用する事が分かりました。ある文を繰り返し実行したい場合に、何を基準にしてループするかは、それぞれ条件によって異なってきます。for, while , repeat では、どれも「ループする」という点では同じですが、「いつループを終了するか」という点では、それぞれ違いがあります。ここでは、どんな時に、for, while, 或いは、repeat を使用すれば良いかの簡単な例を見ていきましょう。

for 文

例えば、次のようなサンプルを考えて見ます。

procedure TForm1.Button1Click(Sender: TObject);
var
  Sum: Integer;
begin
  Sum := 0; // 初期化
  
  Sum := Sum + 10;
  Sum := Sum + 10;
  Sum := Sum + 10;
  
  ShowMessage('Sum は ' + IntToStr(Sum));
end;

上記の例では、Sum := Sum + 10; の文を3回繰り返しています。つまり、同じ文を単に3回繰り返すということだけが、このサンプルから分かります。単純に「何回繰り返すのか」という点だけが必要な場合、for 文を用いることが適切です。

上記のサンプルを for 文を用いて書き直すと、以下のようになります。

procedure TForm1.Button1Click(Sender: TObject);
var
  Sum: Integer;
  i: Integer;
begin
  Sum := 0; // 初期化
  
  for i := 0 to 2 do
    Sum := Sum + 10;
  
  ShowMessage('Sum は ' + IntToStr(Sum));
end;

一般的に、for 文は以下のような形をしています。

for ループ制御変数 := 初期値 to 終値 do

for 文では、ループ制御変数に初期値を代入した後、文を繰り返し実行し、繰り返しのたびに、ループ制御変数の値を 1 ずつ増加させていきます。そして、ループ制御変数が終値を超えると、ループは終了します。

予めループする回数が分かっていれば、for 文を使用することで、とても単純に書くことが出来ます。以下の例ではラジオグループを用いて、それぞれ「何回ループするか」を選択できるようになっています。

procedure TForm1.FormCreate(Sender: TObject);
begin
  RadioGroup1.Items.Add('3 回');
  RadioGroup1.Items.Add('5 回');
  RadioGroup1.Items.Add('7 回');
  RadioGroup1.ItemIndex := 0;
  RadioGroup1.Caption := 'ループする回数'
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  LoopCount: Integer; // ループする回数
  i: Integer;
   Sum: Integer;
begin
  LoopCount := 0;
  case RadioGroup1.ItemIndex of
    0: LoopCount := 3;
    1: LoopCount := 5;
    2: LoopCount := 7;
  end;
  
  Sum := 0;
  for i := 0 to LoopCount-1 do
    Sum := Sum + 10; // Inc(Sum, 10); でも同じです。
  
  // リストボックスに、Sum の値を表示
  ListBox1.Items.Add('Sum は ' + IntToStr(Sum));
end;

ラジオグループで、ループする回数(3,5,7回)を決めています。

初めからループする回数が分かっていますので、for 文はとても単純に書くことが出来ます。

while 文, repeat 文

初めから何回ループするかが分からない場合には、「いつループを終了するか」ということが重要になってきます。while 文ではループするまえに条件を判定しています。

whiledo

while 文では、ループをするまえに「式」を評価して、「式」が True であれば文を実行します。ですから、「式」に応じて、何回ループされるかは異なってきます。サンプルとして、以下の例を見てください。

procedure TForm1.FormCreate(Sender: TObject);
begin
  RadioGroup1.Caption := 'Sum の初期値';
  RadioGroup1.Items.Add('10');
  RadioGroup1.Items.Add('30');
  RadioGroup1.Items.Add('70');
  RadioGroup1.ItemIndex := 0;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  LoopCount: Integer; // ループした回数
  Sum: Integer;
begin
  Sum := 0;
  case RadioGroup1.ItemIndex of
    0: Sum := 10;
    1: Sum := 30;
    2: Sum := 70;
  end;
  
  LoopCount := 0;
  while Sum < 60 do
  begin
    Inc(LoopCount);
    Sum := Sum + 10; // Sum の値に 10 を加えます。
  end;
  
  ListBox1.Items.Add('Sum = ' + IntToStr(Sum));
  ListBox1.Items.Add(IntToStr(LoopCount) + ' 回ループしました。');
end;

このサンプルでは、Sum の値が 60 未満である場合には繰り返しループされます。ですから、ラジオグループで 70 を選択した場合には、ループは 1 度も実行されません。

一方、repeat 文では、式の評価を最後に行い、式が True になるまでループを続けます。

repeatuntil

while 文では、式の評価を初めに行い、式が True であればループを行いますが、repeat 文では、式の評価を最後に行い、式が True になるまでループを行います。また、repeat では式の評価を最後に行う為、必ず一度は、文を実行します。この点は while 文とは異なりますので注意してください。

それでは、repeat 文のサンプルを見てみましょう。

procedure TForm1.FormCreate(Sender: TObject);
begin
  RadioGroup1.Caption := 'Sum の初期値';
  RadioGroup1.Items.Add('10');
  RadioGroup1.Items.Add('30');
  RadioGroup1.Items.Add('70');
  RadioGroup1.ItemIndex := 0;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  LoopCount: Integer; // ループした回数
  Sum: Integer;
begin
  Sum := 0;
  case RadioGroup1.ItemIndex of
    0: Sum := 10;
    1: Sum := 30;
    2: Sum := 70;
  end;
  
  LoopCount := 0;
  repeat
    Inc(LoopCount);
    Sum := Sum + 10;
  until Sum > 60; // True であれば、ループを終了
  
  ListBox1.Items.Add('Sum = ' + IntToStr(Sum));
  ListBox1.Items.Add(IntToStr(LoopCount) + ' 回ループしました。');
end;

repeat 文では、最低でも 1 回はループを行います。

また、repeat 文では、ループする文が複数ある場合でも begin と end で囲む必要がありません。

まとめ


up next
Last Update 2002/11/23 by N.Kobayashi