私のホームページへ - 前の授業へ - 次の授業へ

情報処理IIIA(Javaプログラミング入門)第4回

目次
  1. 変数と代入文(2)
  2. 選択(1)
  3. 演習4
  4. レポート課題

変数と代入文(2)

変数の初期化

前回は次のようなプログラムを動かしました。

 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 に格納する代入文です。 xx + 1 が等しいと言っているわけではありません。 このイメージは次の図のようになります。

Incrementing a variable
図4.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%

変数の値の交換

変数 xy に格納されているデータを交換するプログラムを考えます。 次は間違っている例です。

 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%

選択(1)

コマンドライン引数

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 < 0x > 99 を書きました。 条件は、関係演算子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 演算子の優先順位(上のほうがより強く結合する)
! -(単項)
* / %
+ -
> < >= <=
== !=
&&
||

ここで、単項の - とは、式 -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 ...が実行されます。 条件 condition1condition2 も成り立たないならば、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%

演習4

以下の表にしたがって、 身長をコマンドライン引数として与えると、 それに対応する紳士衣料品のサイズを出力するプログラムを作成してください。 なお、表中の155〜165は、155以上165未満としてください。 また、身長が表にない場合は、Specialと出力してください。

表4.4 紳士衣料品のサイズ表

SML
身長155〜165165〜175175〜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あてにメールでそのプログラムを提出してください。 メールには、学生番号、氏名、科目名、授業の日付けを明記してください。


私のホームページへ - 前の授業へ - 次の授業へ

このページの複製は、東京女子大学学内に限り許可します。 このページへのリンクを許可します。
2000年11月25日更新
製作・著作:小西善二郎<konishi@twcu.ac.jp>