これまで、「ターミナル」にデータを出力するには、
System.out.println(
data);
を使ってきました。
文字列をそのまま出力するには、
data
の部分にその文字列をダブルクオート(
"
)で囲んで書き、変数の値を出力するには、そこにその変数名を書きました。
System.out.println(
data
);
は、出力の後に改行します。
改行してほしくないときは、
System.out.print(
data);
と書きます。
また、改行だけしてほしいときは、
System.out.println();
とします。
注意:
「ターミナル」への出力は一文字ずつ行なわれるわけではなく、ある程度の文字数になるか改行があるとまとめて行なわれます。
System.out.print(
data
);
と書いてあるのに何も出力されないときは、改行
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$ 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())
の部分でエラーが発生します。
今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。
プログラムの構成要素には、このほかに 選択 ( 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
文の中に、さらに
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$
上記の例では、条件として
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 になることが、条件が成り立たないことを意味します。
論理演算子を使いますと、より複雑な条件が書けます。
記号
&&
は、ふたつの条件を結んで新しく条件を作ります。
これは、両方の条件が成り立つことを意味します。
つまり、両方の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。
記号
||
も、ふたつの条件を結びます。
これは、一方(両方でもよい)の条件が成り立つことを意味します。
つまり、一方(両方でもよい)の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。
記号
!
は、ひとつの条件から新しく条件を作ります。
これは、条件が成り立たないことを意味します。
つまり、trueをfalseに、falseをtrueに変えます。
これまでに説明した演算子の優先順位は次のようになります。 分からなくなりそうでしたら、括弧を使って計算順序を明示するのがよいでしょう。
! - (単項) |
* / % |
+ - |
> < >= <= |
== != |
&& |
|| |
ここで、単項の
-
とは、式 -
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
と書くことはできません。
選択の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。 この選択には、 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 (condition1) { statement1; ... } else if (condition2) { statement2; ... } else { statement3; ... }
条件 condition1 が成り立つならば、 statement1 ...が実行されます。 条件 condition1 が成り立たなくて、条件 condition2 が成り立つならば、 statement2 ...が実行されます。 条件 condition1 も condition2 も成り立たないならば、 statement3 ...が実行されます。
次のプログラムは、入力が正の数ならば「それは正の数です。」と出力し、負の数ならば「それは負の数です。」と出力するものです。 正の数でも負の数でもないならば、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; ... }
選択の使用例として、次の問題を考えます。
ある大学では、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*/ }
次の問題を考えます。
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の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(5月2日)を明記してください。