<本章の目的> if 文を習得する。条件式がC言語、C++言語とは微妙に違うので注意!
●問題4-1 キーボードから入力された降水確率により傘の必要性の有無を表示するプログラムを作って下さい。
○答え
import java.io.*;
public class Kasa3{
public static void main(String[] args){
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("降水確率を入力して下さい。");
String line=reader.readLine();
int n=Integer.parseInt(line);
System.out.println("降水確率は"+n+"%です。");
if(n<0 || 100<n){
System.out.println("降水確率は 0〜100 の間ですよ。");
}else if(n>=50){
System.out.println("傘を忘れずにね。");
}else{
System.out.println("傘は要りません。");
}
System.out.println("行ってらっしゃい。");
}catch(IOException e){
System.out.println(e);
}catch(NumberFormatException e){
System.out.println("数字の形式が正しくありません。");
}
}
}
○実行結果
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
-10
降水確率は-10%です。
降水確率は 0〜100 の間ですよ。
行ってらっしゃい。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
50
降水確率は50%です。
傘を忘れずにね。
行ってらっしゃい。
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
30
降水確率は30%です。
傘は要りません。
行ってらっしゃい。
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
150
降水確率は150%です。
降水確率は 0〜100 の間ですよ。
行ってらっしゃい。
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
12.3
数字の形式が正しくありません。
D:\atsushi\Java\List4-3>
○解説
3. BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
8. String line=reader.readLine();
これらは前章で解説しましたが、簡単に復習しましょう。
長くてよく分からない3行目の一文は、
データの読み込みを行う為の変数を宣言しているんだ、
くらいに考えておけば大きく違いはしないでしょう。
String は「文字列」を表すクラスです。
どうやら無尽蔵に文字列を保存できるみたい!?
char 型配列に四苦八苦していたC言語、C++言語プログラマは嬉しくて涙が出ちゃう反面、
内部構造を考えると怖くて涙が出ちゃいますね……。
readLine メソッドは文字列を1行分取得するメソッドです。
11. if(n<0 || 100<n){
13. }else if(n>=50){
15. }else{
条件式の型は boolean 型(論理型)です。
それが意味するところは問題4-2、問題4-3を参照して下さい。
それ以外は、C言語、C++言語と一緒。
9. int n=Integer.parseInt(line);
line に 12.3 という文字列が入っていた場合どうなるでしょうか?
小数を切り捨てて 12 という int 型数値が得られるでしょうか?
実行結果を見て下さい。
10行目以降の処理を中断して、
21. catch(NumberFormatException e){
22. System.out.println("数字の形式が正しくありません。");
23. }
まで直ちにワープしています。
これより、Integer.parseInt メソッドはその引数に
int 型と見なせる文字列以外が渡された場合は例外として処理する、ということが分かります。
★ブロック
if(n<0 || 100<n){
System.out.println("降水確率は 0〜100 の間ですよ。");
}else if(n>=50){
System.out.println("傘を忘れずにね。");
}else{
System.out.println("傘は要りません。");
}
と
if(n<0 || 100<n)
System.out.println("降水確率は 0〜100 の間ですよ。");
else if(n>=50)
System.out.println("傘を忘れずにね。");
else
System.out.println("傘は要りません。");
は、同じ意味です。
これまでのプログラムは全て、わざわざ { } で囲んでいますが、
Java言語においても、必ず { } で囲まなければいけない、という規則は無いみたいですね。
●問題4-2 if( n ) はJava言語の文法として正しいですか?( n は int 型変数)
○答え 正しくない。コンパイルエラー。
○コンパイル
■D:\atsushi\Java\List4-3> javac Kasa3.java
Kasa3.java:11: 互換性のない型
検出値 : int
期待値 : boolean
if(n){
^
エラー 1 個
○解説
C言語、C++言語プログラマには衝撃ですが、
0 以外は真、0 は偽とは見なしてくれないみたいです。
エラーメッセージにもあるように、条件式の型は boolean 型(論理型)です。
boolean 型とする為には、比較演算子を必ず用いる必要があります。
また、無理矢理 int 型を boolean 型にキャストしようとしたら
「変換できない型」というエラーメッセージが表示されました。
●問題4-3 if( !n ) はJava言語の文法として正しいですか?( n は int 型変数)
○答え 正しくない。コンパイルエラー。
○コンパイル
■D:\atsushi\Java\List4-3> javac Kasa3.java
Kasa3.java:11: 演算子 ! は int に適用できません。
if(!n){
^
エラー 1 個
○解説
! 演算子は論理の反転を意味します(「演算子と優先順位」参照)。
このエラーメッセージを見る限り、boolean 型にしか適用できない可能性が大ですね。