目次 | 索引 |
---|---|
これまで、「ターミナル」にデータを出力するには、
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("Enter a number: "); /* 9*/ x = Integer.parseInt(br.readLine()); /* 10*/ System.out.println(x); /* 11*/ } /* 12*/ }
b04a001@AsiaA1:~/java% javac InputTest.java b04a001@AsiaA1:~/java% java InputTest Enter a number: 100 100 b04a001@AsiaA1:~/java%
データ入力のあるプログラムでは、1行目から6行目まではそのまま書くものと考えてください。 ただし、3行目はファイル名によって変わります。
9行目の式
Integer.parseInt(br.readLine())
が入力される数を表します。
プログラムの実行中にこの式がありますと、プログラムはいったん停止します。
「ターミナル」で数を入力してreturnをタイプしますと、入力した数がこの式の値となり、プログラムは続行されます。
注意:
何も入力しないでreturnをタイプしたり、整数(
int
型)でないものを入力した場合、式
Integer.parseInt(br.readLine())
の部分でエラーが発生します。
今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。 プログラムの構成要素には、このほかに 選択 ( selection ) とよばれるものがあります。 これは、「もし何々が成り立つならば何々する」というような構成要素です。 選択を表す文を、 選択文 ( selective statement ) 、あるいは 条件文 ( conditional statement ) とよびます。
次のプログラムは、入力が負の数ならば"It is a negative number."と出力するものです。
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("Enter a number: "); /* 9*/ x = Integer.parseInt(br.readLine()); /* 10*/ if (x < 0) { /* 11*/ System.out.println("It is a negative number."); /* 12*/ } /* 13*/ } /* 14*/ }
b04a001@AsiaA1:~/java% javac NegativeNumber.java b04a001@AsiaA1:~/java% java NegativeNumber Enter a number: 100 b04a001@AsiaA1:~/java% java NegativeNumber Enter a number: -30 It is a negative number. b04a001@AsiaA1:~/java%
「もし何々が成り立つならば何々する」という選択は、
if文
(
if statement
)
を使うと書けます。
if
文は次のような形をとります。
条件
condition
が成り立つならば、
statement1
,
statement2
,
statement3
, ... を実行します。
if (condition) { statement1; statement2; statement3; ... }
if
文の中に、さらに
if
文を書くこともできます。
次のプログラムは、入力が3桁の数ならば"It is a number of three figures."と出力するものです。
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("Enter a number: "); /* 9*/ x = Integer.parseInt(br.readLine()); /* 10*/ if (x >= 100) { /* 11*/ if (x <= 999) { /* 12*/ System.out.println("It is a number of three figures."); /* 13*/ } /* 14*/ } /* 15*/ } /* 16*/ }
b04a001@AsiaA1:~/java% javac ThreeFigures.java b04a001@AsiaA1:~/java% java ThreeFigures Enter a number: 55 b04a001@AsiaA1:~/java% java ThreeFigures Enter a number: 555 It is a number of three figures. b04a001@AsiaA1:~/java%
上記の例では、条件として
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("Enter a number: "); /* 9*/ x = Integer.parseInt(br.readLine()); /* 10*/ if (100 <= x && x <= 999) { /* 11*/ System.out.println("It is a number of three figures."); /* 12*/ } /* 13*/ } /* 14*/ }
注意:
10行目の条件を
100 <= x <= 999
と書くことはできません。
選択の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。 この選択には、 if-else文 ( if-else statement ) を使います。
次のプログラムは、入力が偶数ならば"It is an even number."と出力し、そうでないならば"It is an odd number."と出力するものです。
/* 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("Enter a number: "); /* 9*/ x = Integer.parseInt(br.readLine()); /* 10*/ if (x % 2 == 0) { /* 11*/ System.out.println("It is an even number."); /* 12*/ } else { /* 13*/ System.out.println("It is an odd number."); /* 14*/ } /* 15*/ } /* 16*/ }
b04a001@AsiaA1:~/java% javac EvenOdd.java b04a001@AsiaA1:~/java% java EvenOdd Enter a number: 12 It is an even number. b04a001@AsiaA1:~/java% java EvenOdd Enter a number: 15 It is an odd number. b04a001@AsiaA1:~/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点以下ならばSを、80点以上90点未満ならばAを、70点以上80点未満ならばBを、60点以上70点未満ならばCを、0点以上60点未満ならばFを、それぞれ出力します。 どの条件も成り立たない場合は、入力が間違っていますので、"An illegal score"と出力します。
/* 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("Enter a score: "); /* 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("An illegal score"); /* 22*/ } /* 23*/ } /* 24*/ }
b04a001@AsiaA1:~/java% javac ScoreGrade.java b04a001@AsiaA1:~/java% java ScoreGrade Enter a score: 100 S b04a001@AsiaA1:~/java% java ScoreGrade Enter a score: 85 A b04a001@AsiaA1:~/java% java ScoreGrade Enter a score: 78 B b04a001@AsiaA1:~/java% java ScoreGrade Enter a score: 50 F b04a001@AsiaA1:~/java% java ScoreGrade Enter a score: -10 An illegal score b04a001@AsiaA1:~/java%
選択の使用例として、次の問題を考えます。
あるデパートでは、商品価格が5,000円以上ならば1割引、50,000円以上ならば2割引になるバーゲンセールを行っているとします。 入力された数をもとの価格と見なして、割引後の価格を求めてください。 (入力は負でない整数と仮定します。 消費税は考えないものとします。)
この問題を次のように解決してはいけません。
なぜならば、これでは50,000円以上の商品の場合、1割引してさらに2割引するからです。 二重に割引しない解決方法はいくつかありますが、例えば次のようにします。
このアルゴリズムをプログラムにしますと、次のようになります。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class BargainSale { /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ int price; /* 8*/ System.out.print("Enter price (yen): "); /* 9*/ price = Integer.parseInt(br.readLine()); /* 10*/ if (price >= 50000) { /* 11*/ price = price * 8 / 10; /* 12*/ } else if (price >= 5000) { /* 13*/ price = price * 9 / 10; /* 14*/ } else { /* 15*/ } /* 16*/ System.out.println(price); /* 17*/ } /* 18*/ }
b04a001@AsiaA1:~/java% javac BargainSale.java b04a001@AsiaA1:~/java% java BargainSale Enter price (yen): 1000 1000 b04a001@AsiaA1:~/java% java BargainSale Enter price (yen): 10000 9000 b04a001@AsiaA1:~/java% java BargainSale Enter price (yen): 100000 80000 b04a001@AsiaA1:~/java%
次の問題を考えます。
A子は缶ジュースの割引券を数枚持って、缶ジュースのまとめ買いに出かけました。 この割引券を1枚使いますと、1本120円の缶ジュースが10円割引になります。 ただし、この割引券は缶ジュース1本につき1枚しか使えません。 入力された本数と枚数から、割引後の金額を求めてください。 (入力が負の整数の場合もあるとします。 消費税は考えないものとします。)
A子の考えたアルゴリズムは次の通りです。
このアルゴリズムをプログラムにしてください。
b04a001@AsiaA1:~/java% javac DiscountCoupon.java b04a001@AsiaA1:~/java% java DiscountCoupon How many cans: 2 How many coupons: 4 220 b04a001@AsiaA1:~/java% java DiscountCoupon How many cans: 5 How many coupons: 3 570 b04a001@AsiaA1:~/java% java DiscountCoupon How many cans: 1 How many coupons: -1 Illegal input b04a001@AsiaA1:~/java% java DiscountCoupon How many cans: -1 How many coupons: 1 Illegal input b04a001@AsiaA1:~/java%
余力のある人は、このアルゴリズムでは、本数が負でも枚数が負でも、きちんと"Illegal input"と出力される理由を説明してください。
今日の演習4に従ってJavaプログラムを作成し、そのプログラムをkonishi@twcu.ac.jpあてにメールで提出してください。 メールには、学生番号、氏名、科目名、授業日(5/7)を明記してください。