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

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

目次
4.1 データの入出力(1)
4.1.1 改行
4.1.2 データの入力
4.2 選択(1)
4.2.1 if文
4.3 式と演算子(2)
4.4 選択(2)
4.4.1 if-else文(1)
4.4.2 if-else文(2)
4.4.3 選択の使用例
4.5 演習4
4.6 レポート課題
4.7 参考文献
索引
!=演算子   !演算子   ||演算子   -演算子   ==演算子   <=演算子   <演算子   >=演算子   >演算子   &&演算子   falseリテラル   if-else文   if文   printlnメソッド   printメソッド   readLineメソッド   trueリテラル   関係演算子   条件文   選択   選択文   論理演算子  

4.1 データの入出力(1)

4.1.1 改行

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

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

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

4.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$ javac InputTest.java
asiaa1:~/comp2b b08a001$ java InputTest
整数を入力してください: 100
100
asiaa1:~/comp2b b08a001$

データ入力のあるプログラムでは、1行目から6行目まではそのまま書くものと考えてください。 ただし、3行目はファイル名によって変わります。

9行目の式 Integer.parseInt(br.readLine()) が入力される数を表します。 プログラムの実行中にこの式がありますと、プログラムはいったん停止します。 「ターミナル」で数を入力してreturnをタイプしますと、入力した数がこの式の値となり、プログラムは続行されます。

注意: 何も入力しないでreturnをタイプしたり、整数( int 型)でないものを入力した場合、式 Integer.parseInt(br.readLine()) の部分でエラーが発生します。


4.2 選択(1)

4.2.1 if文

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

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

プログラムの構成要素には、このほかに 選択selection ) とよばれるものがあります。 これは、「もし何々が成り立つならば何々する」というような構成要素です。 選択を表す文を、 選択文selective statement ) 、あるいは 条件文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$ javac NegativeNumber.java
asiaa1:~/comp2b b08a001$ java NegativeNumber
整数を入力してください: 100
asiaa1:~/comp2b b08a001$ java NegativeNumber
整数を入力してください: -30
それは負の数です。
asiaa1:~/comp2b b08a001$

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

if (condition) {
    statement1;
    statement2;
    statement3; ...
}
if文の流れ
図 4.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 {
/*  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$ javac ThreeFigures.java
asiaa1:~/comp2b b08a001$ java ThreeFigures
整数を入力してください: 55
asiaa1:~/comp2b b08a001$ java ThreeFigures
整数を入力してください: 555
それは3桁の数です。
asiaa1:~/comp2b b08a001$

4.3 式と演算子(2)

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

表 4.1  関係演算子
記号 関係
> 大きい 19 > 3⇒ true
< 小さい 19 < 3⇒ false
>= 以上 19 >= 3⇒ true
<= 以下 19 <= 3⇒ false
== 等しい 19 == 3⇒ false
!= 等しくない 19 != 3⇒ true

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

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

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

表 4.2  論理演算子
記号 論理演算
&& かつ 16 > 5 && 4 == 7⇒ false
|| または 16 > 5 || 4 == 7⇒ true
! 〜でない !(4 == 7)⇒ true

記号 && は、ふたつの条件を結んで新しく条件を作ります。 これは、両方の条件が成り立つことを意味します。 つまり、両方の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。

記号 || も、ふたつの条件を結びます。 これは、一方(両方でもよい)の条件が成り立つことを意味します。 つまり、一方(両方でもよい)の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。

記号 ! は、ひとつの条件から新しく条件を作ります。 これは、条件が成り立たないことを意味します。 つまり、trueをfalseに、falseをtrueに変えます。

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

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

ここで、単項の - とは、式 - x などの - のことです。

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

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class ThreeFigures2 {
/*  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 と書くことはできません。


4.4 選択(2)

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

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

if (condition) {
    statement1; ...
} else {
    statement2; ...
}
if-else文の流れ
図 4.3  if-else文の流れ(true=成り立つ、false=成り立たない)

4.4.2 if-else文(2)

「何々が成り立つならば何々する。 そうでなくて、何々が成り立つならば何々する。 どちらも成り立たないならば何々する。 」というような選択は、プログラミングでよく用いられます。 これは次のように書きます。

if (condition1) {
    statement1; ...
} else if (condition2) {
    statement2; ...
} else {
    statement3; ...
}

条件 condition1 が成り立つならば、 statement1 ...が実行されます。 条件 condition1 が成り立たなくて、条件 condition2 が成り立つならば、 statement2 ...が実行されます。 条件 condition1condition2 も成り立たないならば、 statement3 ...が実行されます。

多重if-else文の流れ
図 4.4  多重if-else文の流れ(true=成り立つ、false=成り立たない)

次のプログラムは、入力が正の数ならば「それは正の数です。」と出力し、負の数ならば「それは負の数です。」と出力するものです。 正の数でも負の数でもないならば、0のはずですので、「それは0です。」と出力します。

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class PositiveNegative {
/*  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*/         } else if (x < 0) { // そうでなくて負の数ならば
/* 13*/             System.out.println("それは負の数です。");
/* 14*/         } else { // どれでもないならば
/* 15*/             System.out.println("それは0です。");
/* 16*/         }
/* 17*/     }
/* 18*/ }
asiaa1:~/comp2b b08a001$ javac PositiveNegative.java
asiaa1:~/comp2b b08a001$ java PositiveNegative
整数を入力してください: 100
それは正の数です。
asiaa1:~/comp2b b08a001$ java PositiveNegative
整数を入力してください: -30
それは負の数です。
asiaa1:~/comp2b b08a001$ java PositiveNegative
整数を入力してください: 0
それは0です。
asiaa1:~/comp2b b08a001$

