第3日目:条件分岐

Javaでのifとswitchによる条件分岐を学びます。条件式、比較演算子、論理演算子、switch文を確認します。

日付 0 1 2 3 4 5 6 7

第3日目:条件分岐

分岐処理の基礎

順次処理と分岐処理

これまで学習してきたプログラムは、記述した順番通りに処理を実行するものでした。このような処理のことを、順次処理といいます。(図3-1)

順次処理のフローチャート

図3-1:順次処理

しかし実際のプログラムでは、例えばゲームで「敵に当たったらゲームオーバー」というように、様々な状況に応じて異なった処理を行いたい場合があります。このように、条件に応じて処理の流れが変わることを分岐処理といいます。(図3-2)

分岐処理のフローチャート

図3-2:分岐処理

Javaで分岐処理を実現するための命令として、ifswitchの2つが用意されています。

if文

サンプルプログラム

まずは、以下のサンプルを実行してみてください。

Sample301.java
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=10
aは正の数です。

このプログラムは、変数aの値が正の数かどうかを判定しています。aが10のとき、「aは正の数です。」が表示されます。では、aの値を-5に変えてみましょう。

a=-5

aが-5のときは、「aは正の数です。」という文字は表示されませんでした。このように、条件に応じて処理の流れが変わっていることがわかります。(図3-3)

Sample301のフローチャート

図3-3:Sample301のフローチャート

if文の書式

if文の書式
if(条件式){
  処理
}

()の中の条件式を評価し、その結果がtrue(真)の場合に{ }内の処理を実行します。条件式の結果がfalse(偽)の場合は、{ }内の処理は実行されません。

比較演算子

条件式では、値を比較するための比較演算子を用います。Javaで使用できる主な比較演算子は以下の表3-1のとおりです。

表3-1:Javaの主な比較演算子
演算子意味使用例
>より大きいa > 0
>=以上a >= 0
<より小さいa < 0
<=以下a <= 0
==等しいa == 0
!=等しくないa != 0

if~else文

サンプルプログラム

先ほどのif文では、条件が成立しなかった場合の処理は記述していませんでした。条件が成立しなかった場合の処理も記述したい場合には、elseを使います。以下のサンプルを実行してみましょう。

Sample302.java
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=-5
aは正の数ではありません。

aが-5の場合、条件式「a > 0」はfalseとなるため、else側の「aは正の数ではありません。」が表示されます。(図3-4)

Sample302のフローチャート

図3-4:Sample302のフローチャート

if~else文の書式
if(条件式){
  処理①
}else{
  処理②
}

条件式がtrueの場合は処理①が、falseの場合は処理②が実行されます。

else if

サンプルプログラム

条件を3つ以上に分岐させたい場合には、else ifを使います。以下のサンプルを実行してみましょう。

Sample303.java
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("不適切な値です。");
        }
    }
}
one

numが1のため「one」が表示されます。numを1〜3以外の値に変えると、以下のように表示されます。

不適切な値です。

このように、条件に応じて処理の流れが変わっていることがわかります。(図3-5)

Sample303のフローチャート

図3-5:Sample303のフローチャート

if~else if~else文の書式
if(条件式①){
  処理①
}else if(条件式②){
  処理②
}else{
  処理③
}

条件式は上から順番に評価され、最初にtrueになった条件の処理だけが実行されます。else ifは何個でも追加することが可能です。

複雑なif文

サンプルプログラム

次に、少し複雑なif文のサンプルを見てみましょう。以下のプログラムは、さいころの目を乱数で生成して、偶数(丁)か奇数(半)かを判定するものです。

Sample304.java
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("範囲外の数値です。");
        }
    }
}
さいころの目:2
丁(チョウ)です。

奇数(1, 3, 5)の場合は以下のように表示されます。

さいころの目:5
半(ハン)です。

なお、このプログラムではMath.random()*7を使っているため、まれに7が生成されます。その場合は以下のように表示されます。

さいころの目:7
範囲外の数値です。

乱数によってさいころの目が変わるため、実行結果は毎回異なります。(図3-6)

Sample304のフローチャート(ネストと論理演算子)

図3-6:Sample304のフローチャート

乱数

このプログラムでは、Math.random()を使って乱数(ランダムな数)を生成しています。Math.random()は0.0以上1.0未満のdouble型の値を返します。これを利用すると、以下のように任意の範囲の乱数を生成することができます。

0からn-1までの乱数
(int)(Math.random()*n);
1からnまでの乱数
(int)(Math.random()*n)+1;

ネスト

Sample304では、if文の中にさらにif文が入っています。このように、if文の中にif文が含まれることをネスト(入れ子)といいます。ネストは何段階でも重ねることができますが、深くなるほどプログラムが複雑になるため、注意が必要です。

論理演算子

Sample304の7行目では、「&&」(AND)という記号が使われています。このように、複数の条件を組み合わせるための演算子を論理演算子といいます。Javaで使用できる主な論理演算子は以下の表3-2のとおりです。

表3-2:Javaの主な論理演算子
演算子名称意味使用例備考
&論理積ANDa == 0 & b == 0
&&論理積ANDa == 0 && b == 0ショートカット
|論理和ORa == 0 | a == 1
||論理和ORa == 0 || a == 1ショートカット
!否定NOT!(a == 0)

AND(&, &&)は、複数の条件がすべて成立する(true)場合にtrueになります。OR(|, ||)は、複数の条件のうちいずれかが成立する(true)場合にtrueになります。

ANDとORの動作は、以下の真理値表のとおりです。

表3-3:AND演算の真理値表
No左辺右辺結果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse
表3-4:OR演算の真理値表
No左辺右辺結果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

ショートカット評価

&&||はショートカット評価(短絡評価)を行います。&&の場合、左辺がfalseであれば右辺を評価せずにfalseを返します。||の場合、左辺がtrueであれば右辺を評価せずにtrueを返します。これにより処理速度が向上しますが、左辺の評価結果によって右辺の評価が変わる場合には注意が必要です。

switch文

サンプルプログラム

if文と同様に、条件分岐を実現するもう一つの方法としてswitch文があります。switch文は、ある変数の値によって処理を分岐させる場合に適しています。以下のサンプルを実行してみましょう。

Sample305.java
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("不適切な値です。");
        }
    }
}
one

switch文の書式

switch文の書式
switch(値){
  case 値①:
    処理①
    break;
  case 値②:
    処理②
    break;
  ・・・
  default:
    処理③
    break;
}

switch文の各要素は以下のとおりです。

  • case:比較する値を指定します。変数の値が一致した場合に、そのcase以降の処理が実行されます。
  • default:いずれのcaseにも当てはまらない場合に実行される処理です。省略することも可能です。
  • break:switch文から抜け出すための命令です。breakがない場合、次のcaseの処理も続けて実行されてしまうため、注意が必要です。

練習問題 3 へ →