while文

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


while文の基礎

while文も、for文と同じく繰り返し(ループ)を実現できます。

for文を振り返ってみると、以下の構造となっていました。

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

while文は予約語whileを使用し、以下の形で記述します。for文の第 2エリアの部分だけの形になっています、シンプルですね。また for文と同じく前判定になります。

		while(boolean型の値となる式) {
			// 繰り返したい処理
		}

サンプルとして、2から 10までの偶数を表示するプログラムを以下に記述しました。このようなプログラムならば、本当は for文のほうがすっきりと記述することができます。

F201/F201.java

/**
 * 2~10までの偶数を表示します。
 */
public class F201 {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		int number = 2;
		
		while(number <= 10) {
			System.out.println(number);
			number += 2;
		}
	}
}

実行結果は以下の通り。

2
4
6
8
10

無限ループ

さて、もしwhile文の条件のところにtrueと記述したらどうなるでしょうか。具体的には以下の形です。

		while(true) {
			// 繰り返したい処理
		}

この場合、条件は常に trueとなるためプログラムは延々とループすることになり、終わりません。そのため無限ループと呼ばれます。

無限ループから脱出するための方法は幾つかあるのですが、一番多いのはbreakを使用する方法だと思います。その例を以下で見ていきましょう。

6が出るまでサイコロを振り続けるプログラムを考えてみます。

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

F202/F202.java

/**
 * 6の目が出るまでサイコロを振り続けます。
 */
public class F202 {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		int sai;
		
		System.out.println("6の目が出るまでサイコロを振り続けます。");
		
		while(true) {
			// 1~6のランダム値を saiに代入する
			sai = 1 + (int)(Math.random() * 6.0);
			System.out.println("サイコロの目は " + sai + "でした。");
			
			// 6の目が出たら whileループから抜ける
			if(sai == 6) {
				break;
			}
		}
		
		System.out.println("プログラムを終了します。");
	}
}

実行結果の例は以下の通り。

6の目が出るまでサイコロを振り続けます。
サイコロの目は 3でした。
サイコロの目は 5でした。
サイコロの目は 3でした。
サイコロの目は 4でした。
サイコロの目は 5でした。
サイコロの目は 1でした。
サイコロの目は 1でした。
サイコロの目は 3でした。
サイコロの目は 3でした。
サイコロの目は 5でした。
サイコロの目は 3でした。
サイコロの目は 5でした。
サイコロの目は 3でした。
サイコロの目は 6でした。
プログラムを終了します。

数当てゲーム

while文や if文の理解を深めるために、「数当てゲーム」を製作してみます。仕様は以下の通り。

  • 正答は 1から 100までのランダムな値とする。
  • ユーザから数字の入力を受け付ける。
  • 入力された数字と正答との大小関係を比較して、「それより小さい」「それより大きい」など表示する。
  • 入力された数字が正答だった場合は、ゲームを終了する。
  • ゲームを終了する際には、ユーザが入力した回数を表示する。

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

F203/MySystem.java(ライブラリをそのまま利用します)

F203/F203.java

/**
 * 数当てゲームです。
 */
public class F203 {
	
	/**
	 * メインメソッド。
	 * @param args 引数
	 */
	public static void main(String[] args) {
		int answer;
		int input;
		int counter = 0;
		System.out.println("[数当てゲーム]");
		System.out.println("1~100の数を当てよう。");
		
		// 正答を決めます。
		answer = 1 + (int)(Math.random() * 100.0);
//		System.out.println("テスト用: 正答は " + answer);
		
		while(true) {
			counter ++;
			input = MySystem.in.getInt("数字を入力してください");
			
			if(input < answer) {
				System.out.println(input + "よりは大きい。");
			} else if(input > answer) {
				System.out.println(input + "よりは小さい。");
			} else {
				System.out.println("正解!");
				break;
			}
		}
		
		System.out.println("正解までに " + counter + "回かかりました。");
	}
}

実行結果の例は以下の通り。

[数当てゲーム]
1~100の数を当てよう。
数字を入力してください? 70
70よりは小さい。
数字を入力してください? 50
50よりは大きい。
数字を入力してください? 60
60よりは大きい。
数字を入力してください? 65
65よりは小さい。
数字を入力してください? 63
63よりは小さい。
数字を入力してください? 62
正解!
正解までに 6回かかりました。

上記のサンプルソースコードの一部に、//で処理をコメントアウトした行があります。このコメントを外すと正答が表示されるため、テストを実施するときに便利です。プログラムを製作する際には、こうやって値を画面などに表示させることでテストを実施していくことがよくあります。

最終更新: 2013/01/31 , 公開: 2013/01/31
▲top