指定した条件を満たしている間、または条件になるまでの間、繰り返して同じ処理を行うことをループ処理といいます。
繰り返す回数があらかじめ分かっている場合は「for..to」を使用します。
回数がわからない場合は、「while…do」または「repeat…until」を使います。
for文
- for…to…do は、指定した初期値からカウンタを1つずつ増やしながら、最終値になるまで、do以降の処理を実行します。
- for…downto…do は、カウンタを1つずつ減らしながら処理を行います。初期値は、最終値よりも大きい必要があります。
- begin…end を使って、ブロックを明確にします。
【サンプル】 5回の繰り返し(for…to…do)
procedure TForm1.Button1Click(Sender: TObject); var i : Integer; //ループのカウンタ begin Memo1.clear; for i:=1 to 5 do //カウンタが1から5の間 //begin...end の処理を繰り返す begin Memo1.Lines.Add(IntToStr(i)); //カウンタの値を表示 end; end;
while文
- while…do は、指定した条件が満たされている間(True)、do の直後のブロック処理を実行します。
- 条件式は、ブロックの処理を行う前に評価されます。条件に満たない(False)場合は、ループに入りません。
【サンプル】 5回のループ。前の答えに、ループのカウントを加算しています。
procedure TForm1.Button1Click(Sender: TObject); var i : Integer; //ループのカウンタ intAns : Integer; //答えの数値 begin i := 1; //初期値を変数に代入 intAns := 0; //初期値を変数に代入 while i <=5 do //カウンタが5以下なら begin...endの間を繰り返す begin intAns := intAns + i ; //答えにiの値を加算 Memo1.Lines.Add('i = ' + IntToStr(i) + ' → ' + IntToStr(intAns)); i := i + 1; //カウンタの値を1増やす end; end;
【実行結果】
答えの初期値はゼロなので、0+1=1です。2順目はその1にカウント2を足して3になります。
repeat文
- repeat…until は、until文で指定した条件が満たされるまで(Falseの間)、repeat の直後のブロックを実行します。
- 条件式は、ブロックの処理を行った後に評価されます。ループは必ず一度は実行されます。
【サンプル】 結果はWhile文と同じです
procedure TForm1.Button1Click(Sender: TObject); var i : Integer; //ループのカウンタ intAns : Integer; //答えの数値 begin i := 1; //初期値を変数に代入 intAns := 0; //初期値を変数に代入 repeat begin intAns := intAns + i ; //答えにiの値を加算 Memo1.Lines.Add('i = ' + IntToStr(i) + ' → ' + IntToStr(intAns)); i := i + 1; //カウンタの値を1増やす end; until i > 5; //iの値が5を超えるまで処理を継続(False) //iの値が5を超えたら処理を終える(True) end;
ループからの脱出
- ループ構造から脱出する手続きとして、break と continue があります。
break手続きはループから脱出します。
continue手続きは、ループの先頭に戻って処理を継続します。
【サンプル】
procedure TForm1.Button1Click(Sender: TObject); var i : Integer; //ループのカウンタ intAns : Integer; //答えの数値 intRet : Integer; //ダイアログボックスの戻り値 begin intAns := 0; //初期値を変数に代入 for i := 1 to 10 do begin Memo1.clear; intAns := intAns + i; Memo1.Lines.Add('i = ' + IntToStr(i) + ' → ' + IntToStr(intAns)); intRet := MessageDlg('続けますか?',mtConfirmation,[mbYes,mbNo],0); if intRet = mrYes then //「はい」ボタンがクリックされたら Continue //ループの先頭から処理を継続 else //「いいえ」がクリックされたら break; //ループから脱出する end; ShowMessage('終了'); end;