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

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

目次
索引

条件文(1)

if文

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

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

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

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class NegativeNumber { // 負の数
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int x;
/*  8*/         System.out.print("整数を入力してください: ");
/*  9*/         x = Integer.parseInt(br.readLine());
/* 10*/         if (x < 0) { // もし負の数ならば
/* 11*/             System.out.println("それは負の数です。");
/* 12*/         }
/* 13*/     }
/* 14*/ }
24102a1:java1 k12x1001$ java NegativeNumber
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
整数を入力してください: 100
24102a1:java1 k12x1001$ java NegativeNumber
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
整数を入力してください: -30
それは負の数です。
24102a1:java1 k12x1001$

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

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

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

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class ThreeFigures { // 3桁の数
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int x;
/*  8*/         System.out.print("整数を入力してください: ");
/*  9*/         x = Integer.parseInt(br.readLine());
/* 10*/         if (x >= 100) { // xが100以上ならば
/* 11*/             if (x <= 999) { // xが999以下ならば
/* 12*/                 System.out.println("それは3桁の数です。");
/* 13*/             }
/* 14*/         }
/* 15*/     }
/* 16*/ }
24102a1:java1 k12x1001$ java ThreeFigures
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
整数を入力してください: 55
24102a1:java1 k12x1001$ java ThreeFigures
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
整数を入力してください: 555
それは3桁の数です。
24102a1:java1 k12x1001$

式と演算子(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 などとしてください。

/*  1*/ class EqualityTest { // 等しさのテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         double d;
/*  4*/         d = 1.0 / 49.0 * 49.0;
/*  5*/         System.out.println(d);
/*  6*/         if (d == 1.0) {
/*  7*/             System.out.println("1.0と等しいです。");
/*  8*/         }
/*  9*/         if (Math.abs(d - 1.0) < 1.0E-10) {
/* 10*/             System.out.println("1.0とほとんど等しいです。");
/* 11*/         }
/* 12*/     }
/* 13*/ }
24102a1:java1 k12x1001$ java EqualityTest
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
0.9999999999999999
1.0とほとんど等しいです。
24102a1:java1 k12x1001$

論理演算子

論理演算子 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 である」の中の「−」のことです。

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class ThreeFigures2 { // 3桁の数2
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int x;
/*  8*/         System.out.print("整数を入力してください: ");
/*  9*/         x = Integer.parseInt(br.readLine());
/* 10*/         if (100 <= x && x <= 999) { // 100以上かつ999以下ならば
/* 11*/             System.out.println("それは3桁の数です。");
/* 12*/         }
/* 13*/     }
/* 14*/ }

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


条件文(2)

if-else文(1)

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

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class EvenOdd { // 偶数・奇数
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int x;
/*  8*/         System.out.print("整数を入力してください: ");
/*  9*/         x = Integer.parseInt(br.readLine());
/* 10*/         if (x % 2 == 0) { // xが2で割り切れるならば
/* 11*/             System.out.println("それは偶数です。");
/* 12*/         } else { // そうでないならば
/* 13*/             System.out.println("それは奇数です。");
/* 14*/         }
/* 15*/     }
/* 16*/ }
24102a1:java1 k12x1001$ java EvenOdd
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
整数を入力してください: 12
それは偶数です。
24102a1:java1 k12x1001$ java EvenOdd
整数を入力してください: 15
それは奇数です。
24102a1:java1 k12x1001$

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

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

