前回は次のようなプログラムを動かしました。
1: class VariableTest { 2: public static void main (String[] args) { 3: int x; 4: x = 100; 5: System.out.println(x); 6: } 7: }
変数の宣言とデータの格納は一緒に行うことができます。
この操作を変数の初期化(initialization)とよび、そのデータをその変数の初期値(initial value)とよびます。
次のプログラムの3行目で、変数 x
を100に初期化しています。
1: class VariableTest2 { 2: public static void main (String[] args) { 3: int x = 100; 4: System.out.println(x); 5: } 6: }
次のように書きますと、複数の変数が初期化できます。
int x = 100, y = 200;
次のように、変数の初期化と単なる宣言を混ぜることもできます。
int x = 100, y = 200, z;
今までの例では、変数に格納されたデータは特に変更されませんでした。 一般的には、変数に格納されたデータは何度も変更されます。
1: class VariableTest3 { 2: public static void main (String[] args) { 3: int x = 100; 4: x = x + 1; 5: System.out.println(x); 6: } 7: }
b00a001@Ampere:~/java% java VariableTest3 101 b00a001@Ampere:~/java%
このプログラムは、いったん変数 x
にデータ100を格納した後、それを1増加させるものです。
4行目は、変数 x
の値に1をたしたものを変数 x
に格納する代入文です。
x
と x + 1
が等しいと言っているわけではありません。
このイメージは次の図のようになります。
変数の値を1増加させることは頻繁に行われますので、省略形が用意されています。
x++;
で x = x + 1;
と同じことが行われます。
変数の値を1減少させることにつきましても、x = x - 1;
を x--;
と省略することができます。
1: class VariableTest4 { 2: public static void main (String[] args) { 3: int x = 100, y = 200; 4: x++; 5: y--; 6: System.out.println(x); 7: System.out.println(y); 8: } 9: }
b00a001@Ampere:~/java% java VariableTest4 101 199 b00a001@Ampere:~/java%
変数 x
と y
に格納されているデータを交換するプログラムを考えます。
次は間違っている例です。
1: class BadSwap { 2: public static void main (String[] args) { 3: int x = 100, y = 200; 4: x = y; 5: y = x; 6: System.out.println(x); 7: System.out.println(y); 8: } 9: }
b00a001@Ampere:~/java% java BadSwap 200 200 b00a001@Ampere:~/java%
4行目を実行した段階で、x
に格納されているデータが消えてしまいますので、うまくいかないのです。
もう一つ変数 z
を用意し、そこにいったん x
の値をコピーしておくとうまくいきます。
1: class GoodSwap { 2: public static void main (String[] args) { 3: int x = 100, y = 200, z; 4: z = x; 5: x = y; 6: y = z; 7: System.out.println(x); 8: System.out.println(y); 9: } 10: }
b00a001@Ampere:~/java% java GoodSwap 200 100 b00a001@Ampere:~/java%
javaコマンドでプログラムを実行するさいに、プログラムにデータを渡すことができます。 次のプログラムは、渡されたデータをそのまま出力するものです。
1: class FirstArgument { 2: public static void main (String[] args) { 3: int x = Integer.parseInt(args[0]); 4: System.out.println(x); 5: } 6: }
b00a001@Ampere:~/java% java FirstArgument 100 100 b00a001@Ampere:~/java% java FirstArgument 200 200 b00a001@Ampere:~/java%
データの渡し方は、javaコマンドにそのデータを追加して入力します。
このデータをコマンドライン引数とよびます。
プログラムでは、式 Integer.parseInt(args[0])
がコマンドライン引数を表します。
注意:
コマンドライン引数を入力しなかったり、整数(int
型)でないものを入力した場合、式 Integer.parseInt(args[0])
の部分でエラーが発生します。
また、コマンドライン引数を複数入力しても、この式で取り出せるのは最初の一つだけです。
ちゃんとしたプログラムを書くには、コマンドライン引数の個数を確かめ、それが整数であることを確認する必要があります。
if
文今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。 プログラムの構成要素には、このほかにも「もし何々が成り立つならば何々する」というようなものがあります。 これを選択(selection)、あるいは条件分岐(conditional branch)とよびます。
次のプログラムは、もしコマンドライン引数が負の数ならばThat is a negative number.と出力するものです。
4行目の temp < 0
の部分が、「負の数ならば」という条件を表しています。
1: class NegativeNumber { 2: public static void main (String[] args) { 3: int temp = Integer.parseInt(args[0]); 4: if (temp < 0) { 5: System.out.println("That is a negative number."); 6: } 7: } 8: }
b00a001@Ampere:~/java% java NegativeNumber 100 b00a001@Ampere:~/java% java NegativeNumber -30 That is a negative number. b00a001@Ampere:~/java%
「もし何々が成り立つならば何々する」という選択は、if
文を使うと書けます。
if
文は次のような形をとります。
条件 condition が成り立つならば、statement1, statement2, ... を実行します。
if (condition) { statement1; statement2; ... }
if
文の中に、さらに if
文を書くこともできます。
次のプログラムは、コマンドライン引数が3桁の数ならばThat is a number of three figures.と出力するものです。
4行目で「x
は99より大きい」という条件が課され、5行目で「x
は1000より小さい」という条件が課されますので、6行目は、x
が99より大きくて1000より小さな場合、すなわち3桁の数の時に実行されます。
1: class ThreeFigures { 2: public static void main (String[] args) { 3: int x = Integer.parseInt(args[0]); 4: if (x > 99) { 5: if (x < 1000) { 6: System.out.println("That is a number of three figures."); 7: } 8: } 9: } 10: }
b00a001@Ampere:~/java% java ThreeFigures 55 b00a001@Ampere:~/java% java ThreeFigures 555 That is a number of three figures. b00a001@Ampere:~/java%
上記の例では、条件として temp < 0
や x > 99
を書きました。
条件は、関係演算子(relational operator)や論理演算子(logical operator)を用いて構成されます。
関係演算子は次の通りです。
記号 | 関係 | 例 |
---|---|---|
> | 大きい | 19 > 3 ⇒ true |
< | 小さい | 19 < 3 ⇒ false |
>= | 以上 | 19 >= 3 ⇒ true |
<= | 以下 | 19 <= 3 ⇒ false |
== | 等しい | 19 == 3 ⇒ false |
!= | 等しくない | 19 != 3 ⇒ true |
等しい関係は記号 ==
で表すことに注意してください。
記号 =
では代入文になります。
実は、条件は式の一種です。 式の値がtrueになることが、条件が成り立つことを意味します。 式の値がfalseになることが、条件が成り立たないことを意味します。
論理演算子を使いますと、より複雑な条件が書けます。
記号 | 論理演算 | 例 |
---|---|---|
&& | かつ | 16 > 5 && 4 == 7 ⇒ false |
|| | または | 16 > 5 || 4 == 7 ⇒ true |
! | 〜でない | !(4 == 7) ⇒ true |
記号 &&
は、ふたつの条件を結んで新しく条件を作ります。
これは、両方の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。
記号 ||
も、ふたつの条件を結びます。
これは、一方(両方でもよい)の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。
記号 !
は、ひとつの条件から新しく条件を作ります。
これは、trueをfalseに、falseをtrueに変えます。
これまでに説明した演算子の優先順位は次のようになります。 分からなくなりそうでしたら、括弧を使って計算順序を明示するのがよいでしょう。
! - (単項) |
* / % |
+ - |
> < >= <= |
== != |
&& |
|| |
ここで、単項の -
とは、式 -1 + x
などの -
のことです。
次のプログラムでは、100以上999以下というひとつの条件で3桁の数を判定します。
1: class ThreeFigures2 { 2: public static void main (String[] args) { 3: int x = Integer.parseInt(args[0]); 4: if (100 <= x && x <= 999) { 5: System.out.println("That is a number of three figures."); 6: } 7: } 8: }
注意:
4行目の条件を 100 <= x <= 999
と書くことはできません。
if
-else
文(1)
選択の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。
この選択には、if
-else
文を使います。
次のプログラムは、コマンドライン引数が偶数ならばThat is an even number.と出力し、そうでないならばThat is an odd number.と出力するものです。
1: class EvenOdd { 2: public static void main (String[] args) { 3: int x = Integer.parseInt(args[0]); 4: if (x % 2 == 0) { 5: System.out.println("That is an even number."); 6: } else { 7: System.out.println("That is an odd number."); 8: } 9: } 10: }
b00a001@Ampere:~/java% java EvenOdd 12 That is an even number. b00a001@Ampere:~/java% java EvenOdd 15 That is an odd number. b00a001@Ampere:~/java%
if
-else
文は次のような形をとります。
条件 condition が成り立つならば、statement1, statement2, ...を実行します。
成り立たないならば、statement3, statement4, ...を実行します。
if (condition) { statement1; statement2; ... } else { statement3; statement4; ... }
if
-else
文(2)「何々が成り立つならば何々する。 そうでなくて、何々が成り立つならば何々する。 どちらも成り立たないならば何々する。 」というような選択は、プログラミングでよく用いられます。 これは次のように書きます。
if (condition1) { statement1; ... } else if (condition2) { statement2; ... } else { statement3; ... }
条件 condition1 が成り立つならば、statement1 ...が実行されます。 条件 condition1 が成り立たなくて、条件 condition2 が成り立つならば、statement2 ...が実行されます。 条件 condition1 も condition2 も成り立たないならば、statement3 ...が実行されます。
条件がより多い場合は次のようになります。 条件 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点以下ならばAを、80点以上90点未満ならばBを、70点以上80点未満ならばCを、60点以上70点未満ならばDを、0点以上60点未満ならばFを、それぞれ出力します。 どの条件も成り立たない場合は、入力が間違っていますので、Illegal scoreと出力します。
1: class Grade { 2: public static void main (String[] args) { 3: int score = Integer.parseInt(args[0]); 4: if (90 <= score && score <= 100) { 5: System.out.println("A"); 6: } else if (80 <= score && score < 90) { 7: System.out.println("B"); 8: } else if (70 <= score && score < 80) { 9: System.out.println("C"); 10: } else if (60 <= score && score < 70) { 11: System.out.println("D"); 12: } else if (0 <= score && score < 60) { 13: System.out.println("F"); 14: } else { 15: System.out.println("Illegal score"); 16: } 17: } 18: }
b00a001@Ampere:~/java% java Grade 85 B b00a001@Ampere:~/java% java Grade 78 C b00a001@Ampere:~/java% java Grade -10 Illegal score b00a001@Ampere:~/java%
以下の表にしたがって、 身長をコマンドライン引数として与えると、 それに対応する紳士衣料品のサイズを出力するプログラムを作成してください。 なお、表中の155〜165は、155以上165未満としてください。 また、身長が表にない場合は、Specialと出力してください。
S | M | L | |
---|---|---|---|
身長 | 155〜165 | 165〜175 | 175〜185 |
b00a001@Ampere:~/java% java MemsSize 172 M b00a001@Ampere:~/java% java MemsSize 178 L b00a001@Ampere:~/java% java MemsSize 190 Special b00a001@Ampere:~/java%
今日の演習4にしたがってJavaプログラムを作成し、konishi@twcu.ac.jpあてにメールでそのプログラムを提出してください。 メールには、学生番号、氏名、科目名、授業の日付けを明記してください。