目次 | 索引 |
---|---|
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% javac FirstArgument.java b00a001@Ampere:~/java% java FirstArgument 100 100 b00a001@Ampere:~/java% java FirstArgument 200 200 b00a001@Ampere:~/java%
データの渡し方は、javaコマンドにそのデータを追加して入力します。
このデータを
コマンドライン引数
(
command-line argument
)
とよびます。
プログラムでは、式
Integer.parseInt(args[0])
がコマンドライン引数を表します。
注意:
コマンドライン引数を入力しなかったり、整数(
int
型)でないものを入力した場合、式
Integer.parseInt(args[0])
の部分でエラーが発生します。
また、コマンドライン引数を複数入力しても、この式で取り出せるのは最初の一つだけです。
ちゃんとしたプログラムを書くには、コマンドライン引数の個数を確かめ、それが整数であることを確認する必要があります。
今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。 プログラムの構成要素には、このほかに 選択 ( selection ) とよばれるものがあります。 これは、「もし何々が成り立つならば何々する」というような構成要素です。 選択を表す文を、 選択文 ( selective statement ) 、あるいは 条件文 ( conditional statement ) とよびます。
次のプログラムは、もしコマンドライン引数が負の数ならばIt 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("It is a negative number."); /* 6*/ } /* 7*/ } /* 8*/ }
b00a001@Ampere:~/java% javac NegativeNumber.java b00a001@Ampere:~/java% java NegativeNumber 100 b00a001@Ampere:~/java% java NegativeNumber -30 It is a negative number. b00a001@Ampere:~/java%
「もし何々が成り立つならば何々する」という選択は、
if文
(
if statement
)
を使うと書けます。
if
文は次のような形をとります。
条件
condition
が成り立つならば、
statement1
,
statement2
,
statement3
, ... を実行します。
if (condition) { statement1; statement2; statement3; ... }
if
文の中に、さらに
if
文を書くこともできます。
次のプログラムは、コマンドライン引数が3桁の数ならばIt is a number of three figures.と出力するものです。
4行目で「
x
は100以上」という条件が課され、5行目で「
x
は999以下」という条件が課されますので、6行目は、
x
が100以上999以下の場合、すなわち3桁の数の時に実行されます。
記号
>=
,
<=
はそれぞれ≧, ≦に対応します。
/* 1*/ class ThreeFigures { /* 2*/ public static void main (String[] args) { /* 3*/ int x = Integer.parseInt(args[0]); /* 4*/ if (x >= 100) { /* 5*/ if (x <= 999) { /* 6*/ System.out.println("It is a number of three figures."); /* 7*/ } /* 8*/ } /* 9*/ } /*10*/ }
b00a001@Ampere:~/java% javac ThreeFigures.java b00a001@Ampere:~/java% java ThreeFigures 55 b00a001@Ampere:~/java% java ThreeFigures 555 It is a number of three figures. b00a001@Ampere:~/java%
上記の例では、条件として
temp < 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になることが、条件が成り立たないことを意味します。
論理演算子を使いますと、より複雑な条件が書けます。
記号 | 論理演算 | 例 |
---|---|---|
&& |
かつ | 16 > 5 && 4 == 7 ⇒ false |
|| |
または | 16 > 5 || 4 == 7 ⇒ true |
! |
〜でない | !(4 == 7) ⇒ true |
記号
&&
は、ふたつの条件を結んで新しく条件を作ります。
これは、両方の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。
記号
||
も、ふたつの条件を結びます。
これは、一方(両方でもよい)の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。
記号
!
は、ひとつの条件から新しく条件を作ります。
これは、trueをfalseに、falseをtrueに変えます。
これまでに説明した演算子の優先順位は次のようになります。 分からなくなりそうでしたら、括弧を使って計算順序を明示するのがよいでしょう。
! - (単項) |
* / % |
+ - |
> < >= <= |
== != |
&& |
|| |
ここで、単項の
-
とは、式
- 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("It is a number of three figures."); /* 6*/ } /* 7*/ } /* 8*/ }
注意:
4行目の条件を
100 <= x <= 999
と書くことはできません。
選択の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。 この選択には、 if-else文 ( if-else statement ) を使います。
次のプログラムは、コマンドライン引数が偶数ならばIt is an even number.と出力し、そうでないならばIt 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("It is an even number."); /* 6*/ } else { /* 7*/ System.out.println("It is an odd number."); /* 8*/ } /* 9*/ } /*10*/ }
b00a001@Ampere:~/java% javac EvenOdd.java b00a001@Ampere:~/java% java EvenOdd 12 It is an even number. b00a001@Ampere:~/java% java EvenOdd 15 It is an odd number. b00a001@Ampere:~/java%
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 ...が実行されます。
条件がより多い場合は次のようになります。 条件 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 ScoreGrade { /* 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% javac ScoreGrade.java b00a001@Ampere:~/java% java ScoreGrade 85 B b00a001@Ampere:~/java% java ScoreGrade 78 C b00a001@Ampere:~/java% java ScoreGrade -10 Illegal score b00a001@Ampere:~/java%
選択の使用例として、次の問題を考えます。
あるデパートでは、商品価格が5,000円以上ならば1割引、50,000円以上ならば2割引になるバーゲンセールを行っているとします。 コマンドライン引数をもとの価格と見なして、割引後の価格を求めてください。 (コマンドライン引数は負でない整数と仮定してください。 消費税は考えないでください。)
この問題を次のように解決してはいけません。
なぜならば、これでは50,000円以上の商品の場合、1割引してさらに2割引するからです。 二重に割引しない解決方法はいくつかありますが、例えば次のようにします。
このアルゴリズムをプログラムにしますと、次のようになります。
/* 1*/ class BargainSale { /* 2*/ public static void main (String[] args) { /* 3*/ int price = Integer.parseInt(args[0]); /* 4*/ if (price >= 50000) { /* 5*/ price = price * 8 / 10; /* 6*/ } else if (price >= 5000) { /* 7*/ price = price * 9 / 10; /* 8*/ } else { /* 9*/ } /*10*/ System.out.println(price); /*11*/ } /*12*/ }
b00a001@Ampere:~/java% javac BargainSale.java b00a001@Ampere:~/java% java BargainSale 1000 1000 b00a001@Ampere:~/java% java BargainSale 10000 9000 b00a001@Ampere:~/java% java BargainSale 100000 80000 b00a001@Ampere:~/java%
次の問題を考えます。
ある電話会社では、次のようなコース(契約)があるとします。コマンドライン引数を通話時間(分)と見なして、このコースでの合計料金(基本料金+通話料金)を求めてください。 (コマンドライン引数は負でない整数と仮定してください。 消費税は考えないでください。)
- 一か月の基本料金は2,000円。
- 通話料金は、一か月につき200分までは無料。
- これを超えると、1分につき10円課金。
- ただし、通話時間が1,000分を超えると、いくらかけてもその月の通話料金は8,000円のまま。
この問題を次のように解決します。
このアルゴリズムをプログラムにしてください。
b00a001@Ampere:~/java% javac PhoneCall.java b00a001@Ampere:~/java% java PhoneCall 100 2000 b00a001@Ampere:~/java% java PhoneCall 300 3000 b00a001@Ampere:~/java% java PhoneCall 800 8000 b00a001@Ampere:~/java% java PhoneCall 1200 10000 b00a001@Ampere:~/java%
今日の演習4に従ってJavaプログラムを作成し、そのプログラムをkonishi@twcu.ac.jpあてにメールで提出してください。 メールには、学生番号、氏名、科目名、授業日(10/17)を明記してください。