ループ制御


特定部分を繰り返す

プログラムのうち、とくに大きな情報を扱う場合
処理の簡易化、合理化、自動化などを目的にループを使用することがあります
この他にも、繰り返し処理はプログラムの中で非常によく遭遇します

プログラムの特定部分を繰り返すには for ステートメントを使用します
for ループは、繰り返し処理の代表的なステートメントです

for (initialization; test; increment) statements

initialization はループを開始する前に1度だけ実行する初期化処理を指定します
test は任意のブール式を指定し、test が true の時 statements が実行されます
test で指定したブール式は、繰り返す度に評価されます
increment はループを行うごとに評価する式で、カウンターなどに使用します

statements は test が true を返す間繰り返すべきステートメントを指定します
if 文のように { } で囲んだ複合ステートメントを指定することも可能です
var count;
for(count = 1 ; count <=5 ; count++)
	alert("繰り返し" + count + "回目");
alert("ループを終了しました");


このプログラムを実行すると同じ alert() メソッドを5回繰り返します
ループする度に count++ が実行され、最終的に count <= 5 が偽となりループを抜けます

initialization、test、increment の各パラメータは省略できます
(Microsoft の JScript では必ず指定します)
test を省略した場合、または true を指定した場合は無限ループとなりますが
無限ループを生成してしまった場合、ブラウザの動作凍結につながるので注意が必要です
var count = 0;
for (; count < 5 ;) {
	count++;
	alert("繰り返し" + count + "回目");
}


このプログラムは、for 文ではなくループステートメント内部で
繰り返しの制御用カウンタとして使用している count 変数をインクリメントしています

for ループの最中に何らかの理由で強制的に抜け出したい場合もあります
そのような場合は、switch で学習した break 文を使用することができます
無限ループなどから脱出する時や、エラー発生時にループから抜ける手段などに使用します
for (;;) if (confirm("Do you like kitten?")) break;
alert("Yes, you are great !")


このプログラムは、質問に対して[OK]を選択しなければ
いつまでたっても同じ質問が繰り返されるというプログラムです
confirm() メソッドが true を返した時、break によって for 文から抜け出します

さらにループ処理では、強制的にループの先頭に復帰したい場合もあります
これには continue ステートメントを使用します

continue [label];

label は break 同様にステートメントの識別子を指定することができます
ステートメントに識別子をつける方法は後記します
このステートメントをループで使用すると、現在のステートメントの処理を中断し
ループの先頭に復帰して次の繰り返しへと移行します
for(var count = 1 ; count <= 10 ; count++) {
	if (count % 2 == 0) continue;
	alert("繰り返し" + count + "回目");
}


このプログラムは、カウンタ変数 count の剰余を求め
繰り返し回数が遇数回の時は alert() を呼び出さずに継ぎの繰り返しに移行するプログラムです


前方評価文

for によるループは、変数の初期化やカウンタのインクリメントなどを
for ステートメント自体が行ってくれるため、汎用的な利用方法がありました
そのため、多くのプログラマは好んで for 文によるループ制御を行います

しかし、カウンタを使用せずにブール式の評価だけを行う while という
for と似た機能を持つループステートメントを使用することも可能です

while (expression) statements

機能的には for 文と同じで、for を簡略化したようなステートメントです
expression には、繰り返しを制御するブール式を指定します
ここが true の時はループが実行され false の時はループから抜け出します
無限ループなどを作成する時は、for よりも比較的 while の方が適しています
while(!confirm("Do you like kitten?"));
alert("Please play Kitty on your lap !");


このプログラムも、表示された質問に対し[OK]ボタンを押すまで
何度も同じ質問が繰り返されるというプログラムです
while ループのステートメント部分はとくに処理する対象がないので省略しています

while で注意しなければならないのが、for とことなり
expression で評価するカウンタなどの操作は、繰り返しステートメントの中で
プログラムが明示的に行わなければならないという点です
var count = 1;
while(count <= 5) {
	alert("繰り返し" + count + "回目");
	count++;
}


記述方法は異なりますが、動作としては for と同じなのがわかると思います
カウンタをインクリメントする場所などを、考慮する必要があります


後方評価

while はループの開始前に一度式を評価していました
この時、式が false を返した場合、1度も繰り返し処理をせずに次に進むことがあります

アルゴリズムによっては、このような現象がおこると困ることもあります
つまり、最低でも繰り返し処理を1度は行ってほしいという場合です
このような場合は、while や for ではなく do...while 文を使用します

do statement while (expression) ;

このループ処理は、まず最初に statement が実行され
その後に while が式 expression を評価します
expression が true ならば do まで復帰し、false ならばループを抜け出します

statement に記述する内容は while や for と同じくステートメントです
当然、continue や break ステートメントを使用することも可能です
var max = parseInt(prompt("繰り返す回数を入力してください"));
var count = 1;
do {
	alert("繰り返し" + count + "回目");
	count++;
} while(count <= max);


どののような値を入力しても、必ず1度は alert() が実行されます
このように評価する式がどのような値でも、必ず1度はステートメントを実行したい場合
do...while ループを使用すると非常に簡単にそれを実現できます


for (initialization; test; increment) statements

条件が true の間、指定ステートメントを繰り返し実行します

initialization - ループ開始前に一度だけ実行する式を指定します
test - ブール式を指定します。ここが true の間繰り返します
increment - 繰り返す度に実行する式を指定します
statement - 繰り返す度に実行するステートメントを指定します

while (expression) statements

指定条件が false になるまでステートメントを実行します

expression - ブール式を指定します。この式が true の間繰り返します
statement - 繰り返す度に実行するステートメントを指定します

do statement while (expression);

ステートメント ブロックを一度実行し
その後、条件式の評価が false になるまでループ実行を繰り返します

statement - 実行するステートメントを指定します
expression - ブール式を指定します。この式が true の間繰り返します

continue [label];

現在のループ実行を中断し、次の繰り返し処理へ移行します

label - ステートメントのラベルを指定します



前のページへ戻る次のページへ