判断と繰返し

条件分岐

条件によって処理を変えるには,if(イフ)や else(エルス)を使います。 まず実例を見てみましょう。

class Test {
    public static void main(String[] args) {
        int x = 17;       // この数をいろいろ変えてやってみてね
        if (x < 10) {                 // もし x < 20 なら
            System.out.println("x は 10 より小さい");
        } else if (x < 20) {          // そうでなく,もし x < 20 なら
            System.out.println("x は 20 より小さい");
        } else {                      // そうでなければ
            System.out.println("x は 20 以上である");
        }
    }
}

ifelse

    if (何々) {   // もし何々なら
        ....      // 何々が成り立つとき実行する命令
    }

あるいは

    if (何々) {   // もし何々なら
        ....      // 何々が成り立つとき実行する命令
    } else {      // そうでなければ
        ....      // 何々が成り立たないとき実行する命令
    }

あるいは

    if (A) {        // もし A なら
        ....        // A が成り立つとき実行する命令
    } else if (B) { // そうでなければ,もし B なら
        ....        // A が成り立たず,B が成り立つとき実行する命令
    } else {        // そうでなければ
        ....        // A も B も成り立たないとき実行する命令
    }

などのような形で使います。

if の次の ( ) の中には次のような条件式が入ります。

    a == b (a と b は等しい)
    a != b (a と b は等しくない)
    a < b  (a は b より小さい)
    a > b  (a は b より大きい)
    a <= b (a は b より小さいか等しい)
    a >= b (a は b より大きいか等しい)

この最初の a == ba = b と間違わないように注意してください。 a = b では「ab の値を代入する」という意味になってしまい,エラーになります。 比較は ==,代入は = と覚えてください。 ifelse の直後の { } の中に命令が一つしかないなら,{ } を省略してもかまいません。 つまり,さきほどのプログラムは次のように書いてもかまいません。

    if      (x < 10) System.out.println("x は 10 より小さい");
    else if (x < 20) System.out.println("x は 20 より小さい");
    else             System.out.println("x は 20 以上である");

while による繰返し

ある条件が満たされている間,何かの処理を繰り返すには,while(ホワイル)という命令を使い,

    while (条件) {
        繰り返し実行したい命令
    }

のようにします。繰返しのことをループともいいます。

たとえば次のプログラムを見てください。

class Test {
    public static void main(String[] args) {
        int i = 1;                  // 変数 i を作り,初期値を 1 とする
        while (i <= 5) {            // i ≦ 5 なら
            System.out.println(i);  // i の値を出力
            i = i + 1;              // i を 1 だけ増やす
        }                           // while の頭に戻って繰り返す
    }
}

これを実行すると,画面に

    1
    2
    3
    4
    5

と出力されます。

慣れないと難しいのは i = i + 1; でしょう。 これは

今までの i の値に 1 を加えたものを新たに i に代入する

という意味です。言い換えれば,

i の値を 1 だけ増やす

ということです。つまり,

1 だったら 2 にする,2 だったら 3 にする,……

というわけです。

数学の式だと考えたら i = i + 1; は理解できません。

i + 1 を計算 → i に代入

というようにとらえなければなりません。

この

    i = i + 1;

という命令は非常によく使うので,

    i++;    または    ++i;

と略記してよいことになっています。 この略記法を使えば,さきほどのプログラムは次のように書けます。

class Test {
    public static void main(String[] args) {
        int i = 1;                  // 変数 i を作り,初期値を 1 とする
        while (i <= 5) {            // i ≦ 5 なら
            System.out.println(i);  // i の値を出力
            i++;                    // i を 1 だけ増やす
        }                           // while の頭に戻って繰り返す
    }
}

また,

    i = i + n;

もよく使うので,

    i += n;

と略記してよいことになっています。

要するに,

    i++;    ++i;    i += 1;    i = i + 1;

はみな同じことです。 ただし i++++i は,別の計算の中で使ったときに,意味が微妙に違います。 これについては後で説明します。

for による繰返し

上の例もそうですが,

    i = 1;                      // i に初期値を与える
    while (i <= 5) {            // i が何らかの条件を満たせば
        System.out.println(i);  // i について何かをする
        i++;                    // i を増やす
    }                           // 繰り返す

