これまで、「ターミナル」にデータを出力するには、文
System.out.println(
データ);
を使ってきました。
文字列をそのまま出力するには、「
データ
」の部分にその文字列をダブルクオート(
"
)で囲んで書き、変数の値を出力するには、そこにその変数名を書きました。
文
System.out.println(
データ
);
は、出力の後に改行します。
改行してほしくないときは、
System.out.print(
データ);
と書きます。
また、改行だけしてほしいときは、
System.out.println();
とします。
注意:
「ターミナル」への出力は一文字ずつ行われるわけではなく、改行などのタイミングで、まとめて行われます。
System.out.print(
データ
);
と書いてあるのに何も出力されないときは、改行用の文
System.out.println();
を忘れていないか確認してください。
javaコマンドでプログラムを実行している途中で、プログラムにデータを入力することができます。 次のプログラムは、入力された整数をそのまま出力するものです。
/* 1*/ import java.io.*; // データ入力のときに書く /* 2*/ /* 3*/ class InputTest { // データ入力のときに書く /* 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*/ System.out.println(x); /* 11*/ } /* 12*/ }
asiaa1:~/comp2b b08a001$ java InputTest 整数を入力してください: 100 100 asiaa1:~/comp2b b08a001$
データ入力のあるプログラムでは、1行目から6行目まではそのまま書くものと考えてください。 ただし、3行目はファイル名によって変わります。
9行目の式
Integer.parseInt(br.readLine())
が入力される整数を表します。
プログラムの実行中にこの式があると、プログラムはいったん停止します。
「ターミナル」で整数を入力してreturnキーを押すと、入力した整数がこの式の値となり、プログラムは続行されます。
整数でなく実数を入力するには、
Integer.parseInt
の代わりに
Double.parseDouble
を書きます。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class DoubleInputTest { // 実数入力のテスト /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ double d; /* 8*/ System.out.print("実数を入力してください: "); /* 9*/ d = Double.parseDouble(br.readLine()); // 入力 /* 10*/ System.out.println(d); /* 11*/ } /* 12*/ }
asiaa1:~/comp2b b08a001$ java DoubleInputTest 実数を入力してください: 1.23 1.23 asiaa1:~/comp2b b08a001$
注意:
何も入力しないでreturnキーを押したり、整数や実数でないものを入力した場合、
Integer.parseInt
や
Double.parseDouble
の部分でエラーが発生します。
今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。
プログラムでは、条件付きで何かを実行することもできます。 これは、「もし何々が成り立つならば何々する」という考え方をします。 条件文 ( 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*/ }
asiaa1:~/comp2b b08a001$ java NegativeNumber 整数を入力してください: 100 asiaa1:~/comp2b b08a001$ java NegativeNumber 整数を入力してください: -30 それは負の数です。 asiaa1:~/comp2b b08a001$
「もし何々が成り立つならば何々する」という条件文は、
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*/ }
asiaa1:~/comp2b b08a001$ java ThreeFigures 整数を入力してください: 55 asiaa1:~/comp2b b08a001$ java ThreeFigures 整数を入力してください: 555 それは3桁の数です。 asiaa1:~/comp2b b08a001$
上記の例では、条件として
x < 0
や
x >= 100
を書きました。
条件は、
関係演算子
(
relational operator
)
や
論理演算子
(
logical 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*/ }
asiaa1:~/comp2b b08a001$ java EqualityTest 0.9999999999999999 1.0とほとんど等しいです。 asiaa1:~/comp2b b08a001$
論理演算子を使うと、より複雑な条件が書けます。
記号
&&
は、2つの条件を結んで新しく条件を作ります。
これは、両方の条件が成り立つという条件です。
つまり、両方の値がtrueならばtrueという値になり、そうでないならばfalseという値になります。
記号
||
も、2つの条件を結びます。
これは、一方(両方でもよい)の条件が成り立つという条件です。
つまり、一方(両方でもよい)の値がtrueならばtrueという値になり、そうでないならばfalseという値になります。
記号
!
は、1つの条件から新しく条件を作ります。
これは、条件が成り立たないという条件です。
つまり、trueならばfalseに、falseならばtrueになります。
これまでに説明した演算子の優先順位は次のようになります。 分からなくなりそうなら、括弧を使って計算順序を明示するのがよいでしょう。
! - (単項) |
* / % |
+ - |
> < >= <= |
== != |
&& |
|| |
ここで、単項の
-
とは、「
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*/ }
asiaa1:~/comp2b b08a001$ java EvenOdd 整数を入力してください: 12 それは偶数です。 asiaa1:~/comp2b b08a001$ java EvenOdd 整数を入力してください: 15 それは奇数です。 asiaa1:~/comp2b b08a001$
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*/ }
asiaa1:~/comp2b b08a001$ java BodyMassIndex 身長[m]を入力してください: 1.6 体重[kg]を入力してください: 65.0 肥満です。 asiaa1:~/comp2b b08a001$
肥満でない場合も、何か出力したほうがよいでしょう。 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*/ }
asiaa1:~/comp2b b08a001$ java BodyMassIndex2 身長[m]を入力してください: 1.6 体重[kg]を入力してください: 60.0 肥満ではありません。 asiaa1:~/comp2b b08a001$
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*/ }
次の歴史クイズを考えます。
大阪万博が開催された年は?
このクイズを出力し、整数を入力してもらい、その値が正しいかどうか出力するプログラムを作成してください。
asiaa1:~/comp2b b08a001$ java HistoryQuiz 大阪万博が開催された年は? 1964 残念! asiaa1:~/comp2b b08a001$ java HistoryQuiz 大阪万博が開催された年は? 1970 正解! asiaa1:~/comp2b b08a001$
余力のある人は、答えが整数になるクイズ(歴史に限りません)を自分で考え、入力された値が正しいかどうか出力するプログラムを作成してください。
今日の演習5の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(5月27日)を明記してください。