[PR] 迷惑メール トップページプロ3ゼミJavaJava入門講座一学期単位4 →1時間目

1時間目 for文

4−1−1.繰り返しの必要性

 処理部分を繰り返す必要は、どこに需要があると思いますか。
やはり、同じ事を繰り返す場合で、ユーザが要求した場合に毎回プログラムを読み込む のは面倒ですよね。
又、ソースでコピペ(※1)して書くのは冗長で効率も悪いですし、一つを修正した場合コ ピペし直す必要がありますからね。

※1 コピーアンドペーストの略。

 繰り返しに使うキーワード(識別子)は、「for」です。
構文で書くと以下のようになります。

for (最初に一回; 条件; 文の後に) {
    文
}
 少し変った形の構文に見えますが、Javaでは()の中に「;」があるのは後にも先にもこの「for」文だけで す。

4−1−2.for文の色々な形

具体的にプログラムで表すと次のようになります。

for (int i = 0; i < 10; i++) {
   System.out.println("i = " + i);
}
 変数iを宣言し初期化しているのが分かりますね。
「i < 10」は終了条件と考えると分かりやすいと思います。
iが0から始まって10なるまで「"i = " + i」を出力して、0から9までで合計10回 「System.out.println("i = " + i);」が実行されます。
処理する順番は決まっていて次のような順番で動作します。

for (最初の一回; (1); (3)) {
   (2);
}
 「最初の一回」は、変数を宣言する事が出来ますので、変数を宣言して初期化する場 合が多いですが、特殊なケースもある為一概には言えません。
初期化する場所は、「最初の一回」及び(2)以外はできません。
「最初の一回」で宣言した変数は、for文の括弧が閉じる範囲まで有効です。
通常のブロックの範囲と同じです。
(1)(2)(3)はその番号に実行して行きます。
 for文は、Javaで用意されている命令の中で一番特殊と言っても過言ではありません。
それは、for文は、()の中身を省略することが出来るからです。
それぞれ見て行きましょう。

・初期化部分を省略しているパターンです。
for (; i < 10; i++) {
    System.out.println("i = " + i);
}
 変数「i」がfor文ではなくその前で宣言されている必要があります。
例えば、事前にiの状態が分からないが最高でも「i < 10」の間までは、「"i = " + i」 を出力し、「i++」を行う場合などに使います。
・条件部分を省略しているパターンです。
for (int i = 0; ; i++) {
    System.out.println("i = " + i);
}
 こうすると無限ループになる可能性が出てきてしまいます。
「break」文という文を追加するとfor文を抜け出すことができる為、無限ループを解消す ることができます。
ほとんどの場合はbreak文を実行するための条件(if文を使って)を追加してfor文を抜け れますが、私はあまりお勧めしないタイプです。

・定期的に実行する文(3)を省略しているパターンです。
for (int i = 0; i < 10; ) {
    System.out.println("i = " + i);
}
 注意しなければいけないのは、このパターンも無限ループになる可能性がある事です。
(3)の変りに、(2)の文に「i」を増やさなければ無限ループになります。

・条件(1)及び定期的に実行する文(3)を省略しているパターンです。
for (int i = 0; ;) {
   System.out.println("i = " + i);
}
 終了条件を(2)のどこかに書かなければ無限ループになります。
又、iは定期的に変化しないため、(2)に書かなければiは変化しません。
このパターンだけではないのですが、他のパターンを含めて何かを想定されているパタ ーンと言うよりかは、for文の柔軟性から混じるパターンですのであまり使用することは ないと思います。
こういう書き方もできる程度でパターンを覚えておく必要はないはありません。

・最初の一回及び定期的に実行する文(3)を省略しているパターンです。
for (; i < 10;) {
   System.out.println("i = " + i);
}
 iをfor文の前で宣言し、(2)でiを10以上にしなければ無限ループになります。

・定期的に実行する(3)だけを記述したパターン。
for (; ; i++) {
   System.out.println("i = " + i);
}
 iをfor文の前で宣言し、(2)で終了条件でbreak文を記述しなければ無限ループになります。

・無限ループの典型です。
for (; ;) {
   System.out.println("i = " + i);
}
 for文で無限ループを実現する場合はこのように何も書かずに「; ;」だけを書きます。
一般的には、(2)にif文を使いbreak文でブロックを抜けます。

4−1−3.繰り返しを試してみよう

 今回も簡単なサンプルプログラムですが、for文を知るのに打って付けです。
Sample4_1_1.java
public class Sample4_1_1 {

    // ここからスタート
    public static void main(String[] args) {

        new For().view();

    }

}

class For {

    public void view() {

        System.out.println("1ずつ増やし10回繰り返します(iが0から10になるまで)");
        // 1ずつ増やし10回繰り返します(iが0から10になるまで)
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }

        System.out.println();

        System.out.println("2ずつ増やし5回繰り返します(iが0から10になるまで)");
        // 2ずつ増やし5回繰り返します(iが0から10になるまで)
        for (int i = 0; i < 10; i += 2) {
            System.out.println("i = " + i);
        }

        System.out.println();

        System.out.println("1ずつ減らし10回繰り返します(iが10から0になるまで)");
        // 1ずつ減らし10回繰り返します(iが10から0になるまで)
        for (int i = 10; i > 0; i--) {
            System.out.println("i = " + i);
        }
    }
}
1ずつ増やし10回繰り返します(iが0から10になるまで)
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9

2ずつ増やし5回繰り返します(iが0から10になるまで)
i = 0
i = 2
i = 4
i = 6
i = 8

1ずつ減らし10回繰り返します(iが10から0になるまで)
i = 10
i = 9
i = 8
i = 7
i = 6
i = 5
i = 4
i = 3
i = 2
i = 1

 ソース中にコメント(// 以降)「1ずつ増やし10回繰り返します(iが0から10になる まで)」と書かれていますが、「1ずつ増やし10回繰り返します」はあくまでも結果の話 で実際は、「iが0から10になるまで」をプログラムが行っているだけです。
for文の中に「i」を変更することになれば、10回繰り返すことは限りませんからあくまで も終了条件が「i > 10」になることに注意しましょう。

 ソース中のコメント「2ずつ増やし5回繰り返します(iが0から10になるまで)」と次 は書かれていますが、ここでは「2ずつ増やし5回繰り返します」というように5回繰り返 します。
ただ、先ほども説明したようにプログラムは「iが0から10になるまで」を行っているだけ で(2)の部分または(3)の部分で「i」が変わろうがプログラムは「i > 10」の終了条件を 見ているだけなのでfor文は「iが0から10になるまで」と1ずつ増やすfor文と変わらない コメントとなるのです。

 最後の処理のコメントで「1ずつ減らし10回繰り返します(iが10から0になるまで)」 と書かれているの処理は、iが10から始まって0になるまで繰り返すのですから、「1ずつ 増やし10回繰り返します」のfor文と同じで処理を10回繰り返しているのには変わりあり ません。
変わるのは、「i」の初期化と定期的に変わる「i」の変化です。

単位3 判断が分かるときはに戻る     2時間目 配列に進む

単位4 処理を繰り返すにはに戻る

トップページに戻る