のような流れのプログラムは非常に多いので,これを次のように略記してもいいことになっています。

    for (i = 1; i <= 5; i++) {  // i が 1 から 5 まで
        System.out.println(i);  // i について何かをする
    }                           // 繰り返す

この略記法は非常に多く使われますので,ぜひマスターしてください。

また,変数 i を作るのもまとめて

    for (int i = 1; i <= 5; i++) {  // i が 1 から 5 まで
        System.out.println(i);  // i について何かをする
    }                           // 繰り返す

のようにもできます。 こうして for の中で作った変数は,この for ループの中でしか使えません。

なお,while でも for でも,中かっこ { } の中の命令がたった一つなら,中かっこ { } を省略して

    for (int i = 1; i <= 5; i++)
        System.out.println(i);

のように書くことができます。

和を求める

次のプログラムは 1 から 10 までの整数の和を求めます。

class Test {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 10; i++)
            sum += i;
        System.out.println("合計: " + sum);
    }
}

もっと繰返し

1,3,5,7,9 と数を一つ飛びに出力するには

    for (int i = 1; i <= 10; i += 2)
        System.out.println(i);

とします。

また,10 から 1 に向かってカウントダウンするには

    for (int i = 10; i >= 1; i--)
        System.out.println(i);

とします。 この i--i = i - 1 と同じことで,値を 1 だけ減らします。

次のようにすれば何が出力されるでしょうか?

    for (int i = 1; i <= 100; i *= 2)
        System.out.println(i);

この i *= 2i = i * 2 と同じことです。

for は,数を出力する必要がなくても,同じメッセージを何回か出力するのによく使われます。 たとえば「ごめんなさい」を10回出力するには

    for (i = 1; i <= 10; i++)
        System.out.println("ごめんなさい");

とします。もっとも,Java言語のプログラマはこれをむしろ

    for (i = 0; i < 10; i++)
        System.out.println("ごめんなさい");

のように書くのがふつうです。 つまり数は 0 から数え始めるのです。

永久にループする無限ループは,次のようにします。

    while (true) {
        System.out.print("ほげ");
    }

画面に「ほげほげほげ……」と永久に出力します。 あわてて電源を切らないでください。 Ctrl-C(コントロールキーを押し下げた状態で c のキーをたたくこと)で終了します。

for でも while でも,break 命令を使えばいつでもループから脱出できます。 たとえば

    double x;
    while (true) {              // 以下を繰り返す:
        x = Math.random();      //   x に0〜1の乱数を入れる
        if (x > 0.99) break;    //   x > 0.99 ならループ脱出
        System.out.println(x);  //   x の値を出力
    }

のように使います。 Math.random() は 0 以上 1 未満の乱数(でたらめな数)を返すメソッドです。

なお,これは次のようにも書けます。

    double x;
    while (true) {
        if ((x = Math.random()) > 0.99) break;
        System.out.println(x);
    }

つまり,代入文をかっこで囲んでその値を調べるわけです。 ちょっとややこしい書き方ですが,よく使います。

上の書き方が理解できれば,これは次のようにも書けることがおわかりでしょう。

    double x;
    while ((x = Math.random()) <= 0.99)
        System.out.println(x);

では次はどうでしょうか。

    int i = 0;
    while ((i = i + 1) <= 10)
        System.out.println(i);

これは次のようにも書けます。

    int i = 0;
    while (++i <= 10)
        System.out.println(i);

この while (++i <= 10) は,i を 1 だけ増やして,その(増やした後の)値が 10 以下であれば繰り返すということです。

次のものは,似ていますが,ちょっと違います。

    int i = 0;
    while (i++ <= 10)
        System.out.println(i);

この while (i++ <= 10) は,i を 1 だけ増やして,増やす前の値が 10 以下であれば繰り返すということです。

減らす方の --ii-- も同じ関係にあります。

do による繰返し

forwhile より使われていませんが,do という繰返し命令もあります。 これは

    do {
        繰り返し実行したい命令
    } while (条件);

のように,条件判定が普通の while と違って最後に来ます。 たとえば

    int i = 1;
    do {
        System.out.println(i);
        i = i + 1;
    } while (i <= 5);

のように使います。 これは

    int i = 1;
    while (true) {
        System.out.println(i);
        i = i + 1;
        if (i > 5) break;
    }

と同じことになります。


奥村晴彦

Last modified: 2005-09-22 15:36:04