第3日目:条件分岐
分岐処理の基礎
順次処理と分岐処理
これまで学習してきたプログラムは、記述した順番通りに処理を実行するものでした。このような処理のことを、順次処理といいます。(図3-1)
図3-1:順次処理
しかし実際のプログラムでは、例えばゲームで「敵に当たったらゲームオーバー」というように、様々な状況に応じて異なった処理を行いたい場合があります。このように、条件に応じて処理の流れが変わることを分岐処理といいます。(図3-2)
図3-2:分岐処理
Javaで分岐処理を実現するための命令として、ifとswitchの2つが用意されています。
if文
サンプルプログラム
まずは、以下のサンプルを実行してみてください。
package day3;
public class Sample301 {
public static void main(String[] args) {
int a = 10;
System.out.println("a="+a);
if(a > 0){
System.out.println("aは正の数です。");
}
}
}
aは正の数です。
このプログラムは、変数aの値が正の数かどうかを判定しています。aが10のとき、「aは正の数です。」が表示されます。では、aの値を-5に変えてみましょう。
aが-5のときは、「aは正の数です。」という文字は表示されませんでした。このように、条件に応じて処理の流れが変わっていることがわかります。(図3-3)
図3-3:Sample301のフローチャート
if文の書式
処理
}
()の中の条件式を評価し、その結果がtrue(真)の場合に{ }内の処理を実行します。条件式の結果がfalse(偽)の場合は、{ }内の処理は実行されません。
比較演算子
条件式では、値を比較するための比較演算子を用います。Javaで使用できる主な比較演算子は以下の表3-1のとおりです。
| 演算子 | 意味 | 使用例 |
|---|---|---|
| > | より大きい | a > 0 |
| >= | 以上 | a >= 0 |
| < | より小さい | a < 0 |
| <= | 以下 | a <= 0 |
| == | 等しい | a == 0 |
| != | 等しくない | a != 0 |
if~else文
サンプルプログラム
先ほどのif文では、条件が成立しなかった場合の処理は記述していませんでした。条件が成立しなかった場合の処理も記述したい場合には、elseを使います。以下のサンプルを実行してみましょう。
package day3;
public class Sample302 {
public static void main(String[] args) {
int a = -5;
System.out.println("a="+a);
if(a > 0){
System.out.println("aは正の数です。");
}else{
System.out.println("aは正の数ではありません。");
}
}
}
aは正の数ではありません。
aが-5の場合、条件式「a > 0」はfalseとなるため、else側の「aは正の数ではありません。」が表示されます。(図3-4)
図3-4:Sample302のフローチャート
処理①
}else{
処理②
}
条件式がtrueの場合は処理①が、falseの場合は処理②が実行されます。
else if
サンプルプログラム
条件を3つ以上に分岐させたい場合には、else ifを使います。以下のサンプルを実行してみましょう。
package day3;
public class Sample303 {
public static void main(String[] args) {
int num = 1;
if(num == 1){
System.out.println("one");
}else if(num == 2){
System.out.println("two");
}else if(num == 3){
System.out.println("three");
}else{
System.out.println("不適切な値です。");
}
}
}
numが1のため「one」が表示されます。numを1〜3以外の値に変えると、以下のように表示されます。
このように、条件に応じて処理の流れが変わっていることがわかります。(図3-5)
図3-5:Sample303のフローチャート
処理①
}else if(条件式②){
処理②
}else{
処理③
}
条件式は上から順番に評価され、最初にtrueになった条件の処理だけが実行されます。else ifは何個でも追加することが可能です。
複雑なif文
サンプルプログラム
次に、少し複雑なif文のサンプルを見てみましょう。以下のプログラムは、さいころの目を乱数で生成して、偶数(丁)か奇数(半)かを判定するものです。
package day3;
public class Sample304 {
public static void main(String[] args) {
int dice = (int)(Math.random()*7)+1;
System.out.println("さいころの目:"+dice);
if(1 <= dice && dice <= 6){
if(dice == 2 || dice == 4 || dice == 6){
System.out.println("丁(チョウ)です。");
}else{
System.out.println("半(ハン)です。");
}
}else{
System.out.println("範囲外の数値です。");
}
}
}
丁(チョウ)です。
奇数(1, 3, 5)の場合は以下のように表示されます。
半(ハン)です。
なお、このプログラムではMath.random()*7を使っているため、まれに7が生成されます。その場合は以下のように表示されます。
範囲外の数値です。
乱数によってさいころの目が変わるため、実行結果は毎回異なります。(図3-6)
図3-6:Sample304のフローチャート
乱数
このプログラムでは、Math.random()を使って乱数(ランダムな数)を生成しています。Math.random()は0.0以上1.0未満のdouble型の値を返します。これを利用すると、以下のように任意の範囲の乱数を生成することができます。
ネスト
Sample304では、if文の中にさらにif文が入っています。このように、if文の中にif文が含まれることをネスト(入れ子)といいます。ネストは何段階でも重ねることができますが、深くなるほどプログラムが複雑になるため、注意が必要です。
論理演算子
Sample304の7行目では、「&&」(AND)という記号が使われています。このように、複数の条件を組み合わせるための演算子を論理演算子といいます。Javaで使用できる主な論理演算子は以下の表3-2のとおりです。
| 演算子 | 名称 | 意味 | 使用例 | 備考 |
|---|---|---|---|---|
| & | 論理積 | AND | a == 0 & b == 0 | |
| && | 論理積 | AND | a == 0 && b == 0 | ショートカット |
| | | 論理和 | OR | a == 0 | a == 1 | |
| || | 論理和 | OR | a == 0 || a == 1 | ショートカット |
| ! | 否定 | NOT | !(a == 0) |
AND(&, &&)は、複数の条件がすべて成立する(true)場合にtrueになります。OR(|, ||)は、複数の条件のうちいずれかが成立する(true)場合にtrueになります。
ANDとORの動作は、以下の真理値表のとおりです。
| No | 左辺 | 右辺 | 結果 |
|---|---|---|---|
| ① | true | true | true |
| ② | true | false | false |
| ③ | false | true | false |
| ④ | false | false | false |
| No | 左辺 | 右辺 | 結果 |
|---|---|---|---|
| ① | true | true | true |
| ② | true | false | true |
| ③ | false | true | true |
| ④ | false | false | false |
ショートカット評価
&&と||はショートカット評価(短絡評価)を行います。&&の場合、左辺がfalseであれば右辺を評価せずにfalseを返します。||の場合、左辺がtrueであれば右辺を評価せずにtrueを返します。これにより処理速度が向上しますが、左辺の評価結果によって右辺の評価が変わる場合には注意が必要です。
switch文
サンプルプログラム
if文と同様に、条件分岐を実現するもう一つの方法としてswitch文があります。switch文は、ある変数の値によって処理を分岐させる場合に適しています。以下のサンプルを実行してみましょう。
package day3;
public class Sample305 {
public static void main(String[] args) {
int num = 1;
switch(num){
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
default:
System.out.println("不適切な値です。");
}
}
}
switch文の書式
case 値①:
処理①
break;
case 値②:
処理②
break;
・・・
default:
処理③
break;
}
switch文の各要素は以下のとおりです。
- case:比較する値を指定します。変数の値が一致した場合に、そのcase以降の処理が実行されます。
- default:いずれのcaseにも当てはまらない場合に実行される処理です。省略することも可能です。
- break:switch文から抜け出すための命令です。breakがない場合、次のcaseの処理も続けて実行されてしまうため、注意が必要です。