for 文、while 文、repeat 文では、同じ文を繰り返し実行するのに使用する事が分かりました。ある文を繰り返し実行したい場合に、何を基準にしてループするかは、それぞれ条件によって異なってきます。for, while , repeat では、どれも「ループする」という点では同じですが、「いつループを終了するか」という点では、それぞれ違いがあります。ここでは、どんな時に、for, while, 或いは、repeat を使用すれば良いかの簡単な例を見ていきましょう。
例えば、次のようなサンプルを考えて見ます。
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 文ではループするまえに条件を判定しています。
while 式 do 文
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 になるまでループを続けます。
repeat 文 until 式
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 で囲む必要がありません。