[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

情報処理技法(Javaプログラミング)I 第4回

目次
索引

条件文(1)

if文

今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。

プログラムの流れ
プログラムの流れ

プログラムでは、条件付きで何かを実行することもできます。 これは、「もし何々が成り立つならば何々する」という考え方をします。 条件文 conditional statement )というものを使えば、そのようなプログラムが書けます。

次のプログラムは、入力が負の数ならば「それは負の数です。」と出力するものです。 9行目の x < 0 の部分が、「負の数ならば」という条件を表しています。

NegativeNumber.java
import java.util.Scanner;

class NegativeNumber { // 負の数
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        int x;
        System.out.print("整数を入力してください: ");
        x = stdIn.nextInt();
        if (x < 0) { // もし負の数ならば
            System.out.println("それは負の数です。");
        }
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'NegativeNumber'
整数を入力してください: 100
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'NegativeNumber'
整数を入力してください: -30
それは負の数です。
PS ...\Desktop\java1>

「もし何々が成り立つならば何々する」という条件文は、 if文 if statement )を使うと書けます。 if文は次のような形をとります。 「 条件 」が成り立つならば、「 文1 」、「 文2 」、「 文3 」、...を実行します。

if (条件) {
    文1;
    文2;
    文3; ...
}
if文の流れ
if文の流れ(true=成り立つ、false=成り立たない)

注意: if文の括弧 ( ... ) は省略できませんが、ブレース { ... } は文が1つなら省略できます。

if文の中に、さらにif文を書くこともできます。

次のプログラムは、入力が3桁の数ならば「それは3桁の数です。」と出力するものです。 9行目で「 x は100以上」という条件が課され、10行目で「 x は999以下」という条件が課されるので、11行目は、 x が100以上999以下の場合、すなわち3桁の数の時に実行されます。 記号 >= , <= はそれぞれ≧, ≦に対応します。

ThreeFigures.java
import java.util.Scanner;

class ThreeFigures { // 3桁の数
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        int x;
        System.out.print("整数を入力してください: ");
        x = stdIn.nextInt();
        if (x >= 100) { // xが100以上ならば
            if (x <= 999) { // xが999以下ならば
                System.out.println("それは3桁の数です。");
            }
        }
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'ThreeFigures'
整数を入力してください: 55
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'ThreeFigures'
整数を入力してください: 555
それは3桁の数です。
PS ...\Desktop\java1>

式と演算子(3)

関係演算子

上記の例では、条件として x < 0 x >= 100 を書きました。 条件は、関係演算子や論理演算子を用いて構成されます。 関係演算子 relational operator )は次の通りです。

関係演算子(true=成り立つ、false=成り立たない)
記号 関係
> 大きい 19 > 3 ⇒ true
< 小さい 19 < 3 ⇒ false
>= 以上 19 >= 3 ⇒ true
<= 以下 19 <= 3 ⇒ false
== 等しい 19 == 3 ⇒ false
!= 等しくない 19 != 3 ⇒ true

等しい関係は記号 == で表すことに注意してください。 記号 = では代入文になります。

実は、条件は式の一種です。 式の値が true になることが、条件が成り立つことを意味します。 式の値が false になることが、条件が成り立たないことを意味します。

注意: 「実数 > 整数」の場合は、整数を実数に変換してから比較します。 他の比較についても同様です。

Javaの実数には誤差が含まれていますので、実数 d e d == e と比較すると不正確になります。 「等しい」の代わりに「差が非常に小さい(例えば0.0000000001)」と考えて、 Math.abs( d - e ) < 1.0E-10 などとしてください。