条件文の使用例(1)

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

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

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class BodyMassIndex { // BMIの計算
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         double height, weight, BMI;
/*  8*/         System.out.print("身長[m]を入力してください: ");
/*  9*/         height = Double.parseDouble(br.readLine());
/* 10*/         System.out.print("体重[kg]を入力してください: ");
/* 11*/         weight = Double.parseDouble(br.readLine());
/* 12*/         BMI = weight / height / height;
/* 13*/         if (BMI >= 25.0) {
/* 14*/             System.out.println("肥満です。");
/* 15*/         }
/* 16*/     }
/* 17*/ }
24102a1:java1 k12x1001$ java BodyMassIndex
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
身長[m]を入力してください: 1.6
体重[kg]を入力してください: 65.0
肥満です。
24102a1:java1 k12x1001$

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class BodyMassIndex2 { // BMIの計算2
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         double height, weight, BMI;
/*  8*/         System.out.print("身長[m]を入力してください: ");
/*  9*/         height = Double.parseDouble(br.readLine());
/* 10*/         System.out.print("体重[kg]を入力してください: ");
/* 11*/         weight = Double.parseDouble(br.readLine());
/* 12*/         BMI = weight / height / height;
/* 13*/         if (BMI >= 25.0) {
/* 14*/             System.out.println("肥満です。");
/* 15*/         }
/* 16*/         if (BMI < 25.0) {
/* 17*/             System.out.println("肥満ではありません。");
/* 18*/         }
/* 19*/     }
/* 20*/ }
24102a1:java1 k12x1001$ java BodyMassIndex2
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
身長[m]を入力してください: 1.6
体重[kg]を入力してください: 60.0
肥満ではありません。
24102a1:java1 k12x1001$

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class BodyMassIndex3 { // BMIの計算3
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         double height, weight, BMI;
/*  8*/         System.out.print("身長[m]を入力してください: ");
/*  9*/         height = Double.parseDouble(br.readLine());
/* 10*/         System.out.print("体重[kg]を入力してください: ");
/* 11*/         weight = Double.parseDouble(br.readLine());
/* 12*/         BMI = weight / height / height;
/* 13*/         if (BMI >= 25.0) {
/* 14*/             System.out.println("肥満です。");
/* 15*/         } else {
/* 16*/             System.out.println("肥満ではありません。");
/* 17*/         }
/* 18*/     }
/* 19*/ }

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

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

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

/*  1*/ import java.io.*;
/*  2*/ 
/*  3*/ class LeapYear { // うるう年
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int year;
/*  8*/         System.out.print("西暦を入力してください: ");
/*  9*/         year = Integer.parseInt(br.readLine());
/* 10*/         if (year % 4 == 0) {
/* 11*/             if (year % 100 == 0) {
/* 12*/                 if (year % 400 == 0) {
/* 13*/                     System.out.println("うるう年です。");
/* 14*/                 } else { // 4と100で割り切れて400で割り切れない
/* 15*/                     System.out.println("うるう年ではありません。");
/* 16*/                 }
/* 17*/             } else { // 4で割り切れて100で割り切れない
/* 18*/                 System.out.println("うるう年です。");
/* 19*/             }
/* 20*/         } else { // 4で割り切れない
/* 21*/             System.out.println("うるう年ではありません。");
/* 22*/         }
/* 23*/     }
/* 24*/ }
24102a1:java1 k12x1001$ java LeapYear
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
西暦を入力してください: 2000
うるう年です。
24102a1:java1 k12x1001$ java LeapYear
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
西暦を入力してください: 2010
うるう年ではありません。
24102a1:java1 k12x1001$ java LeapYear
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
西暦を入力してください: 2020
うるう年です。
24102a1:java1 k12x1001$ java LeapYear
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
西暦を入力してください: 2100
うるう年ではありません。
24102a1:java1 k12x1001$

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

のどちらかです。

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

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class LeapYear2 { // うるう年2
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int year;
/*  8*/         System.out.print("西暦を入力してください: ");
/*  9*/         year = Integer.parseInt(br.readLine());
/* 10*/         if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
/* 11*/             System.out.println("うるう年です。");
/* 12*/         } else {
/* 13*/             System.out.println("うるう年ではありません。");
/* 14*/         }
/* 15*/     }
/* 16*/ }

演習5

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

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

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

24102a1:java1 k12x1001$ java HistoryQuiz
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
大阪万博が開催された年は? 1964
残念!
24102a1:java1 k12x1001$ java HistoryQuiz
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
大阪万博が開催された年は? 1970
正解!
24102a1:java1 k12x1001$

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


レポート課題

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


参考文献


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

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