条件がより多い場合は次のようになります。 条件 condition1 , condition2 ,...と順に確かめていき、はじめて成り立つ条件が condition_i ならば、 statement_i ...が実行されます。 どの条件も成り立たないならば、 statement_n+1 ...が実行されます。

if (condition1) {
    statement1; ...
} else if (condition2) {
    statement2; ...
} else if (condition3) {
    statement3; ...
}
...
  else if (condition_n) {
    statement_n; ...
} else {
    statement_n+1; ...
}

4.4.3 選択の使用例

選択の使用例として、次の問題を考えます。

ある大学では、90点以上100点以下ならばSを、80点以上90点未満ならばAを、70点以上80点未満ならばBを、60点以上70点未満ならばCを、0点以上60点未満ならばFを、それぞれ成績評価とします。 入力された得点から、成績評価を求めてください。

この問題を解決するには、得点の場合分けをそのままプログラムに書くのが簡単です。 プログラムは次のようになります。 どの場合にも当てはまらないなら、間違った得点なので、エラーを出力します。

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class ScoreGrade {
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int score;
/*  8*/         System.out.print("得点を入力してください: ");
/*  9*/         score = Integer.parseInt(br.readLine());
/* 10*/         if (90 <= score && score <= 100) {
/* 11*/             System.out.println("S");
/* 12*/         } else if (80 <= score && score < 90) {
/* 13*/             System.out.println("A");
/* 14*/         } else if (70 <= score && score < 80) {
/* 15*/             System.out.println("B");
/* 16*/         } else if (60 <= score && score < 70) {
/* 17*/             System.out.println("C");
/* 18*/         } else if (0 <= score && score < 60) {
/* 19*/             System.out.println("F");
/* 20*/         } else { // 間違った得点
/* 21*/             System.out.println("エラー");
/* 22*/         }
/* 23*/     }
/* 24*/ }
asiaa1:~/comp2b b08a001$ javac ScoreGrade.java
asiaa1:~/comp2b b08a001$ java ScoreGrade
得点を入力してください: 100
S
asiaa1:~/comp2b b08a001$ java ScoreGrade
得点を入力してください: 85
A
asiaa1:~/comp2b b08a001$ java ScoreGrade
得点を入力してください: 78
B
asiaa1:~/comp2b b08a001$ java ScoreGrade
得点を入力してください: 62
C
asiaa1:~/comp2b b08a001$ java ScoreGrade
得点を入力してください: 50
F
asiaa1:~/comp2b b08a001$ java ScoreGrade
得点を入力してください: -10
エラー
asiaa1:~/comp2b b08a001$

整数の性質をよく考えますと、このプログラムを短くできます。 まず、100点超をエラーとします。 そうでなければ、100点以下のはずですので、90点以上ならばS評価と分かります。 そうでなければ、90点未満のはずですので、80点以上ならばA評価と分かります。 同じように考えていきますと、次のようなプログラムになります。

/*  1*/ import java.io.*;
/*  2*/
/*  3*/ class ScoreGrade2 {
/*  4*/     public static void main (String[] args) throws IOException {
/*  5*/         InputStreamReader isr = new InputStreamReader(System.in);
/*  6*/         BufferedReader br = new BufferedReader(isr);
/*  7*/         int score;
/*  8*/         System.out.print("得点を入力してください: ");
/*  9*/         score = Integer.parseInt(br.readLine());
/* 10*/         if (score > 100) { // 間違った得点
/* 11*/             System.out.println("エラー");
/* 12*/         } else if (score >= 90) { // 100点以下のはず
/* 13*/             System.out.println("S");
/* 14*/         } else if (score >= 80) { // 90点未満のはず
/* 15*/             System.out.println("A");
/* 16*/         } else if (score >= 70) { // 80点未満のはず
/* 17*/             System.out.println("B");
/* 18*/         } else if (score >= 60) { // 70点未満のはず
/* 19*/             System.out.println("C");
/* 20*/         } else if (score >= 0) { // 60点未満のはず
/* 21*/             System.out.println("F");
/* 22*/         } else { // 0点未満のはず
/* 23*/             System.out.println("エラー");
/* 24*/         }
/* 25*/     }
/* 26*/ }

4.5 演習4

次の問題を考えます。

A子の履歴書によると、1993年から1998年までは小学校に通い、1999年から2001年までは中学校に通い、2002年から2004年までは高校に通っています。 他の年については分かりません。 入力された西暦から、A子が何をしていたかを求めてください。

この問題を解決するアルゴリズムを考え、プログラムを作成してください。

asiaa1:~/comp2b b08a001$ javac PersonalHistory.java
asiaa1:~/comp2b b08a001$ java PersonalHistory
西暦を入力してください: 1995
彼女は小学校に通っています。
asiaa1:~/comp2b b08a001$ java PersonalHistory
西暦を入力してください: 2000
彼女は中学校に通っています。
asiaa1:~/comp2b b08a001$ java PersonalHistory
西暦を入力してください: 2002
彼女は高校に通っています。
asiaa1:~/comp2b b08a001$ java PersonalHistory
西暦を入力してください: 2005
分かりません。
asiaa1:~/comp2b b08a001$

余力のある人は、自分や架空の人の履歴書(未来の予想でもよい)を考え、西暦を入力すると何をしているかが分かるプログラムを作成してください。


4.6 レポート課題

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


4.7 参考文献


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

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