for 文、while 文

例えば、ある文を複数回実行したい場合があるとします。もし「こんにちは」と記述されているメッセージボックスを 2 回連続で実行したい場合には、次のようにプログラムを書く必要があります。

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('こんにちは');
  ShowMessage('こんにちは');
end;

2 回ぐらいなら、まだいいですけど、例えば 20 回実行したいときはどうでしょうか? ShowMessage('こんにちは'); を 20 回も入力しなくてはいけませんし、プログラムを読む方にとっても、20 回も同じ文があれば、「一体、ShowMessage は、全部で何回実行されているんだ?」と、余計なことを考える必要も出てきます。初めから何回繰り返すのかが分かっている場合には、これから紹介します for 文を使用することが出来ます。

繰り返し実行したい → 必要なことは何か

for 文では、ある特定の文を繰り返し実行したいときに使用します。文を繰り返し実行するということは、どの文を何回繰り返し実行するのかという情報が必要になってきますね。つまり、繰り返す「回数」が必要になってきます。まず簡単なサンプルとして、ボタンを押すと「こんにちは」とメッセージボックスを 4 回表示する例を見てみましょう。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
 
  for i := 0 to 3 do
  begin
    ShowMessage('こんにちは');
  end;
  
end;

注目していただきたい事は、どの文を何回実行するかという点です。上のサンプルをみると、「どの文を」に相当する箇所は、すぐ分かりますが(ShowMessage('こんにちは') の部分がそうですね)問題は、「何回繰り返されるのか」という点です。それについての情報は以下のコードで、表現されています。

  for i := 0 to 3 do

for 文では、その回数を指定する際に「何回」ということではなく、回数の「初期値」と「終値」を指定しているのが特徴です。つまり、上の例では「 0 から 3 まで」ということになります。

「 0 から 3 まで」とは「 0, 1, 2, 3 」までのことだと思ってください。つまり 0 から 1 ずつ値を増加していって 3 までで終了ということです。これは for 文での決まりごとです。また、変数 i の部分ですが、これは「今まで何回、繰り返したか」という情報を保持するものだと思ってください。文を繰り返し実行している途中で、ある特別な操作をしたい場合には、「現在、何回目を実行中か」を知る必要があります。その際に使用することが出来ます。

以上の説明を図で表したのが、下図です。

図で示したように、for 文自体で使用される変数(ここでは i )は、その for 文で実行されるべき文が全て実行されたあと、自動的にその値を +1 増加させます。そのことは以下のプログラムで確かめる事が出来ます。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  
  for i := 0 to 2 do
  begin
    ShowMessage(' i の値は ' + IntToStr(i) + 'です');
  end;
  
end;

ですから、もしループ回数を知る必要があるなら for 文で使用している変数 i を使えばいいですね。次のサンプルでは、ループ終了の際にそれを知らせるメッセージボックスを表示するプログラムです。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  
  for i := 0 to 2 do
  begin
    ShowMessage('こんにちは');
  
    if i = 2 then
      ShowMessage('ループを終了します');
  end;
  
end;

上記のサンプルのように、for 文では何回繰り返すのかを指定していますので、ループ終了時に、何か特別な処理をすることも出来ますし、ループの途中でも、特定の処理をすることだって出来ます。つまり for 文では、ループする回数に注目している命令だということが分かります。

ループの終了を自ら決める while 文

ループ処理で使用される命令には for 文の他に while 文があります。for 文では「ループ回数」に注目した命令ですが、while 文では「ループの終了」に注目した命令です。つまり、「いつループを終了するか」という点に重点が置かれています。例えば Number という変数を宣言して、ループするたびにその値を 3 ずつ増やしていき Number の値が 100 を超えた時点でループ終了する場合には、この while 文を使用することが出来ます。

procedure TForm1.Button1Click(Sender: TObject);
var
  Number: Integer;
begin
  Number := 0; // 初期値を代入します
  
  while Number < 100 do
  begin
    Number := Number + 3; // 3 ずつ値を増やしていきます
  end;
  
  ShowMessage('Number の値は' + IntToStr(Number));
end;

while 文を使用する際に注目すべきポイントは、以下のコードにあります。

  while Number < 100 do

while では、ループ終了の判断を Number < 100の部分で行っています。もし、Number が 100 未満であるならループを継続し、100 を超えていた場合は、ループを終了します。つまり、ある評価対象物において、True ならループ継続、False ならループ終了ということになります。例えば Number が 20 であるなら Number < 100 は True ですね。ですからループは継続されます。また Number が 150 であるなら False になりますのでループは終了します。

while 文が行う様子を図で表したのが、下図です。

もちろん while 文でもループ回数を知る事ができます。しかしループ回数を知りたい場合には、それ専用の変数を新たに用意する必要があります。以下のサンプルでは、変数 LoopCount を宣言して、ループ回数を調べています。

procedure TForm1.Button1Click(Sender: TObject);
var
  Number: Integer;
  LoopCount: Integer;
begin
  Number := 0; // 初期値を代入します
  
  LoopCount := 0;
  while Number < 100 do
  begin
    Number := Number + 3; // 3 ずつ値を増やしていきます
    LoopCount := LoopCount + 1;
  end;
  
  ShowMessage('Number の値は' + IntToStr(Number));
  ShowMessage(IntToStr(LoopCount) + '回ループしました');
end;

まとめ

ちょっと一言:

Delphi では、大文字と小文字を区別しません。 ですから、プログラムコードで IntToStr は、inttostr と書いてもいいし、INTTOSTR と書いても エラーとなりません。


up next
Last Update 2003/01/12 by N.Kobayashi