今回は、ループ構造の第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文を紹介します。