repeat 文

文を繰り返し実行したい場合には for 文、while 文の他に repeat 文 を使用することが出来きます。

repeat 文は、どちらかというと while 文に似ていますが、 その違いは繰り返す条件の判定を最後に行うことと、 その判定が True の場合にループを終了することです。

ループするかしないかの判定を最後に行いますので、 repeat 文に記述された文は、少なくとも必ず 1 回は 実行される事になります。

repeat 文は、以下のようなコードで表現されます。

repeat
  .......
  .......
  .......
until 条件; // 条件が真の時、ループを終了 

簡単な例を見てみましょう。

procedure TForm1.Button1Click(Sender: TObject);
var
  Number: Integer;
  LoopCount: Integer;
begin
  Number := 0;
  LoopCount := 0;
  repeat
    Number := Number + 3;
    LoopCount := LoopCount + 1;
  until Number > 100; // Number が 100 より大きければループ終了

  ShowMessage('Number は' + IntToStr(Number));
  ShowMessage(IntToStr(LoopCount) + '回ループしました');
end;

上のプログラムを図で示したのが下図です。

while 文では、ループするかどうかの判定をループ開始時に行い、判定が True の場合に ループを行いますが、repeat 文では、ループするかどうかの判定をループ終了時に 行い、判定が True の時にループを終了します。

while 文と repeat 文との違いを表しているのが、次のプログラムです。

procedure TForm1.Button1Click(Sender: TObject);
var
  whileNumber    : Integer;
  whileLoopCount : Integer;
  repeatNumber   : Integer;
  repeatLoopCount: Integer;
begin
  whileNumber := 50;
  whileLoopCount := 0;
  while whileNumber < 30 do
  begin
    whileNumber := whileNumber + 50;
    whileLoopCount := whileLoopCount + 1;
  end;

  repeatNumber := 50;
  repeatLoopCount := 0;
  repeat
    repeatNumber := repeatNumber + 50;
    repeatLoopCount := repeatLoopCount + 1;
  until repeatNumber > 30;

  ShowMessage('whileNumber は' + IntToStr(whileNumber));
  ShowMessage('while 文では' + IntToStr(whileLoopCount) + '回ループ');

  ShowMessage('repeatNumber は' + IntToStr(repeatNumber));
  ShowMessage('repeat 文では' + IntToStr(repeatLoopCount) + '回ループ');
end;

while 文では、ループするかどうかを whileNumber < 30 で行っています。 whileNumber は、ループに入る前に 50 に初期化されていますので、whileNumber < 30 の評価時には 既に False です。ですからループは一度も行われません。

一方 repeat 文でもループに入る前に repeatNumber を 50 に初期化していますが、 ループするかどうかの判定は最後に行われますので、repeatNumber の値がなんであろうと 必ず一度はループします。そして、repeatNumber > 30 が評価され、True であればループ終了、 False であればもう一度ループし、再度 repeatNumber > 30 が評価されます。

また、サンプルプログラムからも分かりますが repeat 文では、実行される文が複数存在しても begin と end で囲む必要がありません。つまり、以下のようにしなくても良いことになっています。

repeat
  begin // 必要ありません
    ....
    ....
  end; // 必要ありません
until repeatNumber < 30;

まとめ


up next
Last Update 2003/01/12