EqualityTest.java
class EqualityTest { // 等しさのテスト
    public static void main (String[] args) {
        double d;
        d = 1.0 / 49.0 * 49.0;
        System.out.println(d);
        if (d == 1.0) {
            System.out.println("1.0と等しいです。");
        }
        if (Math.abs(d - 1.0) < 1.0E-10) {
            System.out.println("1.0とほとんど等しいです。");
        }
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'EqualityTest'
0.9999999999999999
1.0とほとんど等しいです。
PS ...\Desktop\java1>

論理演算子

論理演算子 logical operator )を使うと、より複雑な条件が書けます。

論理演算子(true=成り立つ、false=成り立たない)
記号 論理演算
&& かつ 16 > 5 && 4 == 7 ⇒ false
|| または 16 > 5 || 4 == 7 ⇒ true
! 〜でない !(4 == 7) ⇒ true

記号 && は、2つの条件を結んで新しく条件を作ります。 これは、両方の条件が成り立つという条件です。 つまり、両方の値がtrueならばtrueという値になり、そうでないならばfalseという値になります。

記号 || も、2つの条件を結びます。 これは、一方(両方でもよい)の条件が成り立つという条件です。 つまり、一方(両方でもよい)の値がtrueならばtrueという値になり、そうでないならばfalseという値になります。

記号 ! は、1つの条件から新しく条件を作ります。 これは、条件が成り立たないという条件です。 つまり、trueならばfalseに、falseならばtrueになります。

これまでに説明した演算子の 優先順位 は次のようになります。 分からなくなりそうなら、括弧を使って計算順序を明示するのがよいでしょう。

演算子の優先順位(上のほうがより強く結合する)
1   !  単項の -  
2   *   /   %  
3   +   -  
4   >   <   >=   <=  
5   ==   !=  
6   &&  
7   ||  

ここで、 単項の− とは、「 x の絶対値は、 x が0以上なら x 、0未満なら - x である」の中の「−」のことです。

次のプログラムでは、100以上かつ999以下という1つの条件で、3桁の数を判定します。

ThreeFigures2.java
import java.util.Scanner;

class ThreeFigures2 { // 3桁の数2
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        int x;
        System.out.print("整数を入力してください: ");
        x = stdIn.nextInt();
        if (100 <= x && x <= 999) { // 100以上かつ999以下ならば
            System.out.println("それは3桁の数です。");
        }
    }
}

注意: 9行目の条件を 100 <= x <= 999 とまとめることはできません。


条件文(2)

if-else文(1)

条件文の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。 この条件文には、 if-else文 if-else statement )を使います。

次のプログラムは、入力が偶数ならば「それは偶数です。」と出力し、そうでないならば「それは奇数です。」と出力するものです。 条件 x % 2 == 0 は、 x を2で割った余りが0なので、 x が2で割り切れることを意味し、偶数の条件になります。

EvenOdd.java
import java.util.Scanner;

class EvenOdd { // 偶数・奇数
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        int x;
        System.out.print("整数を入力してください: ");
        x = stdIn.nextInt();
        if (x % 2 == 0) { // xが2で割り切れるならば
            System.out.println("それは偶数です。");
        } else { // そうでないならば
            System.out.println("それは奇数です。");
        }
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'EvenOdd'
整数を入力してください: 12
それは偶数です。
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'EvenOdd'
整数を入力してください: 15
それは奇数です。
PS ...\Desktop\java1>

if-else文は次のような形をとります。 「 条件 」が成り立つならば、「 文1 」、...を実行します。 成り立たないならば、「 文2 」、...を実行します。

if (条件) {
    文1; ...
} else {
    文2; ...
}
if-else文の流れ
if-else文の流れ(true=成り立つ、false=成り立たない)

注意: if-else文の else の直後のブレース { ... } は、文が1つなら省略できます。

注意: if文と似たものに、 条件演算子 conditional operator )があります。 これは、

条件 ? 式1 : 式2

という形式で、条件が成り立つときに「 式1 」、成り立たないときに「 式2 」の値を持ちます。 例えば、 x の絶対値を y に代入する場合は、

y = (x >= 0) ? x : -x;

となります。

条件文の使用例(1)

条件文の使用例として、次の問題を考えます。

BMIとは、Body Mass Indexの略で、肥満を判定する基準の一つです。 BMIは、体重[kg]÷身長[m]÷身長[m]で計算され、これが25以上なら肥満と判定されます。 入力された身長と体重から、肥満かどうかを判定してください。

この問題を解決するには、最初に、身長と体重を入力してもらいます。 次に、計算式に基づいてBMIを計算します。 最後に、BMIが25以上なら「肥満です。」と出力します。

BodyMassIndex.java
import java.util.Scanner;

