条件分岐と繰り返し、この章では繰り返しについて解説します。
これまで扱ってきたプログラムは、ソースコードの上から下へと実行されていきましたが、一度実行された箇所は再度実行されることはありませんでした。繰り返しを使うことで、ソースコードの一部をぐるぐるとループさせることができるようになります。
「こんにちは」と 3回表示するプログラムを考えます。もちろん、以下のように書けば大丈夫。
System.out.println("こんにちは"); System.out.println("こんにちは"); System.out.println("こんにちは");
ただ、これが 3回ではなく、「100回表示せよ」とかになったら大変です。そこで、繰り返しのひとつ for文について解説します。
for文は予約語for
を使用し、以下の構文で記述します。
for(第1エリア; 第2エリア; 第3エリア) { // 繰り返したい処理 }
第1~第3エリアに記述する内容はそれぞれ以下の通り。
「こんにちは」と 3回表示するプログラムを for文を使って実現したものは以下になります。
F101/F101.java
/** * 「こんにちは」を 3回表示します。 */ public class F101 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { for(int i = 0; i < 3; i ++) { System.out.println("こんにちは"); } } }
実行結果は以下の通り。
こんにちは こんにちは こんにちは
プログラムが具体的にどのように実行されるのか、以下に展開して説明します。繰り返しは同じところをぐるぐる回るので、複雑な場合には特にじっくり考えてみましょう。バグが発生することが多いです。
// 説明用の boolean変数 boolean temporary; // 第1エリアの実行 int = 0; // ----- 1周目 ----- // 第2エリアの条件判定 temporary = (i < 3); // iは 0のため true // 処理を実行 System.out.println("こんにちは"); // 第3エリア i ++; // iは 1になる // ----- 2周目 ----- // 第2エリアの条件判定 temporary = (i < 3); // iは 1のため true // 処理を実行 System.out.println("こんにちは"); // 第3エリア i ++; // iは 2になる // ----- 3周目 ----- // 第2エリアの条件判定 temporary = (i < 3); // iは 2のため true // 処理を実行 System.out.println("こんにちは"); // 第3エリア i ++; // iは 3になる // ----- 4周目 ----- // 第2エリアの条件判定 temporary = (i < 3); // iは 3のため false // falseになったので、4周目は実施せずに for文から抜ける
第1エリアは事前に 1回だけ実行されていること、第 2エリアが falseになるまで繰り返しを続けることなどが分かるかと思います。
指定した回数だけ「こんにちは」と表示するプログラムを作ってみます。
この仕様を満たすプログラムは次の通り。
F102/MySystem.java
(ライブラリをそのまま利用します)
F102/F102.java
/** * 指定した回数「こんにちは」を表示します。 */ public class F102 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int count; count = MySystem.in.getInt("回数を入力してください"); for(int i = 0; i < count; i ++) { System.out.println("こんにちは"); } } }
実行結果の例は以下の通り。
回数を入力してください? 5 こんにちは こんにちは こんにちは こんにちは こんにちは
回数を入力してください? -100
実行結果の 2例目のように、最初から条件を満たさない場合、中の処理は一度も実行されません。for文のこのような性質を前判定と言います。このあと登場する while文も前判定、do while文は後判定です。
なお、今回のプログラムであまりに大きな数字を入力すると、プログラムが終了するまでにとても時間がかかります。プログラムを強制終了させたいときには、Consoleタブの右端にある赤色のボタン(下図)を押してください。プログラムが終了します。
1から 100までの合計(計算結果は 5,050)を計算するプログラムを作ります。
仕様を満たすプログラムは以下の通り。
F103/F103.java
/** * 1から 100までの和を求めます。 */ public class F103 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int sum = 0; for(int i = 1; i <= 100; i ++) { sum += i; } System.out.println("1から 100までの合計は " + sum + "です。"); } }
実行結果は以下の通り。
1から 100までの合計は 5050です。
for文を始めとしたループ(繰り返し構文)の中では予約語continue
およびbreak
を使用することができます。それぞれの意味は以下の通り。
continue
…そのループの末尾まで移動する(次に第3エリアを実行していく)break
…そのループから抜けるcontinue
やbreak
を使うことで、ソースコードがすっきりする場合があります。
まずは使用例ということで、以下にサンプルプログラムを用意しました。
F104/F104.java
/** * continueとbreakの動きを確認します。 */ public class F104 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { for(int i = 0; i < 10; i ++) { if(i == 3) { continue; } if(i == 7) { break; } System.out.println(i); } } }
実行結果は以下の通り。
0 1 2 4 5 6
変数 iが 3のときcontinue
が実行されるため、3は表示されません。また、iが 7のときにはbreak
が実行されるので、for文から抜けてしまい、結果的に 7や 8は表示されないことになります。
幾つかのプログラムを作成することで、for文の使い方を理解していきましょう。
仕様を以下に定めます。
この仕様を満たすプログラムは以下の通り。
F105/MySystem.java
(ライブラリをそのまま利用します)
F105/F105.java
/** * 5つの数の合計と平均を求めます。 */ public class F105 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int sum = 0; double average; for(int i = 0; i < 5; i ++ ) { int input = MySystem.in.getInt((i + 1) + "つ目の数を入力してください"); sum += input; } // double型で計算するため 5ではなく 5.0と記述する average = sum / 5.0; System.out.println("合計は " + sum); System.out.println("平均は " + average); } }
実行結果の例は以下の通り。
1つ目の数を入力してください? 100 2つ目の数を入力してください? 200 3つ目の数を入力してください? 300 4つ目の数を入力してください? 400 5つ目の数を入力してください? 501 合計は 1501 平均は 300.2
仕様を以下に定めます。
この仕様を満たすプログラムは以下の通り。
F106/F106.java
/** * 九九を表示します。 */ public class F106 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { for(int j = 1; j <= 9; j ++) { for(int i = 1; i <= 9; i ++) { int value = i * j; System.out.print(j + "×" + i + "="); if(value < 10) { // 1桁の場合はスペースを入れる System.out.print(" "); } System.out.print(value + " "); } System.out.println(); } } }
実行結果の例は以下の通り。
1×1= 1 1×2= 2 1×3= 3 1×4= 4 1×5= 5 1×6= 6 1×7= 7 1×8= 8 1×9= 9 2×1= 2 2×2= 4 2×3= 6 2×4= 8 2×5=10 2×6=12 2×7=14 2×8=16 2×9=18 3×1= 3 3×2= 6 3×3= 9 3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27 4×1= 4 4×2= 8 4×3=12 4×4=16 4×5=20 4×6=24 4×7=28 4×8=32 4×9=36 5×1= 5 5×2=10 5×3=15 5×4=20 5×5=25 5×6=30 5×7=35 5×8=40 5×9=45 6×1= 6 6×2=12 6×3=18 6×4=24 6×5=30 6×6=36 6×7=42 6×8=48 6×9=54 7×1= 7 7×2=14 7×3=21 7×4=28 7×5=35 7×6=42 7×7=49 7×8=56 7×9=63 8×1= 8 8×2=16 8×3=24 8×4=32 8×5=40 8×6=48 8×7=56 8×8=64 8×9=72 9×1= 9 9×2=18 9×3=27 9×4=36 9×5=45 9×6=54 9×7=63 9×8=72 9×9=81
仕様を以下に定めます。
この仕様を満たすプログラムは以下の通り。
F107/MySystem.java
(ライブラリをそのまま利用します)
F107/F107.java
/** * 素数かどうかを表示します。 */ public class F107 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int number; System.out.println("[素数判定プログラム]"); number = MySystem.in.getInt("数を入力してください(2以上)"); if(number < 2) { System.out.println("1以下の数が入力されました。"); } else if(number == 2) { System.out.println(number +"は素数です。"); } else { boolean isSosuu = true; for(int i = 2; i <= number - 1; i ++) { if(number % i == 0) { // 割り切れた場合は素数ではない isSosuu = false; break; } } if(isSosuu) { System.out.println(number + "は素数です。"); } else { System.out.println(number + "は素数ではありません。"); } } } }
実行結果の例は以下の通り。
[素数判定プログラム] 数を入力してください(2以上)? 31 31は素数です。
[素数判定プログラム] 数を入力してください(2以上)? 33 33は素数ではありません。