プログラミング基礎I(再) 山元進
Lesson 5 場合に応じた処理 条件演算子 if ( … ) { … } else { … } switch ( … ) { case … } ( … ) には条件を記述する式が入る
Java で扱う条件式 条件 とは 真/偽 が判定できるようなもの 条件の記述 条件 とは 真/偽 が判定できるようなもの 条件の記述 日常会話では 「英語の試験は良い成績だった」というような、あいまいな条件がありうる コンピュータはあいまいな判定条件をどうにか処理できるほど気が利かないので、確定的な条件を与える。 英語の点数を表す変数を a として a >= 80 a < 80
条件を記述する コンパイル時に判定できるような条件 他にも真/偽を判定するような演算子 (関係演算子) が色々ある cf. 表5-1 3 > 1 いつでも真な条件式 3 < 1 いつでも偽な条件式 他にも真/偽を判定するような演算子 (関係演算子) が色々ある cf. 表5-1
関係演算子を使う 5 > 3 評価すると true (真) 3 > 5 評価すると false(偽) a == 6 変数 a の値によって評価変わる a の値が 6 のときは true a の値が 6 ではない時は false a != 6 上の例と反対の関係 a の値が 6 のときは false a の値が 6 ではない時は true == と = (代入演算子) を混同するな
if 文 まず、もっとも簡単な構文から if ( 条件 ) { 条件成立時の処理 … } 注意: 条件成立時の処理が 1 文のときは {} で括る必要がない。しかし、ついていても構わないので、いつでも {} をつけておいた方が良い
Sample1.java (改) import java.io.*; class Sample1 { public static void main(String[] args) throws IOException System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); if (res == 1) {// 必ず {} でくくることを推奨 System.out.println("1が入力されました。"); } // 1 が入力されたとき上の行が実行される System.out.println("処理を終了します。"); }
Sample2.java import java.io.*; // 条件成立時に、複数の処理を行う class Sample2 { public static void main(String[] args) throws IOException System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); if (res == 1) {// 入力が 1 のとき、以下の複数の処理をする System.out.println("1が入力されました。"); System.out.println("1が選択されました。"); } System.out.println("処理を終了します。");
Sample2.java (正しくない例) import java.io.*; // 条件成立時に、複数の処理を行う class Sample2 { public static void main(String[] args) throws IOException System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); if (res == 1) // {} を外しても文法上は正しい。 System.out.println("1が入力されました。"); System.out.println("1が選択されました。"); // 入力が 1 でなくても"1が選択されました。"と出力される → バグ System.out.println("処理を終了します。"); } } // バグとは、プログラムの誤りのこと。
Sample2.java (正しくない例) の問題点 if(res == 1) System.out.println("1が入力されました。"); System.out.println("1が選択されました。"); 字下げ(インデンテーション)が正しくないので、プログラムのバグが見つけにくい 条件成立時に実行される文だけ字下げすべき
Sample3.java import java.io.*; //条件不成立のときの処理を指定する class Sample3 { public static void main(String[] args) throws IOException System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); if (res == 1) { System.out.println("1が入力されました。"); } else { System.out.println("1以外が入力されました。 "); }
Sample4.java import java.io.*; // 条件の判断を複数行う class Sample4 { public static void main(String[] args) throws IOException System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); if (res == 1) { System.out.println("1が入力されました。"); } else if (res == 2) { System.out.println("2が入力されました。 "); } else { System.out.println("1か2を入力してください。"); }
Sample5.java import java.io.*; // 条件の判断を複数行う switch 文 class Sample5 { public static void main(String[] args) throws IOException System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); switch (res) { case 1: System.out.println("1が入力されました。"); break; // この break; がないと、次の処理が継続して行われる case 2: System.out.println("2が入力されました。 "); break; // break; は switch 文を抜ける、という意味 default: // 今までの case に当てはまらない場合 System.out.println("1か2を入力してください。"); break; // この break は必要ない。 入れると style が統一されて良い。 }
Sample6.java import java.io.*; // 入力文字によって場合分けする class Sample6 { public static void main(String[] args) throws IOException System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); // 先頭の char を取り出すメソッド switch (res) { // () 内の式の値として String 型は許されない。 case 'a': // switch ( … ) の()内の値に対応して char 型のリテラル System.out.println("aが入力されました。"); break; case 'b': System.out.println("bが入力されました。 "); default: System.out.println("aかbを入力してください。"); break; // 最後なので、この break はなくても同じ動作をする。 }
論理演算子 A && B A || B ! A 論理演算子により複雑な条件を表現可能 数学でいうところの A かつ B に対応する A, B がともに true のとき true それ以外の場合 false A || B 数学でいうところの A または B に対応する A か B のどちらかが true のとき true どちらも false の場合 false ! A 数学でいうところの A の否定に対応する。単項演算子 A が false のとき true A が true のとき false 論理演算子により複雑な条件を表現可能 時間があり、かつ、金があれば …
Sample7.java import java.io.*; class Sample7 { public static void main(String[] args) throws IOException System.out.println("あなたは男性ですか?"); System.out.println("YまたはNを入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); if(res == 'Y' || res == 'y') { System.out.println("あなたは男性ですね。"); } else if(res == 'N' || res == 'n') { System.out.println("あなたは女性ですね。"); } else { }
条件演算子 3項演算子(オペランドが3つ) A ? B : C 条件式 A が true なら B, false なら C が値となる 例 (res == 1) ? 'A' : 'B' res の値が 1 なら char 型の 'A' が値となる。それ以外の場合 'B' が値。
Sample9.java import java.io.*; class Sample9 { public static void main(String[] args) throws IOException System.out.println("何番目のコースにしますか?"); System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); char ans = (res==1) ? 'A' : 'B' ; System.out.println(ans + "コースを選択しました。"); }
Sample9.java の説明 char ans = (res==1) ? 'A' : 'B' ; の部分は char ans; if(res==1){ ans = 'A'; } else { ans = 'B'; } とおなじこと。 条件演算子だと、6 行が 1 行で書けて便利。 (テキストの Sample8.java だと、 {} を省いてあるので 5 行になっている。)
Lesson 5 のまとめ 関係演算子を使って条件を作成できる if文を使って条件に応じた処理を行うことができる switch文を使って式の値に応じた処理を行うことができる 論理演算子を使って複雑な条件を作成できる 条件演算子?:を使って条件に応じた処理を簡単に記述できる
演習問題 整数を入力し、それが10未満であれば「入力された数は10未満の整数です。」と出力するプログラムを作成せよ。 整数を入力し、それが10未満であれば「入力された数は10未満の整数です。」と、10以上であれば「入力された数は10以上の整数です。」と出力するプログラムを作成せよ。 整数を入力し、それが0~9の範囲であれば「入力された数は1ケタの整数です。」と、10~99の範囲であれば「入力された数は2ケタの整数です。」と、100以上であれば「入力された数は3ケタ以上の整数です。」と出力するプログラムを、if 文とelse文を組み合わせて作成せよ。ただし、入力された整数が負の場合は、それ以上なにも出力せずに終了することとする。
演習問題 整数を入力し、それが0~9の範囲であれば「入力された数は0以上9以下の整数です。」と、10~19の範囲であれば「入力された数は10以上19以下の整数です。」と、20以上であれば「入力された数は20以上の整数です。」と出力するプログラムをswitch文を用いて作成せよ。3.同様、入力された整数が負ならば、それ以上なにも出力しないで終了することとする。 → 提出するのはReport4.javaのみ a=13の時,次の条件がtrueであるかfalseであるか答えよ。(TAのチェックを受けること) a>10 && a%2==1 a<10 || a%2==0 !(a==13)