for

last-modified: Dec./26th/2001

前節では while ループについて説明しました。本節では、やはり繰り返し制御構文である for ループについて説明します。

基本構文

for (初期条件; 繰り返し条件; 継続処理) {
	ブロック
}

if 文のところで、"{" から "}" までをブロックと呼ぶことは紹介しました。 for ループは、繰り返し条件が真である限り、ブロック内を繰り返し実行し続けます。

初期状態、繰り返し条件、継続処理は全て省略可能です。その場合、セミコロンだけ記述します: for(;;){...}

実行可能な具体例で見てみましょう。

ForDemo.java:

class ForDemo {
	public static void main(String[] args) {
		for (int i = 0; i <= 2; i++) {
			System.out.println("カウンタ:" + i);
		}
	}
}

これは、整数型変数 i を0で初期化して、ブロック内部が実行されるたびに i の値を一つ増やします。増やした後で、再びブロック内部を実行するかどうかを判定するために、条件文 i <= 2 を評価します。これが true (真)を返せばブロック内部を実行します。

噛み砕くと、次のようになります。

  1. 最初は i = 0 なので i <= 2 は真を返すのでブロック内部が実行され、最後に1加えられて i = 1 になります。
  2. 続いて条件文が評価されるのですが、いまは i = 1 なので条件文が真となりブロック内部が実行され、最後に1加えられて i = 2 になります。
  3. 続いて条件文が評価されて、今度も条件文 i <= 2 は真なのでブロックが実行されます。

以上、都合3回ブロック内部を繰り返します。3回実行した最後に i = 3 になるので、条件文が false (偽)となり、ブロック内部は実行されません。

上のサンプル ForDemo.java の実行例は次のようになります:

C:\>cd java
C:\java>javac ForDemo.java
C:\java>java ForDemo
カウンタ:0
カウンタ:1
カウンタ:2
C:\java>

そろそろ Java アプリケーションのコマンドラインからの実行に慣れてもらいたいと思います。

この for 文を while 文で書き換えると次のようになります:

int i = 0;
while (i <= 2) {
	System.out.println("カウンタ:" + i);
	i++;
}

変数の有効範囲

ここで、変数の話をしましょう。変数は、宣言したブロック内でしか有効ではありません。従って、 for(int i=0; i<=10; i++){...} とすると、変数 i は、この for ブロック内でしか有効ではありません。次の例は誤りです:

//間違っている例

for (int i=0; i<=10; i++) {
	System.out.print(i + " ");
}

//ブロックの外部で i は定義されていない
// 未定義の変数 i を使っているのでエラー
System.out.print("counter: " + i);

次のように修正すべきです:

int i = 0;
for (; i <= 10; i++) {
	System.out.print(i + " ");
}
System.out.print("counter: " + i);

このとき、実行結果は次のようになります:

C:\Java>java TestFor
0 1 2 3 4 5 6 7 8 9 10 counter=11

繰り返し、条件分岐はプログラム開発では必ず使います。本格的に開発を始める前に、十分なれておくと良いでしょう。

実際に開発を始めると、繰り返しブロックから、途中で脱出したいことがあります。そのときは continue; 或いは break; を使います。次に、そのことについて説明します。

サンプル

ここでは簡単なサンプルだけ挙げておきます:

class TestFor {
	public static void main(String[] args) {
		for (int i=0;i<=10; i++) {
			System.out.print(i + ": ");
		}
	}
}

初期条件では、カウンター変数の型宣言と初期化を同時にしています。

C:\Java>javac TestFor.java
C:\Java>java TestFor
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

サンプル

次のサンプルは、イタレーションによって円周率を計算するものです。

class CalPi {
	public static void main(String[] args) {
		if (args.length != 1) {
			System.out.println("イタレーションの回数を入力してください。");
			return;
		}
		//変数定義
		int steps = Integer.parseInt(args[0]);
		double calpi=0, pi=0;
		int pm=-1;
		//円周率計算の公式
		for (int i=0; i < steps; i++) {
			pm *= -1;
			calpi += pm/(2.0*i + 1.0);
			pi = calpi*4;
			System.out.println(i + ": " + pi);
		}
		System.out.println("----------------------");
		//計算結果の円周率
		System.out.println("計算結果:" + pi);
		//Math クラスで定義される円周率
		System.out.println("  円周率:" + Math.PI);
	}
}
C:Java>javac CalPi.java
C:\Java>java CalPi 5000
0: 4.0
1: 2.666666666666667
2: 3.466666666666667
3: 2.8952380952380956
4: 3.3396825396825403
5: 2.9760461760461765
省略
4995: 3.141392493463693
4996: 3.1417927736598306
4997: 3.1413925735597807
4998: 3.1417926935957916
4999: 3.141392653591791
----------------------
計算結果:3.141392653591791
  円周率:3.141592653589793

5000 回、繰り返しても有効数字 3 桁ですから、この公式の収束速度は非常に低いことが分かります。因みに、50000 回の繰り返しで 3.1415726535897814 で、有効数字 5 桁です。



Copyright © 2001 SUGAI, Manabu. All Rights Reserved.