for文の基本
for文も、while文と同じく反復文の一つです。 一般に、決まった回数だけ繰り返して処理を行わせる場合は、こちらのfor文をよく使います。
for文の基本書式は少し難しいので、順を追って見て行きましょう。
(1)一番最初に行う処理を書く
for( 式; )
for文は、()の中に書かれた最も左側にある式を一度だけ実行します。 式ならば何を書いてもいいのですが、普通はループ変数の初期化を行います。 例えば次のように書きます。
for ( var i=0; )
この式は省略する事も出来ます。 省略する場合はセミコロン(;)だけを書きます
for ( ; )
(2)処理を継続させる条件式を書く
for( 式; 条件式; )
条件式はwhileで指定した「while ( 条件式 )」と同じ動作をします。 ループ変数iが10よりも少なければ、という条件を付けるには次のように書きます。
for ( var i=0; i<10; )
(3)条件式が真の場合の処理を書く
for( 式; 条件式; ) { //処理内容 }
whileの時と同様に、処理内容全体を{}で囲みます。 条件式が真の時に処理を行う点もwhileと同様です。
(4)「最後に行う処理」を書く
for( 式; 条件式; 最後の処理) { //処理内容 }
最後の処理は{}で囲まれた処理内容が終わった後に実行されます。 何でも良いのですが、普通はループ変数を操作します。 最後の処理の終わりにセミコロン(;)は書きません。
for ( var i=0; i<10; i++)
このようにして、条件式が真の場合に処理を行う→最後の式を処理する、とループしていきます。 この文は「ループ変数iが10より少なければ処理を続ける」という反復文になっています。
最後の処理も省略する事が出来ます。
for( 式; 条件式; ;)
これがfor文の基本書式です
挨拶プログラムの改良
では、while文で紹介した挨拶を9回行うプログラムをforで改造してみます。
for( var i=9; i; i-- ) { System.inform("こんにちは、お元気ですか?"); }
while文では{}処理の外でループ変数を用意し、処理の中でループ変数iの値を増減させていました。 それがfor文では()の中に全て記入することが出来ます。 ですから、for文はwhile文の拡張版とも言えるのです。 しかしながら、場合によってはwhileを使用するほうが簡単に書ける場合もありますので、 状況に応じて使い分ける事が望ましいです。
まずはfor文とwhile文の扱いをしっかりとマスターしましょう。 そのためには、とにかくたくさんのプログラムを書いてみる事です。
for文についてもう一歩
for文も反復文なので、while文で紹介したbreakとcontinueといった、 ループ制御が使えます。
多重ループを扱う
for文やwhile文は、処理内容の中にfor文などを書く事が出来ます。 forやwhile文は一つの文(つまり一つの処理の単位)ですから、 文が書ける場所ならどこにでも書く事が出来ます。そう、while文の中にif文が書けたように。
このように、複数個の反復文によって、何重にもループする事を多重ループと呼ぶ事があります。 掛け算である九九(1×1~9×9)を多重ループを使って実行する例を見てみましょう。(少し難しいです)
var disp=""; //表示する文字を入れる変数 //ループ変数iが9以下なら処理をする for( var i=1; i <= 9; i++ ) { disp += "i="+i+" :"; //ループ変数jが9以下なら処理をする for( var j=1; j <= 9; j++ ) { //計算結果を表示する //\tはタブを表すエスケープシーケンスです disp += (i*j) + "\t"; } //エスケープシーケンスで改行する disp += "\n"; } System.inform(disp);
これまでに得た知識を駆使しないと、このプログラムを読み解くのは困難を極めます。 何が何だか分からない!という方は、最初のほうから読み直す事を推奨します。
よく分からないまま進めると必ず挫折します。 そして、一度挫折してしまうと、なかなか戻って来れないのもプログラムの恐怖なのです。 落ち着いて…一つ一つ理解すれば、必ず分かるはずです。リラックスしましょう
forを二重に使わなければ次のようになります。実際に実行して確認してください。
var disp=""; //表示する文字を入れる変数 //ループ変数iが9以下なら処理をする for( var i=1; i <= 9; i++ ) { disp += "i="+i+" :"; disp += "\n"; } System.inform(disp);
これなら見慣れた形ですね。ここではループ変数iが9になるまで
disp += "i="+i+" :"; disp += "\n";
この処理を繰り返すのです。実行結果が何故改行されているのか?と言うと
disp += "\n";
これが原因です。「\n」って覚えているでしょうか? そう、エスケープシーケンスです。
では、処理内容の中にfor文を書くとどうなるのでしょうか? 実際にやってみましょうか。
var disp=""; //表示する文字を入れる変数 //ループ変数iが9以下なら処理をする for( var i=1; i <= 9; i++ ) { disp += "i="+i+" :"; // for文の中にfor文を入れる! // 変数jが3以下なら処理をする for (var j=1; j <= 3; j++) { System.inform("iの値は"+i+"、jの値は"+j+"です。"); disp += (i*j) + " |"; } disp += "\n"; } System.inform(disp);
これを実行すると鬱陶しいくらいメッセージが表示されますが、 ループ変数iとjの動きが良く分かりますので、一度は実行してください。
結果を見ると、何度も変数jが変動している事に気づくと思います。 jの値が「1、2、3」と変動し、それが9回続きますよね。それもそのはず。
for (var j=1; j <= 3; j++)
この処理が終わって抜けた先は
for( var i=1; i <= 9; i++ )
まだ、このfor文の処理の中だからです。 従って、このfor文で指定された条件…この例では変数iの値が10になるまで処理は続くのです。 (iが9以下なら処理をして「i++」となるので、最後は10になるのは分かりますか?)
このような、反復文を多重に使うという手法はゲームや多くのアプリケーションで必須になる書き方です。 今はまだ完全に理解出来ていなくても、挫折するには早いです。 なんとな~くでも理解出来ていれば、今回は十分合格!です。
多重ループ制御
多重ループがなんとなく理解できると、次の疑問が出てきます。
多重ループの中でbreakやcontinueを使うとどうなるんだろう……?
この答えはとても簡単です。 breakなどは{}の中に書かれていますよね?ですから、図に表すと以下のようになります

つまり、while文などの中にある反復文(ここではwhile)の中でbreakを使うと、 抜けるのは、そのbreakが存在している{ }という事です。
var i=1; while( i ) { while ( 1 ) { //このbreakが抜けた先は「--i」の場所 //つまり、while( 1 )の処理を終わる break; } --i; }
これはcontinueも同じです。
var i=1; while( i ) { var j=9; while ( j ) { if ( j >1 ) { //このcontinueはwhile ( j )に戻る --j; continue; } --j; } --i; }
慣れるまでは多重ループ制御に困惑する事も多いと思いますが、 ブロック{}の位置に注目していけば、必ず対応するfor文が見つけられるはずです。 その為にも、ブロック{}毎にインデント(空白)で表示を見やすくする事が重要になるのです。