Java講座: 制御構文(繰り返し)
同じ処理を何度も行いときに使うのが繰り返し処理です。Javaではwhile文とfor文が使えます。
while文
「〇〇である間ずっと××する」といった処理を行いたいときに使います。構文は以下の通りです。
構文
while (条件式) {
// 処理
}プログラム例
以下のプログラムを実際に実行してみて、同じ処理がちゃんと繰り返されていることを確認してみましょう。
public class Main {
public static void main(String[] args) {
int i = 1;
while (i < 6) {
System.out.println(i + "回目のループです");
i++;
}
}
}この処理は5回繰り返されるはずです。繰り返すたびにi++によってiはインクリメントされ、iが6になったタイミングで条件式を満たさなくなるためです。
無限ループ
while文は条件式がtrueである限り繰り返す構文です。ではこのように書いたらどうなるでしょう?
int i = 1;
while (true) {
System.out.println(i + "回目のループです");
i++;
}結論から言うと、このプログラムは一度実行するとずっと動き続けてしまいます。
このように、条件式が常にtrueとなると無限ループという現象が起きます。無限ループはコンピュータへの負荷を書けたり、プログラムをフリーズさせる原因となるため、基本的には避けるべきです。
一方で、意図的に無限ループを発生させることもあります。その際には、手動でループから脱出・制御できる方法を確保しておかなければなりません。
手動でループを制御する方法として、breakとcontinue命令があります。
break命令
break命令については前回のswitch文で一度使っています。switch文のときと同様、ループなどの処理から抜け出すことができる命令です。実際にプログラムを書いたほうがわかりやすいでしょう。
プログラム例
「1から順番に自然数を足していき、何回目の足し算で合計が100を超えるか」というプログラムです。
public class Main {
public static void main(String[] args) {
int i = 1;
int sum = 0; // 合計を表す変数
while (true) {
sum += i; // sum = sum + i;と同じ
if (sum > 100) {
break;
}
i++;
}
System.out.println("合計が100を超えるのは、" + i + "回目の計算のときです。");
}
}while (true)によって本来無限ループとなるはずですが、break命令によって途中でループを脱出しています。
continue命令
break命令がループそのものを抜け出す命令であるのに対し、continue命令は現在の周回だけをスキップできる命令です。
プログラム例
「1から100までの自然数の中で、偶数のみを足した合計」を求めるプログラムです。
public class Main {
public static void main(String[] args) {
int i = 1;
int sum = 0;
while (i <= 100) {
if (i % 2 != 0) {
i++;
continue;
}
sum += i;
i++;
}
System.out.println("合計値は " + sum + "です。");
}
}このように、「この条件を満たすときだけループをスキップしたい」と思ったときにcontinue命令が役に立ちます。
for文
for文は、あらかじめループしたい回数が決まっているときに使う構文です。おそらくこっちのほうが今後使う機会は多いでしょう。
for文の構文は以下の通りです。一つずつ説明します。
構文
for (初期化式; 継続条件式; 増減式) {
// ...
}とりあえず実際に書くときのサンプルコードを添付します。
これは「5回だけ繰り返し『Hello,world!』を出力するプログラム」です。
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("Hello, world!");
}
}
}初期化式は、for文のループに初めて入った瞬間に一度だけ実行されます。サンプルコードではint i = 0;と書かれていますね。
このように、ここでは一般的にはカウンターとして使用する変数を初期化します。カウンター変数にはi,j,k...を使用する暗黙のルールがあります。特に理由がない限り、これらの変数名を使うのが良いでしょう。
継続条件式は、ループを継続する条件を表す式です。while文の条件式と同じだと考えて大丈夫です。
増減式は、ループ内の処理が1回終わるごとに実行される式です。基本的にはi++といったカウンター変数をインクリメントする式を使いがちです。ただし、i += 2とすればループのたびにiを2ずつ増やすこともできますし、i--とすればデクリメントすることもできます。
練習問題
for文はこの先いっぱい使うので練習しておきましょう!
https://atcoder.jp/contests/abc272/tasks/abc272_a
https://atcoder.jp/contests/abc288/tasks/abc288_a
for文を使うときの注意点
for文の初期化式で初期化された変数は、for文の中でしか使用することはできません!
例えば、以下のコードはエラーになります。
for (int i = 0; i < 5; i++) {
System.out.println(i + "回目のループです");
}
System.out.println("全部で" + i + "回ループしました"); // iをfor文の外で使ってしまっている!この他にも、if文やfor文の中で宣言・初期化された変数はその文の中でしか使用することができません。
筆者はプログラミング学びたての頃これに気付かず無限にエラーを吐き続けていました。みなさんはこうならないように。