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 で囲む必要がありません。