【連載10】if文を使った複雑な条件分岐

前回の記事でif文について基本的な使い方について見てきましたが、論理演算子を使うことで複雑な条件式を作ることが可能です。

今回の記事では、比較演算子、論理演算子を組み合わせたif文の使い方について見ていきます。

比較演算子を使った条件式

少しだけ前回の記事を復習します。

複数の分岐を作りたい場合は、if-else if-else文を使用するということでした。

if ( 条件式1 ) {
条件1に一致したときに実行する処理
} else if( 条件式2 ) {
条件2に一致したときに実行する処理
} else {
すべての条件に一致しないときに実行する処理
}

条件式では比較演算子を使って、true、falseを判定します。(比較演算子は演算子をはさんで左の値と右の値を比較し、その結果をtrueかfalseで返します。)

public class Sample10_01{
    public static void main(String[] args){
        int a;
        a = 31;
        if( a < 10 ){
            System.out.println("aは10より小さい");
        }else if( a < 20 ){
            System.out.println("aは20より小さい");
        }else if( a < 30 ){
            System.out.println("aは30より小さい");
        }else{
            System.out.println("aは30以上");
        }
    }
}
aは30以上

変数aの値は31なので、ifブロック、else ifブロックの条件には一致せず、すべての条件に一致しないときに実行されるelseブロック内の処理が実行されています。

このように比較演算子を用いて条件式を作成します。

ただ、比較演算子だけではひとつの条件式の中で複数の条件を組み合わせることができません。

論理演算子を使って複数の条件を組み合わせる

例えば、「10以上20未満」といったような条件を式を作りたいとします。

しかし比較演算子だけではそのような条件式を作ることはできません。

ここで用いるのが論理演算子です。

論理演算子とは、文字通り論理を評価するための演算子のことです。

比較演算子だけでは複数の条件を組み合わせることはできません。論理演算子を使うことで、複数の条件を組み合わせて分岐処理を記述できるなど、複雑な条件を作ることができます。

論理演算子には下表のような種類があります。

演算子意味記入例
&&かつ(And)(x == y) && (a == b);
||または(Or)(x == y) || (a == b);
!でない(Not)!(x == y);

では、サンプルコードを見てみましょう。

public class Sample10_02{
    public static void main(String[] args) {
        int x = 3;
        int y = 3;
        int a = 9;
        int b = 9;

        if((x == y) && (a == b)){
            System.out.println("xとy かつ aとbは値が一致します。");
        }else{
            System.out.println("値は一致しません。");
        }
    }
}
xとy かつ aとbは値が一致します。

ポイントは以下のステートメントです。

if((x == y) && (a == b)){
    System.out.println("xとy かつ aとbは値が一致します。");
}else{
    System.out.println("値は一致しません。");
}

if文の条件式で&&演算子を使っているので、「x == y」と「a == b」の両方が成立したら、trueが返され、ifブロック内の処理が実行されます。

このように比較演算子と論理演算子を用いることで多様な条件式を作ることができるというわけです。

if文を用いた実用サンプル

ここまでif文の使い方について見てきましたが、これまで示したサンプルでは、固定の値を使っての分岐となっており、if文を使う意義が見えてこなかったと思います。

まったくもってその通りであり、これまでのサンプルで示したif文の使い方は実用性がありません。

本来、キーボードやファイルなど、何らかの入力によって取得した値を用いて比較することで、意義のある条件分岐を実現できます。

そこで、if文を用いた実用サンプルを記します。このサンプルコードではキーボードからの入力により得られた値によって処理を分岐させています。

import java.io.*;

public class Sample10_03{
    public static void main(String[] args){
        int o;
        byte r[] = new byte[100];

        //文字列を出力
        System.out.println("あなたのテトリス最高得点は?");

        try{
            //キーボードから文字列を入力
            System.in.read(r);
            o = Integer.parseInt((new String(r)).trim());
        }catch(IOException e){
            o = 0;
        }

        if(o >= 10000){
            System.out.println("プロ級の実力者です!");
        }else if(5000 <= o && o < 10000){
            System.out.println("なかなかの実力者です!");
        }else{
            System.out.println("ノーコメント!");
        }
    }
}
あなたのテトリス最高得点は?
7000
なかなかの実力者です!

上記サンプルでは配列やtry-catch文などまだ解説前の内容も含んでいます。

順を追って解説していくのが良いのと考えるので、今回はそのあたりについては触れません。プログラミングの学習を進めていく上で、はじめてみるような構文などが次々と出てきて困惑することも多いはずです。そうしたときは深みにハマり過ぎずに、わかるところだけ理解して、後は飛ばして先を進めるという考え方も大事です。

今回のサンプルで重要なのは、キーボードからの入力をプログラムの中で取得し、その取得した値を用いてif文で処理を分岐させている点です。

キーボードからの入力を受け付け、入力された内容を取得しているのが以下のステートメントになります。

System.in.read(r);

上記のメソッドを呼び出すことで、キーボードから入力された内容が変数rに格納されます。

キーボードからの入力は文字列(文字型の配列)となるため、以下のステートメントで入力された文字列を数値に変換し、変換した値を変数oに格納しています。

o = Integer.parseInt((new String(r)).trim());

あとは以下の条件分岐を行っています。

・もし変数oが「10000以上」なら、”プロ級の実力者です!”文字列を出力

・もし変数oが「5000以上10000未満」なら、”なかなかの実力者です!”文字列を出力

・それら以外なら”ノーコメント!”文字列を出力

「5000以上10000未満」という条件を作るには「5000以上」という条件と「10000未満」という条件を「&&」で区切ることで実現できます。

まとめ

前回の記事からif文について見てきました。if文によって処理を分岐させる構造はプログラミングをしていく上で本当によく使うことになります。

プログラミングの基礎の基礎と言えるようなものですので、しっかり押さえておきましょう。

さて、処理の分岐を実現するのはif文だけではありません。

Javaではもうひとつswitch文を使った分岐も可能です。

switch文はどのようなもので、if文とは何が違うのかについて次回の記事で解説していきます。