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

コンピュータIIB(Javaプログラミング入門)第5回

目次
5.1 データの入出力(1)
5.1.1 改行
5.1.2 データの入力
5.2 条件文(1)
5.2.1 if文
5.3 式と演算子(3)
5.3.1 関係演算子
5.3.2 論理演算子
5.4 条件文(2)
5.4.1 if-else文(1)
5.4.2 条件文の使用例
5.5 演習5
5.6 レポート課題
5.7 参考文献
索引
!=演算子   !演算子   ||演算子   -演算子   ==演算子   <=演算子   <演算子   >=演算子   >演算子   &&演算子   falseリテラル   if-else文   if文   printlnメソッド   printメソッド   readLineメソッド   trueリテラル   関係演算子   条件文   論理演算子  

5.1 データの入出力(1)

5.1.1 改行

これまで、「ターミナル」にデータを出力するには、文 System.out.println(データ); を使ってきました。 文字列をそのまま出力するには、「 データ 」の部分にその文字列をダブルクオート( " )で囲んで書き、変数の値を出力するには、そこにその変数名を書きました。

System.out.println( データ ); は、出力の後に改行します。 改行してほしくないときは、 System.out.print(データ); と書きます。 また、改行だけしてほしいときは、 System.out.println(); とします。

注意: 「ターミナル」への出力は一文字ずつ行われるわけではなく、改行などのタイミングで、まとめて行われます。 System.out.print( データ ); と書いてあるのに何も出力されないときは、改行用の文 System.out.println(); を忘れていないか確認してください。

5.1.2 データの入力

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.parseIntDouble.parseDouble の部分でエラーが発生します。


5.2 条件文(1)

5.2.1 if文

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

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

プログラムでは、条件付きで何かを実行することもできます。 これは、「もし何々が成り立つならば何々する」という考え方をします。 条件文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文の流れ
図 5.2  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*/ }
asiaa1:~/comp2b b08a001$ java ThreeFigures
整数を入力してください: 55
asiaa1:~/comp2b b08a001$ java ThreeFigures
整数を入力してください: 555
それは3桁の数です。
asiaa1:~/comp2b b08a001$

5.3 式と演算子(3)

5.3.1 関係演算子

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

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

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

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

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

Javaの実数には誤差が含まれていますので、実数 ded == 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$

5.3.2 論理演算子

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

表 5.2  論理演算子(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になります。

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

表 5.3  演算子の優先順位(上のほうがより強く結合する)
! -(単項)
* / %
+ -
> < >= <=
== !=
&&
||

ここで、単項の - とは、「 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 とまとめることはできません。


5.4 条件文(2)

5.4.1 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*/ }
asiaa1:~/comp2b b08a001$ java EvenOdd
整数を入力してください: 12
それは偶数です。
asiaa1:~/comp2b b08a001$ java EvenOdd
整数を入力してください: 15
それは奇数です。
asiaa1:~/comp2b b08a001$

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

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

5.4.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*/ }

5.5 演習5

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

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

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

asiaa1:~/comp2b b08a001$ java HistoryQuiz
大阪万博が開催された年は? 1964
残念!
asiaa1:~/comp2b b08a001$ java HistoryQuiz
大阪万博が開催された年は? 1970
正解!
asiaa1:~/comp2b b08a001$

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


5.6 レポート課題

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


5.7 参考文献


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

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