こんにちは。今回は扱うのはJavaのelse-if文です。(今回の記事ではif文の後の「else if」という命令文のことを指し示します。)
この記事の内容は以下の2つの記事の続きの内容です。
else-if文はif文の後に条件分岐を追加したい場合に使います。if文では「条件Aが成り立つ場合」の処理だけ記述しますが、その後に追加したelse-if文では「(条件Aが成り立たない場合かつ)条件Bが成り立つ場合」の分岐処理を記述します。
今回の記事では、最初にelse-if文の使い方について書きました。次にelse-if文の後にelse文も記述した時の動作について書きました。最後にwhile文の内側で使った例を書きました。
else-if文を使う状況
条件Aが成り立たない場合に条件Bの分岐処理が必要な例として、テストの点数から成績のランクを返却するメソッドを作成することを考えます。状況を簡単にするため、ランクはString型とします。
点数Xに応じて、ランクが以下のように対応するとします。
点数Xの条件 | ランク |
---|---|
Xが80以上 | A |
Xが70以上 | B |
便宜上、点数Xが上記の表の条件を満たさない場合、ランクはnullとします。
上記の表で2段目の条件は1段目の条件を満たさない場合を表すことにします。つまり、2段目の条件はXが70以上かつ80未満です。
点数Xを仮引数に持ち、上記のようにランクの文字を返却するメソッドを作るとします。今回はMyRankクラスを作り、以下のようにメソッドを実装するとします。
メソッド | 説明 |
---|---|
public static String get(int point) | 引数pointに応じて、ランクを返却する。 |
- パラメータ:
point
– 点数- 戻り値:
- ランク
メソッドは呼び出すときの単純化のためにstaticメソッドとしています。
else-if文の記述の仕方
前述のメソッドを以下のように実装することにします。
-
ローカル変数を宣言する。
型 変数名 初期値 String rank null
-
以下の分岐処理をする。
条件 処理内容 分岐(1) point >= 80
rank
←"A"
分岐(2) point >= 70
rank
←"B"
-
rank
を返却する。
条件分岐は最初に分岐(1)の条件を評価します。分岐(1)の条件が成り立たない場合、分岐(2)の条件「点数が70以上」を評価します。
このような分岐処理の場合、以下のようにif文にelse-if文を追加した構文が使えます。
構文
if ([条件1]) {
[処理1]
} else if ([条件2]) {
[処理2]
}
この構文を使って、以下のように処理を記述しました。
ソース
public class MyRank {
/**
* 引数pointに応じて、ランクを返却する。
*
* @param point 点数
* @return ランク
*/
public static String get(int point) {
String rank = null;
if (point >= 80) {
// 分岐(1)
rank = "A";
} else if (point >= 70) {
// 分岐(2)
rank = "B";
}
return rank;
}
}
上記のget()メソッドでは最初にString型変数rankをnullで初期化をしています。
次に、if文の条件式が評価されます。仮引数pointの値が80以上の場合、分岐(1)の処理が実行されます。
仮引数pointの値が80以上ではない場合、else-if文の条件式が評価されます。仮引数pointの値が70以上の場合、分岐(2)の処理が実行されます。
以下は、pointの値の範囲と処理の対応を表した図です。
上記の図で条件式(1)は「point >= 80」です。条件式(2)は「point >= 70」です。(1)がfalseの場合に(2)が評価されるので、条件式(2)がtrueになるpointの値の範囲は70以上80未満です。
上記のメソッドを次のようにテストしました。
ソース
public class MyRankTest {
public static void main(String[] args) {
int point = 80;
System.out.println(point + "..." + MyRank.get(point));
point = 79;
System.out.println(point + "..." + MyRank.get(point));
point = 69;
System.out.println(point + "..." + MyRank.get(point));
}
}
結果
80...A
79...B
69...null
上記結果のように、点数が80と79の場合でメソッドが返却する結果が変わります。
このように、最初の条件がfalseの場合の範囲で条件分岐をしたい場合、else-if文を使うことができます。
なお、else-if文の後にelse-if文を追加することで、条件分岐を増やすことができます。
else文と組み合わせる
else-if文の後にelse文を追加できます。
前述の分岐の内容を次のよう変更したものを考えます。
条件 | 処理内容 | |
---|---|---|
分岐(1) | point >= 80 |
rank ← "A" |
分岐(2) | point >= 70 |
rank ← "B" |
分岐(3) | それ以外の場合 | rank ← "C" |
3段目の「それ以外の場合」という文言は、1段目の条件も2段目の条件もfalseの場合という意味で使っています。
「それ以外の場合」に対応する条件分岐をしたい場合、以下のように最後にelse文を使います。
ソース
if ([条件1]) {
[処理1]
} else if ([条件2]) {
[処理2]
} else {
[処理3]
}
上記の書き方の場合、[条件1]がfalseでさらに[条件2]がfalseならば、[処理3]が実行されます。
以下はフロー図で表した処理の様子です。
else-if文だけだと、[条件2]がfalseの場合だけの処理を記述できませんが、その部分をelse文で記述できます。
上記の表のように分岐処理をするように、以下のようにメソッドを書き換えました。
ソース
public class MyRank2 {
/**
* 引数pointに応じて、ランクを返却する。
*
* @param point 点数
* @return ランク
*/
public static String get(int point) {
String rank = null;
if (point >= 80) {
// 分岐(1)
rank = "A";
} else if (point >= 70) {
// 分岐(2)
rank = "B";
} else {
// 分岐(3)
rank = "C";
}
return rank;
}
}
最初のif文の条件は変数pointの値が80以上の場合です。条件がtrueの場合、分岐(1)に処理が進みます。if文の条件が成り立たない場合、次のelse-if文の条件が評価されます。条件がtrueの場合、分岐(2)に処理が進みます。
数直線上で分岐の様子は以下です。
今回の場合、「それ以外の場合」の範囲は上図(3)のpointが70未満の範囲です。
上記のメソッドを次のようにテストしました。
ソース
public class MyRank2Test {
public static void main(String[] args) {
int point = 80;
System.out.println(point + "..." + MyRank2.get(point));
point = 79;
System.out.println(point + "..." + MyRank2.get(point));
point = 69;
System.out.println(point + "..." + MyRank2.get(point));
point = 1;
System.out.println(point + "..." + MyRank2.get(point));
}
}
結果
80...A
79...B
69...C
1...C
結果を見るとpointの値が69のとき、else文のブロックに処理が進んだことがわかります。
このように、else-if文の後にelse文を追加することで、else-if文の条件がfalseの場合の処理を記述できます。
while文の内側で使った例
最後に紹介するサンプルプログラムは、分岐処理をwhile文の内側で使った例です。分岐処理の練習のための例のため、数を当てる遊びのようなサンプルです。
int型変数numを定義し、0以上10未満のランダムな数を格納するとします。numの値に応じて次の文字列を出力するとします。
numの条件 | 出力する文字列 |
---|---|
5の場合 | num + “・・・当たり” |
5より大きい場合 | num + “:・・・大きい” |
それ以外の場合 | num + “:・・・小さい” |
これをwhile文で繰り返すことを考えます。
繰り返し処理の最初に繰り返し回数を出力するとします。また、「当たり」の場合、文字列を出力して繰り返し処理を終了するとします。
以下のように上記処理を実装しました。
ソース
import java.util.Random;
public class Sample001 {
public static void main(String[] args) {
Random random = new Random();
int num = 0;
int cnt = 0;
String s = null;
while (num != 5) {
// 繰り返し回数
cnt++;
System.out.println("繰り返し回数:" + cnt);
// 10未満の乱数
num = random.nextInt(10);
// 分岐処理で文字列を作る
s = "" + num;
if (num == 5) {
s += "・・・当たり";
} else if (num > 5) {
s += "・・・5より大きい";
} else {
s += "・・・5より小さい";
}
// 出力
System.out.println(s);
}
}
}
以下は実行結果の一例です。
結果(毎回変わる)
繰り返し回数:1
4・・・5より小さい
繰り返し回数:2
0・・・5より小さい
繰り返し回数:3
7・・・5より大きい
繰り返し回数:4
2・・・5より小さい
繰り返し回数:5
7・・・5より大きい
繰り返し回数:6
1・・・5より小さい
繰り返し回数:7
5・・・当たり
上記の実行結果のように、何度か処理が繰り返されます。変数numの値が5になった場合に、繰り返し処理が終了します。
「numの値が5より大きい場合」という条件をelse-if文に記述しています。「それ以外の場合」(numが5でない、かつ、5より大きくない)は、else文が対応しています。
以上のサンプルで紹介したように、else-if文で条件分岐を増やすことができます。また、最後にelse文を追加することで、どの条件も満たさない場合の処理を記述できます。
以上、参考になれば幸いです。