<概要>多方向分岐を学びます。C言語、C++言語と一緒(笑)!
●例題5-1 三つの選択肢「1 , 2 , 3」の中から一つをキー入力により選んでもらうプログラム。
○答え
import java.io.*;
public class Drink1{
public static void main(String[] args){
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("飲み物は何が好きですか?");
System.out.println("1 オレンジジュース");
System.out.println("2 コーヒー");
System.out.println("3 どちらでもない");
System.out.println("1,2,3のどれかを選んで下さい。");
String line=reader.readLine();
int n=Integer.parseInt(line);
switch(n){
case 1:
System.out.println("オレンジジュースです。");
break;
case 2:
System.out.println("コーヒーです。");
break;
default:
System.out.println("どちらでもありません。");
break;
}
}catch(IOException e){
System.out.println(e);
}catch(NumberFormatException e){
System.out.println("数字の形式が正しくありません。");
}
}
}
○実行結果
D:\atsushi\Java\List5-1>java Drink1
飲み物は何が好きですか?
1 オレンジジュース
2 コーヒー
3 どちらでもない
1,2,3のどれかを選んで下さい。
1
オレンジジュースです。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --
D:\atsushi\Java\List5-1>java Drink1
飲み物は何が好きですか?
1 オレンジジュース
2 コーヒー
3 どちらでもない
1,2,3のどれかを選んで下さい。
123
どちらでもありません。
D:\atsushi\Java\List5-1>java Drink1
飲み物は何が好きですか?
1 オレンジジュース
2 コーヒー
3 どちらでもない
1,2,3のどれかを選んで下さい。
a
数字の形式が正しくありません。
D:\atsushi\Java\List5-1>
○解説
switch の後に書けるのは整数式、
case の後に書けるのは整数の定数式だけ。
ただし、long 型は(整数ですが)使えません。
double 型や String 型は整数ではありませんので、使えません。
C言語、C++言語と一緒ですね。
○補足
コンパイラは、switch の後、case の後にint 型を期待しています。
●例題5-2 三つの選択肢「a , b , c」の中から一つをキー入力により選んでもらうプログラム。
○答え
import java.io.*;
public class Drink2{
public static void main(String[] args){
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("飲み物は何が好きですか?");
System.out.println("a オレンジジュース");
System.out.println("b コーヒー");
System.out.println("c どちらでもない");
System.out.println("a,b,cのどれかを選んで下さい。");
String line=reader.readLine();
char c=line.charAt(0);
switch(c){
case 'a':
System.out.println("オレンジジュースです。");
break;
case 'b':
System.out.println("コーヒーです。");
break;
default:
System.out.println("どちらでもありません。");
break;
}
}catch(IOException e){
System.out.println(e);
}
}
}
○実行結果
D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。
b
コーヒーです。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --
D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。
2
どちらでもありません。
D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。
A
どちらでもありません。
D:\atsushi\Java\List5-2>
○解説
line.charAt(位置) メソッドは文字列 line の中の「位置」にある文字を取得します(最初の位置は
0 )。
char 型の定数は一重引用符でくくられた文字になります。
もし case a: と書いたなら
■D:\atsushi\Java\List5-2> javac Drink2.java
Drink2.java:15: シンボルを解決できません。
シンボル: 変数 a
場所 : Drink2 の クラス
case a:
^
エラー 1 個
このように変数と見なされてしまいます。
また、'a' と 'A' の値が違うのは言うまでもないでしょう。
○補足
'あ' 、 'い' 、 'う' なども char 型の定数です。
つまり、Unicode で扱える文字を一重引用符でくくったものは全て char 型の定数になります。
●例題5-3 三つの選択肢「1 or a , 2 or b , 3 or c」の中から一つをキー入力により選んでもらうプログラム。
○プログラム
import java.io.*;
public class Drink3{
public static void main(String[] args){
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("飲み物は何が好きですか?");
System.out.println("1 オレンジジュース(a)");
System.out.println("2 コーヒー(b)");
System.out.println("3 どちらでもない(c)");
System.out.println("1,2,3のどれかを選んで下さい(a,b,cでも選べます)。");
String line=reader.readLine();
char c=line.charAt(0);
switch(c){
case '1':
case 'a':
System.out.println("オレンジジュースです。");
break;
case '2':
case 'b':
System.out.println("コーヒーです。");
break;
default:
System.out.println("どちらでもありません。");
break;
}
}catch(IOException e){
System.out.println(e);
}
}
}
○実行結果
D:\atsushi\Java\List5-3>java Drink3
飲み物は何が好きですか?
1 オレンジジュース(a)
2 コーヒー(b)
3 どちらでもない(c)
1,2,3のどれかを選んで下さい(a,b,cでも選べます)。
1
オレンジジュースです。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --
D:\atsushi\Java\List5-3>java Drink3
飲み物は何が好きですか?
1 オレンジジュース(a)
2 コーヒー(b)
3 どちらでもない(c)
1,2,3のどれかを選んで下さい(a,b,cでも選べます)。
a
オレンジジュースです。
D:\atsushi\Java\List5-3>
○解説
switch 文の条件式となっているのは char 型の変数です。
つまり、Unicode 値(整数)で評価していることになります。
1 という Unicode 値をもつ文字はあるかも知れません。
しかし、それは 1 という文字ではないでしょう。
1 という文字を示す Unicode 値は '1' で取得できます。
あうーややこしい表現だー(笑)。
●例題5-4 問題5-2で一文字も入力せずにリターンキーを押したらどうなるでしょう?
○答え
D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 0
at java.lang.String.charAt(String.java:444)
at Drink2.main(Drink2.java:13)
-- Press any key to exit (Input "c" to continue) --
○解説
これは、charAt メソッドが最初の文字を取得しようとしたら、
最初の文字が無かった為に起こった例外( Exception )です。
「String index out of range: 0」は「0番目は文字列が存在する範囲を超えています」といったような意味です。
○解決策
char c=line.charAt(0);
を修正して、
char c;
if(line.length()>0){
c=line.charAt(0);
}else{
c='z';
}
とするか、
char c;
if(line.equals("")){
c='z';
}else{
c=line.charAt(0);
}
のようにして、空文字列だった場合は「c どちらでもない」が選択されたと見なせばよいでしょう。
length メソッドは文字列の長さを返します。
equal メソッドは引数に渡した文字列と自身が保存している文字列が
等しければ true を、等しくなければ false を返します。