条件分岐が処理の切り替えであるのに対して、繰り返しは同じ処理を何回も繰り返す場合に利用されます。
条件分岐について確認したい人は下記を参照してみてください。
繰り返し文は以下のような種類がありますが、繰り返しをするという基本の部分について違いはありません。
- while文
- for文
- do-while文
while文
while(条件式){ 文; 文; }
条件式が成立している間(trueである間)、「{」と「}」で囲まれたwhileブロックの文を繰り返し実行するのがwhile文の処理になります。
条件式が正しく設定されていないと永遠にループを抜けられない状態になります。
これを、「無限ループ」、「永久ループ」と呼びます。
無限ループの状態になるとプログラムが永遠にwhileブロックの処理を行いつづけ、結果としてプログラムが暴走したり、正常に終了しない等の恐れがありますので、条件式を記述する際は注意してください。
条件式で利用する値には、whileブロックの処理中に変化する値を利用するのが定石です。
while文のフローチャートは以下の通りです。
条件式が成立する間(条件式の結果がtrueの間)、繰り返し処理ブロックの開始点から終了点までを、延々と繰り返します。
【while文】
public class While{ public static void main(String[ ] args){ int i = 1; while(i <= 5){ System.out.println(i); i++; // iの値を変化させるとwhile文の条件が変化する } } }
実行結果
1 2 3 4 5
用語:カウンタ
ここで i は、順次インクリメントしてwhileブロックの実行回数に影響を与えています。
こういったループの回数を記憶している変数を、”カウンタ”と呼ぶことがあります。
ポイント! カウンタの名前
カウンタとなる変数名には「i」や「j」といった名前をつけるのが多くのプログラマの慣習となっています。
カウンタ以外の目的で変数名に「i」などと名前をつけてしまうと混乱を招く場合がありますので注意しましょう。
【while文2】
public class While2{ public static void main(String[ ] args){ int i = 1; while(i > 0){ // 常にこの条件は成り立つ System.out.println(i); i++; } } }
実行結果
終了しなくなるので、コンソールの[終了]ボタンで停止させてください。
ヒント! プログラムの強制終了
無限ループで同じ処理を繰り返し行っているプログラムを強制的に終了するには、コマンドプロンプトで実行している場合は、 Ctrl キーを押しながら C キーを押します。
Eclipseで実行している場合は、[終了]ボタンを押します。
[動画解説]
vimeo.com
for文
for文はwhile文と同様に繰り返し実行を行います。
for文は変数を1つ使用します。変数の値に基づいてループを行います。
for文は初期化と条件とループ後の処理をまとめて記述することができます。for文の動きは以下の通りです。
- 値を初期化します
- 条件式が真(true)の間、{ }の中の文が実行されます
- { }の中の文が1度実行されるたびに、ループ後の処理行います。その後再度、条件2の判断を行います
for(初期化; 条件式; ループ後の処理){ 文; 文; }
フローチャートをみると、while文と繰り返しを行う点では同じであることがわかります。
実際に記述する形式としては
- 変数を初期化
- 条件式を記述 1 での変数を用いる
- 1 の変数に変化を加える処理を記述
と記述します。これらは
- 初期化処理
- 条件式
- ループ後の処理
と呼ばれています。
【for文】
public class For{ public static void main(String[ ] args){ for(int i = 1; i <= 5; i++){ System.out.println(i); } } }
実行結果
1 2 3 4 5
【for文2】
public class For2{ public static void main(String[ ] args){ for(int i = 1; i > 0; i++){ // この条件は常に成り立つ System.out.println(i); } } }
実行結果
終了しなくなるので、コンソールの[終了]ボタンで停止させてください。
while文とfor文の使い分け
while文とfor文を双方見てきました。
条件が成立している間はループを行うというように、動作は似ていますのでwhile文をfor文に、for文をwhile文に書き換えることが可能です。
しかし、for文はカウンタになる変数がはっきりしており、ループを実行する回数を明確に決められる点がwhileループと異なります。
一般にはwhileループとforループは次のように使い分けられています。
- while文はループの回数が明確に決まっていないときに用いる
- for文はループの回数が明確に決まっているときに用いる
for文の初期化、条件式、カウンタの再設定の省略
for文では必要がなければ、初期化の処理、条件式、ループ後の処理を省略することができます。
初期化を省略
初期化処理を行わない記述例です。
変数countはfor文までの間に宣言と初期化を行っておく必要があります。
for( ; count <= 100; count++){ }
初期化処理、条件式を省略
初期化処理、条件式を記述しない例です。
条件式を書かない場合は無限ループになります。
for( ; ; count++){ }
ループ後の処理
ループ後の処理を省略した例です。
ループ中にカウンタが変化しないと無限ループに陥る可能性があります。
for(int count = 0; count <= 100;){ }
[動画解説]
vimeo.com
【総和を求める】
public class Sum{ public static void main(String[ ] args){ int i = 1, sum = 0; while(i <= 100){ sum += i; i++; } System.out.println("1~100までの総和は" + sum); //初期化 sum = 0; for(i = 1; i <= 100; i++){ sum += i; } System.out.println("1~100までの総和は" + sum); } }
実行結果
1~100までの総和は5050 1~100までの総和は5050
ヒント! 意図的な無限ループの使用
実は意図的に無限ループを用いる場合があります。
しかし、何らかの方法でこの無限ループを抜ける必要があります。
そのときはswitch文で出てきたbreak文を用います。
[動画解説]
vimeo.com
do-while文
while文やfor文と同様に繰り返しを実行する文としてdo-while文があります。
while文やfor文との相違は条件式を調べるタイミングです。
do-while文の書式は以下の通りです。
do{ 文; 文; … } while(条件式);
do-whileとwhile文の違い
while文とdo-while文の相違は条件式を判定するタイミングです。
while文がまず初めに条件式が成立しているかを調べるのに対して、do-while文はdo-whileブロックの文を実行したのち、条件式を検査します。
また、最後に「;」(セミコロン)が必要になります。
while文やfor文はまず条件式を調べてwhileブロックやforブロックを実行するか決定する。
ループを1回も実行しないこともある。do-while文ではまずdo-whileブロックを1回実行した後に条件式を検査する。
最低1回はループを実行する。
この相違は下のフローチャートを見ていただければわかり易いと思います。合わせてwhile文のフローチャートも見てください。
【do-while文】
public class DoWhile{ public static void main(String[ ] args){ int i = 0; String message = "Hello"; do{ System.out.println(message + ++i); }while( i < 5 ); } }
実行結果
Hello1 Hello2 Hello3 Hello4 Hello5
[動画解説]
vimeo.com
まとめ
繰り返し実行
繰り返し実行とは、何度も同じ処理を繰り返すプログラムを指します。
繰り返し処理の事をループとも呼びます。
while文
while文は条件式を満たしている間繰り返し処理を行います。
do-while文
do-while文は処理を最低一回は実行したい場合に利用されます。
for文
for文もwhile文と同様に繰り返し処理を行いますが、初期化やループごとに行う処理が記述できます。
独学で挫折しそうになったら、オンラインプログラミングスクール