class BodyMassIndex { // BMIの計算
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        double height, weight, bmi;
        System.out.print("身長[m]を入力してください: ");
        height = stdIn.nextDouble();
        System.out.print("体重[kg]を入力してください: ");
        weight = stdIn.nextDouble();
        bmi = weight / height / height;
        if (bmi >= 25.0) {
            System.out.println("肥満です。");
        }
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'BodyMassIndex'
身長[m]を入力してください: 1.6
体重[kg]を入力してください: 65.0
肥満です。
PS ...\Desktop\java1>

肥満でない場合も、何か出力したほうがよいでしょう。 BMIが25未満なら「肥満ではありません。」と出力します。

BodyMassIndex2.java
import java.util.Scanner;

class BodyMassIndex2 { // BMIの計算2
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        double height, weight, bmi;
        System.out.print("身長[m]を入力してください: ");
        height = stdIn.nextDouble();
        System.out.print("体重[kg]を入力してください: ");
        weight = stdIn.nextDouble();
        bmi = weight / height / height;
        if (bmi >= 25.0) {
            System.out.println("肥満です。");
        }
        if (bmi < 25.0) {
            System.out.println("肥満ではありません。");
        }
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'BodyMassIndex2'
身長[m]を入力してください: 1.6
体重[kg]を入力してください: 60.0
肥満ではありません。
PS ...\Desktop\java1>

if-else文を使えば、BMIが25未満かどうか判断しなくてよくなります。

BodyMassIndex3.java
import java.util.Scanner;

class BodyMassIndex3 { // BMIの計算3
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        double height, weight, bmi;
        System.out.print("身長[m]を入力してください: ");
        height = stdIn.nextDouble();
        System.out.print("体重[kg]を入力してください: ");
        weight = stdIn.nextDouble();
        bmi = weight / height / height;
        if (bmi >= 25.0) {
            System.out.println("肥満です。");
        } else {
            System.out.println("肥満ではありません。");
        }
    }
}

次の例は、入力された西暦が、うるう年かどうかを判定する問題です。 ここで、うるう年は次のように決められます。

  1. 西暦が4で割り切れるならば、うるう年である。
  2. 例外として、100で割り切れるならば、うるう年でない。
  3. 例外の例外として、400で割り切れるならば、うるう年である。

この条件をそのままプログラムにすると、次のようになります。

LeapYear.java
import java.util.Scanner;

class LeapYear { // うるう年
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        int year;
        System.out.print("西暦を入力してください: ");
        year = stdIn.nextInt();
        if (year % 4 == 0) {
            if (year % 100 == 0) {
                if (year % 400 == 0) {
                    System.out.println("うるう年です。");
                } else { // 4と100で割り切れて400で割り切れない
                    System.out.println("うるう年ではありません。");
                }
            } else { // 4で割り切れて100で割り切れない
                System.out.println("うるう年です。");
            }
        } else { // 4で割り切れない
            System.out.println("うるう年ではありません。");
        }
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'LeapYear'
西暦を入力してください: 2000
うるう年です。
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'LeapYear'
西暦を入力してください: 2010
うるう年ではありません。
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'LeapYear'
西暦を入力してください: 2020
うるう年です。
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'LeapYear'
西暦を入力してください: 2100
うるう年ではありません。
PS ...\Desktop\java1>

実は、プログラムをもっと簡単にできます。 うるう年になるパターンは

のどちらかです。

うるう年の集合
うるう年の集合(灰色がうるう年)

この条件の通りにプログラムを作ります。

LeapYear2.java
import java.util.Scanner;

class LeapYear2 { // うるう年2
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        int year;
        System.out.print("西暦を入力してください: ");
        year = stdIn.nextInt();
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            System.out.println("うるう年です。");
        } else {
            System.out.println("うるう年ではありません。");
        }
    }
}

演習4

次の歴史クイズを考えます。

大阪万博が開催された年は?

このクイズを出力し、整数を入力してもらい、その値が正しいかどうか出力するプログラムを作成してください。

HistoryQuiz.java
import java.util.Scanner;

class HistoryQuiz {
    public static void main (String[] args) {
        Scanner stdIn = new Scanner(System.in);
        
        
        
    }
}
ターミナル
PS ...\Desktop\java1>  & ... 'HistoryQuiz'
大阪万博が開催された年は? 1964
残念!
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'HistoryQuiz'
大阪万博が開催された年は? 1970
正解!
PS ...\Desktop\java1>
ターミナル
PS ...\Desktop\java1>  & ... 'HistoryQuiz'
大阪万博が開催された年は? 2025
正解!
PS ...\Desktop\java1>

余力のある人は、答えが整数になるクイズ(歴史に限りません)を自分で考え、入力された値が正しいかどうか出力するプログラムを作成してください。


レポート課題

今日の演習4の答案(Javaプログラム)をメールで提出してください。 差出人は大学発行のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(5月2日)を明記してください。


参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2025年4月25日更新
小西 善二郎 <konishi@cis.twcu.ac.jp>
Copyright (C) 2025 Zenjiro Konishi. All rights reserved.