条件分岐と繰り返し、この章では繰り返しについて解説します。
これまで扱ってきたプログラムは、ソースコードの上から下へと実行されていきましたが、一度実行された箇所は再度実行されることはありませんでした。繰り返しを使うことで、ソースコードの一部をぐるぐるとループさせることができるようになります。
「こんにちは」と 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は素数ではありません。