for文

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


繰り返し

条件分岐と繰り返し、この章では繰り返しについて解説します。

これまで扱ってきたプログラムは、ソースコードの上から下へと実行されていきましたが、一度実行された箇所は再度実行されることはありませんでした。繰り返しを使うことで、ソースコードの一部をぐるぐるとループさせることができるようになります。

for文の基礎

「こんにちは」と 3回表示するプログラムを考えます。もちろん、以下のように書けば大丈夫。

		System.out.println("こんにちは");
		System.out.println("こんにちは");
		System.out.println("こんにちは");

ただ、これが 3回ではなく、「100回表示せよ」とかになったら大変です。そこで、繰り返しのひとつ for文について解説します。

for文は予約語forを使用し、以下の構文で記述します。

		for(第1エリア; 第2エリア; 第3エリア) {
			// 繰り返したい処理
		}

第1~第3エリアに記述する内容はそれぞれ以下の通り。

  • 第1エリア…変数の宣言や初期値の代入
  • 第2エリア…繰り返しを継続するかの条件、trueのとき繰り返しする。演算結果が boolean型の値となること。
  • 第3エリア…繰り返したい処理を終えた後に記述する内容。たいていは第 1エリアで宣言した変数の値の変更。

「こんにちは」と 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になるまで繰り返しを続けることなどが分かるかと思います。

for文を使用したプログラム (1)

「こんにちは」を指定回数表示する

指定した回数だけ「こんにちは」と表示するプログラムを作ってみます。

この仕様を満たすプログラムは次の通り。

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までの和を求める

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です。

continueとbreak

for文を始めとしたループ(繰り返し構文)の中では予約語continueおよびbreakを使用することができます。それぞれの意味は以下の通り。

  • continue…そのループの末尾まで移動する(次に第3エリアを実行していく)
  • break…そのループから抜ける

continuebreakを使うことで、ソースコードがすっきりする場合があります。

まずは使用例ということで、以下にサンプルプログラムを用意しました。

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文を使用したプログラム (2)

概要

幾つかのプログラムを作成することで、for文の使い方を理解していきましょう。

5つの数の合計と平均値

仕様を以下に定めます。

  • ユーザに 5つの数を入力してもらう。
  • 5つの数の合計と、その平均を表示する。なお、平均の値は小数点以下も表示すること。

この仕様を満たすプログラムは以下の通り。

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

九九の表

仕様を以下に定めます。

  • 「3×4=12」の形式で九九の表を表示する。
  • 計算結果が 1桁の場合に、ずれが表示されないよう整列して表示させる。

この仕様を満たすプログラムは以下の通り。

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  

素数判定

仕様を以下に定めます。

  • ユーザに数を入力してもらう。
  • 入力された数が素数かどうかを表示する。なお、素数についての詳細は以下。
    • 1以下の場合には異常表示する。
    • 2の場合は素数。
    • 3以上の場合は、2~(その数マイナス 1)までに割り切れる数があれば素数ではない、割り切れる数がなければ素数。

この仕様を満たすプログラムは以下の通り。

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は素数ではありません。
最終更新: 2013/01/31 , 公開: 2013/01/31
▲top