カテゴリー
Java

Java(Step3-1-2)

プログラムの流れと分岐

if文

論理積演算子と論理和演算子

整数値を読み込んで、それが0なのか、1桁かそれ以上かを判断して表示するプログラムを作りましょう。

//DigitsNo1.java
//読み込んだ整数値の桁数判別(0、一桁、二桁以上)
import java.util.Scanner;

public class DigitsNo1 {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数値:");
        int n = stdIn.nextInt();
        if(n == 0)
            System.out.println("その値は0です。");
        else if(n >= -9 && n <= 9)
            System.out.println("一桁です。");
        else
            System.out.println("二桁以上です。");
        stdIn.close();
    }
}
DigitsNo1.java実行結果
論理積演算子 &&

このプログラムで利用している && 演算子は、論理積の演算を行う論理積演算子(logical and operator)です。日本語でいえば、「AかつB」だと考えれば分かりやすいです。

論理和演算子Ⅱ

もう1つの論理和を求めるのが論理和演算子(logical or operator)と呼ばれる || 演算子になります。これは、日本語でいう「AまたはB」に近い形です。この演算子を利用したプログラム以下になります。

//DigitsNo2.java
//読み込んだ整数値の桁数判別(2桁以上かどうか)
import java.util.Scanner;

public class DigitsNo2 {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数値:");
        int n = stdIn.nextInt();
        if(n <= -10 || n >= 10)
            System.out.println("2桁以上です。");
        else if(n >= -9 && n <= 9)
            System.out.println("2桁未満です。");
        stdIn.close();
    }
}
DigitsNo2.java実行結果
x && yxとyの両方ともtrueであればtrueを、そうでなければ、falseを生成します。
x || yxとyの一方でもtrueであればtrueを、そうでなければ、falseを生成します。
論理積演算子と論理和演算子

季節の判定

上の演算子2つを利用して季節(月)を判定するプログラムを作りましょう。

//Season.java
//読み込んだ月の季節を表示
import java.util.Scanner;

public class Season {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("季節を求めます。\n何月ですか:");
        int month = stdIn.nextInt();
        if(month >= 3 && month <= 5)
            System.out.println("その季節は春です。");
        else if(month >= 6 && month <= 8) 
            System.out.println("その季節は夏です。");
        else if(month >= 9 && month <= 11) 
            System.out.println("その季節は秋です。");
        else if(month >= 12 || month == 1 || month == 2 ) 
            System.out.println("その季節は冬です。");
        stdIn.close();
    }
Season.java実行結果
春・夏・秋の判定

&&を用いて、以下の要領で判定します。

  • monthが3以上かつmonthが5以下…春
  • monthが6以上かつmonthが8以下…夏
  • monthが9以上かつmonthが11以下…秋
冬の判定

冬の判定を用いるには、||を利用する必要があります。以下の要領で判定しています。

  • monthが12か1か2…冬
短絡評価

季節が春の際には以下のように記述しました。

month >= 3 && month <= 5

この判定の際に左オペランドのmonth >= 3がfalseとなった場合、右のオペランドは実行しなくてもfalseとなることが分かります。このように論理演算の式全体の評価結果が、左オペランドの評価結果のみで明確になる場合に、右オペランドが評価されないことを、短絡評価(short circuit evaluation)と呼びます。

条件演算子

2つの値を読み込んで小さい方の値を表示するプログラムを以下に示します。

//Min2.java
//読み込んだ2つの整数値の小さい方の値を表示(if文)
import java.util.Scanner;

public class Min2 {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数a:");
        int a = stdIn.nextInt();
        System.out.print("整数b:");
        int b = stdIn.nextInt();

        int min; //小さい方の値
        if(a < b)
            min = a;
        else  
            min = b;
        System.out.println("小さい値は" + min + "です。");
        stdIn.close();
    }    
}
Min2.java実行結果

変数a、bに読み込んだ値を比較して、aの方がbより小さければ変数minにaを代入し、そうでなければ変数minにbを代入します。その結果、if文の終了時に変数minには小さい値が入ることになります。

条件演算子

上のプログラムは、if文を用いずに条件演算子(conditional operator)で実現できます。

//Min2Cond.java
//読み込んだ2つの整数値の小さい方の値を表示(条件演算子)
import java.util.Scanner;

public class Min2Cond {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数a:");
        int a = stdIn.nextInt();
        System.out.print("整数b:");
        int b = stdIn.nextInt();

        int min = a < b ? a : b; //小さい方の値 
        System.out.println("小さい値は" + min + "です。");
        stdIn.close();
    }    
}
Min2Cond.java実行結果

条件式は、if文を凝縮したようなもので、Javaのプログラミングで好んで使われます。

x ? y : zxがtrueであればyを評価した値を、そうでなければzを評価した値を生成します。
条件演算子

三値の最大値

以下に示すのは、3つの変数a,b,cに整数値を読み込んで、その最大値を求めて表示するプログラムになります。

//Max3.java
//3つの整数値の最大値を求める
import java.util.Scanner;

public class Max3 {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数a:");
        int a = stdIn.nextInt();
        System.out.print("整数b:");
        int b = stdIn.nextInt();
        System.out.print("整数c:");
        int c = stdIn.nextInt();

        int max = a; //小さい方の値
        if(b > max)max = b;
        if(c > max)max = c; 
        System.out.println("最大値は" + max + "です。");
        stdIn.close();
    }   
}
Max3.java実行結果

三値の最大値を求める手段は、以下のようになっています。

  1. maxをaの値で初期化する
  2. bの値がmaxよりも大きければ、maxにbの値を代入する。
  3. cの値がmaxよりも大きければ、maxにcの値を代入する。

このように処理の流れを定義した規則をアルゴリズム(algorithm)と呼びます。

ブロック

以下に2つの整数値を読み込んで、小さい方の値と大きい方の値の両方を求めることにしたプログラムを示します。

//MinMax.java
//2つの整数値の大小比較表示
import java.util.Scanner;

public class MinMax {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数a:");
        int a = stdIn.nextInt();
        System.out.print("整数b:");
        int b = stdIn.nextInt();

        int min, max; 
        if(a < b){
            min = a;
            max = b;
        }else{
            min = b;
            max = a;
        }
        
        System.out.println("小さい値は" + min + "です。");
        System.out.println("大きい値は" + max + "です。");
        stdIn.close();
    }   
}
MinMax.java実行結果

このプログラムのif文は、aがbより小さければ、

{
min = a; max = b;
}

を実行し、そうでなければ次を実行します。

{
min = b; max = a;
}

いずれも、{ }で囲まれたており、このように囲んだものをブロック(block)と呼びます。

二値のソート

以下に示すのは、2つの変数a,bに整数値を読み込んで、昇順(小さい順)にソートする(sort:並べ替える)プログラムです。

//Sort2.java
//2つの変数を昇順にソート
import java.util.Scanner;

public class Sort2 {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);

        System.out.print("整数a:");
        int a = stdIn.nextInt();
        System.out.print("整数b:");
        int b = stdIn.nextInt();

        if(a > b){
            int t = a;
            a = b;
            b = t;
        }
        System.out.println("小さい値から順に" + a + "、" + b + "です。");
        stdIn.close();
    }   
}
Sort2.java実行結果

ソートの手順は以下のようになっています。

  • aの値がbより大きい時…aとbの値を交換する
  • そうでないとき…何もしない(そのまま)
二値の交換

ブロック内で行っている手順は以下のようになります。

  1. aの値をtに保存しておく。
  2. bの値をaに代入する。
  3. tに保存しておいた最初のaの値をbに代入する。

この3つのステップで交換が完了します。