今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。
プログラムでは、条件付きで何かを実行することもできます。 これは、「もし何々が成り立つならば何々する」という考え方をします。 条件文 ( 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*/ }
整数を入力してください: 100 Completed with exit code: 0
整数を入力してください: -30 それは負の数です。 Completed with exit code: 0
「もし何々が成り立つならば何々する」という条件文は、 if文 ( if statement )を使うと書けます。 if文は次のような形をとります。 「 条件 」が成り立つならば、「 文1 」、「 文2 」、「 文3 」、...を実行します。
if (条件) { 文1; 文2; 文3; ... }
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*/ }
整数を入力してください: 55 Completed with exit code: 0
整数を入力してください: 555 それは3桁の数です。 Completed with exit code: 0
上記の例では、条件として
x < 0
や
x >= 100
を書きました。
条件は、関係演算子や論理演算子を用いて構成されます。
関係演算子
(
relational operator
)は次の通りです。
記号 | 関係 | 例 |
---|---|---|
>
|
大きい |
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*/ }
0.9999999999999999 1.0とほとんど等しいです。 Completed with exit code: 0
論理演算子 ( logical operator )を使うと、より複雑な条件が書けます。
記号 | 論理演算 | 例 |
---|---|---|
&&
|
かつ |
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
とまとめることはできません。
条件文の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。 この条件文には、 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*/ }
整数を入力してください: 12 それは偶数です。 Completed with exit code: 0
整数を入力してください: 15 それは奇数です。 Completed with exit code: 0
if-else文は次のような形をとります。 「 条件 」が成り立つならば、「 文1 」、...を実行します。 成り立たないならば、「 文2 」、...を実行します。
if (条件) { 文1; ... } else { 文2; ... }
条件文の使用例として、次の問題を考えます。
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*/ }
身長[m]を入力してください: 1.6 体重[kg]を入力してください: 65.0 肥満です。 Completed with exit code: 0
肥満でない場合も、何か出力したほうがよいでしょう。 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*/ }
身長[m]を入力してください: 1.6 体重[kg]を入力してください: 60.0 肥満ではありません。 Completed with exit code: 0
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*/ 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*/ }
西暦を入力してください: 2000 うるう年です。 Completed with exit code: 0
西暦を入力してください: 2010 うるう年ではありません。 Completed with exit code: 0
西暦を入力してください: 2020 うるう年です。 Completed with exit code: 0
西暦を入力してください: 2100 うるう年ではありません。 Completed with exit code: 0
実は、プログラムをもっと簡単にできます。 うるう年になるパターンは
のどちらかです。
この条件の通りにプログラムを作ります。
/* 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*/ }
次の歴史クイズを考えます。
大阪万博が開催された年は?
このクイズを出力し、整数を入力してもらい、その値が正しいかどうか出力するプログラムを作成してください。
import java.io.*; class HistoryQuiz { public static void main (String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); } }
大阪万博が開催された年は? 1964 残念! Completed with exit code: 0
大阪万博が開催された年は? 1970 正解! Completed with exit code: 0
余力のある人は、答えが整数になるクイズ(歴史に限りません)を自分で考え、入力された値が正しいかどうか出力するプログラムを作成してください。
今日の演習4の答案(Javaプログラム)をメールで提出してください。 差出人は大学発行のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(10月21日)を明記してください。