§5.3 for文


作成日:2001/07/29(日)

今回は、ループ構造の第1弾としてfor文を取り上げます。 for文は次のような流れで動作します。

 for(初期化式; 条件式; 増減式){
   実行文;
 }

まず、初期化式で、for文を制御するための変数に初期値を設定します。 次に条件式で、条件を評価します。 もし条件が真ならば、その後の実行文が順に実行されます。 最後に増減式で、ループ制御変数が増減されます。 そしてまた条件式が評価され、もし真ならばその後の実行文が実行され……、という流れになります。 そして条件が偽になったらそこでループから抜け出します。

と説明だけしてもなんだかわからないので、for文の使用例を見てみましょう。

 for($i = 1; $i <= 5; $i++){
   print "\$i = ", $i, "\n";
 }

まず初期化式で、ループ制御のための変数$iに1をセットします。 次に条件式$i <= 5を評価します。 今$iの値は1なので条件は真となり、その後のprint文が実行されます。 最後に、増減式で$iの値がインクリメントされます。 するとまた条件式が評価されます。 今度は$iは2なので、また真となりその後のprint文が実行されます。 とこんなふうに処理が進んでいき、やがて$iが6になると条件式が偽になるので、そこでforループから抜け出します。

for文の初期化式、条件式、増減式は省略することが出来ます。 上のプログラムを書きかえると次のようになります。

 $i = 1;
 for(; $i <= 5;){
  print "\$i = ", $i, "\n";
  $i++;
 }

全部省略すると無限ループを作ることが出来ます。

 for(;;){
  print "無限ループ\n";
 }

上のプログラムはそのまま実行しないでくださいね。 何せ「無限」なのですから。

ここで練習として素数判定プログラムを紹介します。 僕のサイトのトップページにあるのも、これをベースにしています。

 01: #数値を受け取る
 02: print "整数を入力してください:";
 03: $num = <STDIN>;
 04: chomp($num);
 05: 
 06: #約数を計算
 07  for($i = 1; $i <= $num; $i++){
 08:   if($num % $i == 0){
 09:     push(@yakusuu, $i);
 10:   }
 11: }
 12: 
 13: #素数かどうかを判定
 14: if(scalar(@yakusuu) == 2){
 15:   print "$numは素数です。";
 16: } else {
 17:   print "$numは素数ではありません。";
 18: }

では詳しく見ていきましょう。 まず2行目から4行目で整数を受け取ります。 4行目のchomp関数は、受け取った引数の最後の改行文字を取り除いてくれます(「§1.2 あなたのお名前なんて−の?」参照)。
 7行目から11行目までで、$numの約数を計算します。 まずfor文で$iを1から$numまで動かして(7行目)、$iのそれぞれの値に対して、$numを$iで割った余りを計算します(8行目)。 そしてif文を使って$numを$iで割った余りが0ならば@yakusuu配列に順に入れていきます(9行目)。 このfor文で、$numの約数が全部@yakusuu配列に代入されたことになります。
 そして最後、14行目から18行目で$numが素数かどうかを判定しています。 素数というのは「1と自分自身でしか割り切れない整数」のことです。 ですから上で得られた@yakusuu配列の要素数が2ならば$numは素数ということになります。

いかがですか? 最後の素数判定プログラムはチョット難しいかもしれませんが、じっくりゆっくり考えてください。 次の節ではwhile文を紹介します。


「§5.2 条件分岐」へ 「§5.4 while文」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp