今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。
プログラムでは、条件付きで何かを実行することもできます。 これは、「もし何々が成り立つならば何々する」という考え方をします。 条件文 ( conditional statement )というものを使えば、そのようなプログラムが書けます。
次のプログラムは、入力が負の数ならば「それは負の数です。」と出力するものです。
9行目の
x < 0
の部分が、「負の数ならば」という条件を表しています。
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文の括弧
(
...
)
は省略できませんが、ブレース
{
...
}
は文が1つなら省略できます。
if文の中に、さらにif文を書くこともできます。
次のプログラムは、入力が3桁の数ならば「それは3桁の数です。」と出力するものです。
9行目で「
x
は100以上」という条件が課され、10行目で「
x
は999以下」という条件が課されるので、11行目は、
x
が100以上999以下の場合、すなわち3桁の数の時に実行されます。
記号
>=
,
<=
はそれぞれ≧, ≦に対応します。
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>
上記の例では、条件として
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
などとしてください。
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 )を使うと、より複雑な条件が書けます。
記号 | 論理演算 | 例 |
---|---|---|
&&
|
かつ |
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桁の数を判定します。
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
とまとめることはできません。
条件文の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。 この条件文には、 if-else文 ( if-else statement )を使います。
次のプログラムは、入力が偶数ならば「それは偶数です。」と出力し、そうでないならば「それは奇数です。」と出力するものです。
条件
x % 2 == 0
は、
x
を2で割った余りが0なので、
x
が2で割り切れることを意味し、偶数の条件になります。
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文の
else
の直後のブレース
{
...
}
は、文が1つなら省略できます。
注意: if文と似たものに、 条件演算子 ( conditional operator )があります。 これは、
条件 ? 式1 : 式2
という形式で、条件が成り立つときに「 式1 」、成り立たないときに「 式2 」の値を持ちます。 例えば、 x の絶対値を y に代入する場合は、
y = (x >= 0) ? x : -x;
となります。
条件文の使用例として、次の問題を考えます。
BMIとは、Body Mass Indexの略で、肥満を判定する基準の一つです。 BMIは、体重[kg]÷身長[m]÷身長[m]で計算され、これが25以上なら肥満と判定されます。 入力された身長と体重から、肥満かどうかを判定してください。
この問題を解決するには、最初に、身長と体重を入力してもらいます。 次に、計算式に基づいてBMIを計算します。 最後に、BMIが25以上なら「肥満です。」と出力します。
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未満なら「肥満ではありません。」と出力します。
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未満かどうか判断しなくてよくなります。
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("肥満ではありません。"); } } }
次の例は、入力された西暦が、うるう年かどうかを判定する問題です。 ここで、うるう年は次のように決められます。
この条件をそのままプログラムにすると、次のようになります。
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>
実は、プログラムをもっと簡単にできます。 うるう年になるパターンは
のどちらかです。
この条件の通りにプログラムを作ります。
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("うるう年ではありません。"); } } }
次の歴史クイズを考えます。
大阪万博が開催された年は?
このクイズを出力し、整数を入力してもらい、その値が正しいかどうか出力するプログラムを作成してください。
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日)を明記してください。