コンピュータ基礎および演習II

例題

条件判定: 3つの整数から最大値を求める

3 つの値 x, y, z の最大値を求めて出力するプログラム例を 3 とおり示します。 同じ仕事をするプログラムでありながら、 少しずつ違う書き方になっています。 if 文の使い方としてよく現れる書き方も含まれているので、 それらの点に注目しましょう。

- 変数の比較だけを行う方式

最初に示すプログラムは、 3 つの変数の値を 2 つずつ比較して、 最大のものを見つけようという方針です。

[Max3a.java]

class Max3a {
    public static void main(String[] args) {
	int x = 5;
	int y = 2;
	int z = 3;
	int max;

	if (x > y)
	    if (x > z)
		max = x;
	    else
		max = z;
	else
	    if (y > z)
		max = y;
	    else
		max = z;

	System.out.println("最大値は " + max + " です");

    }
}

最初に xy を比較する if 文があります。 x が大きければ、 else の前の文を実行します。 この場合の else の前の文とは、 if (x > z) max = x; else max = z; 全体です。 また、 else の後の文は、 if (y > z) max = x; else max = z; 全体です。
(if 文全体を一つの文として扱うということを思い出してください。)

xy より大きければ、 xz の大きい方が最大となります。 そうでなければ (yx 以上であれば) 、 yz の大きい方が最大となります。 内側の if 文で、 xz または、 yz の大きい方を変数 max に代入していま す。

この方法は実はあまり勧められるものではありません。 変数が 3 つだから良いようなものの、 変数の数が増えると条件分岐が複雑になってしまうからです。

- and を使う方法

次のプログラムは、起こり得るすべての条件を and で結び記述したものです。

[Max3b.java]

class Max3b {
    public static void main(String[] args) {
	int x = 5;
	int y = 2;
	int z = 3;
	int max;

	if (x >= y && x >= z) {
	    System.out.println("x が最大です");
	    max = x;
	}
	else if (y >= x && y >= z) {
	    System.out.println("y が最大です");
	    max = y;
	}
	else {
	    System.out.println("z が最大です");
	    max = z;
	}

	System.out.println("最大値は " + max + " です");

    }
}

最初の if 文では、 xy よりも大きく、 なおかつ xzよりも大きいとき、 maxx の値を代入し、 それと同時に「 x が最大です」と表示します。

else の後の if 文も同様に、 y が最大のときの動作を記述しています。 最後の else以降は、 x が最大でもなく y が最大でもない、 つまり z が最大の場合を記述しています。
この書き方も、やはり変数の数が増えると条件が複雑になる欠点があります。

このプログラム例のように、実際のプログラムでは、

if ( 条件1 )
        文1
else if ( 条件2 )
        文2
……
else if ( 条件k-1 )
        文k-1
else
        文k

という書き方をよく用います。覚えておきましょう。

これは、先頭から条件1、条件2、 …と順に計算していって、最初に真 (true) になった条件i に対応する文iだけ実行するという意味です。 条件k-1まで、すべて偽 (false) であれば、 最後の文kを実行します。

- 変数に途中までの最大値を代入していく方法

[Max3c.java]

class Max3c {
    public static void main(String[] args) {
	int x = 5;
	int y = 2;
	int z = 3;
	int max;

	max = x;
	if (y > max)
	    max = y;
	if (z > max)
	    max = z;

	System.out.println("最大値は " + max + " です");

    }
}

最大値を求めるプログラムとしては、これがお勧めです。 変数 x, y, z を一つずつ max と比較して、 もし大きければ、その値を max に代入していきます。

こうすることによって、その時点までに調べた変数の中での最大値が max に常時格納されていることになります。 この操作を最後の変数までくり返せば、全体の最大値が得られます。

このプログラムの書き方であれば、 変数の個数が少しくらい増えても見通しの良いプログラムになります。