第
3
章
プログラムの
流れの分岐
本章では、数多くの演算子とともに、プログラムの流れを選択的に決 定するためのif文とswitch文を学習します。 if文 switch文 break文 式文と空文 ブロック アルゴリズム 演算子の優先順位と結合性 式と評価 キーワードと識別子実行例 整数値:-10 Ÿ その値は負です。 問題3-1 整数値を読み込んで、値が負であれば『その値は負です。』と表示するプログラムを作成せよ。 if文(その1:if-then文) 読 込 整数値
0
小 『 値 負 。』 表示 。 読 込 値 変数n
格納 。 値 判定 網 部 if 文(if statement) 呼 、 構文(文法上 構造) 、次 。if (
式)
文 、if
文 一種 if-then文 。先頭i
イf
フ 『 ∼』 意味 。 式 値 調 、 値 《真》 文 実行 。 、本書 、( )
内 書 条件判定 式 制御式 呼 。if
文 制御式n
< 0
利用<
、左 右 小true
(真) 、false
(偽) 生成 演算子 。▼ trueとfalseは、論理値リテラル(boolean literal)と呼ばれる論理(boolean)型のリテラル です。これらの詳細は、第 5 章で学習します。
if
文 流 表 フローチャート(p.131) Fig.3-1 。 実行例 整数値:35 Ÿ Fig.3-1 プログラムNegativeのif文のフローチャート nは0より小さい 『その値は負です。』と表示 No Yes nが0より小さいときにのみ実行される。 if-then文:if (式) 文 n < 0がtrueのときに実行される // 読み込んだ整数値は負の値か? import java.util.Scanner; class Negative {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("整数値:"); int n = stdIn.nextInt(); if (n < 0) System.out.println("その値は負です。"); } }
プ ロ グ ラ ム の 流 れ の 分 岐
3
実行例 、n
0
小 、制御式 値true
。 、 以下 文 実行 、『 値 負 。』 表示 。 System.out.println("その値は負です。"); 、実行例 示 、n
入力 値0
以上 、 文 実行 。画面 何 表示 。 関係演算子 演算子<
、 大小関係 判定 演算子 、関係演算子(relational operator) 呼 。関係演算子 、Table 3-1 示 4 種類 。<=
演算子>=
演算子 等号 左側=<
=>
、<
=
間 入< =
。間違 注 意 。 Table 3-1 関係演算子 x < y xがyより小さければtrueを、そうでなければfalseを生成。 x > y xがyより大きければtrueを、そうでなければfalseを生成。 x <= y xがyより小さいか等しければtrueを、そうでなければfalseを生成。 x >= y xがyより大きいか等しければtrueを、そうでなければfalseを生成。 if文の構文図if
文 、本問 学習if-then
文 他 、次問 学習if-then-else
文 。if
文 構文図 Fig.3-2 示 。 if ( 式 ) 文 else 文 if文 Fig.3-2 if文の構文図 構文図 読 、矢印 方向 進 。左端 、 右端 。分岐点 、 進 構 。 ★ 分岐点 、if
文 構文図 左端 右端 、以下 二 。 if ( 式 ) 文 … if-then文 if ( 式 ) 文 else 文 … if-then-else文if
文 形式 構文 表 。 ★実行例 整数値:62 Ÿ その絶対値は62です。 問題3-2 整数値を読み込んで、その絶対値を求めて表示するプログラムを作成せよ。 if文(その2:if-then-else文) 絶対値 、数値 大 、
0
離 表 値 。 、5
-5
大5
、 絶対値5
。変数n
絶対値 、n
0
以上n
、n
負n
符号 反転-n
。n
0
以上 異 処理 行 、Absolute1
if
文 利用 。 、 構文 、前問 異 、以下 。if (
式)
文else
文 形式if
文 、if-then-else 文 呼 。e
エ ル スlse
『∼ 』 意味 。制御式 値true
先頭側 文 実行 、false
末尾 側 文 実行 。 流 Fig.3-3 、n
0
以上 異 処理 行 。 実行例 整数値:-35 Ÿ その絶対値は35です。 if-then-else文:if (式) 文 else 文 // 読み込んだ整数値の絶対値を表示(その1) import java.util.Scanner; class Absolute1 {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("整数値:"); int n = stdIn.nextInt(); if (n >= 0) System.out.println("その絶対値は" + n + "です。"); else System.out.println("その絶対値は" + (-n) + "です。"); } } // 読み込んだ整数値の絶対値を表示(その2) import java.util.Scanner; class Absolute2 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("整数値:"); int n = stdIn.nextInt(); int abs; if (n >= 0) abs = n; else abs = -n; System.out.println("その絶対値は" + abs + "です。"); } } n >= 0がtrueのときに実行される n >= 0がfalseのときに実行される
プ ロ グ ラ ム の 流 れ の 分 岐
3
Fig.3-4 空文の構文図Absolute2
if-then-else
文 利用 解答例 。n
絶対値 変数abs
入 、 表示 行 。変数 1 個増 、表示 行 文 一 点 優 。 表示 『 絶対値 …』 、『 値 絶対値 …』 変更 考 。
Absolute1
2箇所 変更 必要 、Absolute2
1箇所 変更 。 * 前問if-then
文 、本問if-then-else
文 、 流 二4 4 4分岐 。 前問 、変数n
値0
以上 行else
部 。 、Fig.3-1(p.44) 見 分 、 流 、◇部 二 分岐 。前問if-then
文 、以 下 示if-then-else
文 実現 。 Fig.3-3 プログラムAbsolute1のif文のフローチャート nは0以上 絶対値としてnの値を表示 No Yes 絶対値として-nの値を表示 いずれか一方が実行される。 空文 前章 、文 末尾 原則 学習 。上 示if
文中 網 部 、単独 文 。文 、空文(empty statement) 呼 (構文図 Fig.3-4)。
、空文 実行 、何 行 。 ; 空文 if (n < 0) System.out.println("その値は負です。"); else ;
問題3-3 二つの正の整数値を読み込んで、後者が前者の約数であれば『BはAの約数です。』と表示し、 そうでなければ『BはAの約数ではありません。』と表示するプログラムを作成せよ。 // 読み込んだ整数値は約数であるかどうか(等価演算子) import java.util.Scanner; class Measure1 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("変数A:"); int a = stdIn.nextInt(); System.out.print("変数B:"); int b = stdIn.nextInt(); if (a % b == 0) System.out.println("BはAの約数です。"); else System.out.println("BはAの約数ではありません。"); } } 等価演算子 変数
b
変数a
約数 、a
b
割 余0
判 断 。 、4
12
約数 (12
4
割 余0
) 、5
12
約数 (12
5
割 余2
)。 *if
文 制御式 利用==
、左右 等 判断 演算子 。 演算子==
、 等 判断!=
演算子等価演算子(equality operator) 呼 (Table 3-2)。両演算子 、条件 成立
true
生成 、成立false
生成 。 実行例 変数A:12 Ÿ 変数B:4 Ÿ BはAの約数です。 Table 3-2 等価演算子 x == y xとyが等しければtrueを、そうでなければfalseを生成。 x != y xとyが等しくなければtrueを、そうでなければfalseを生成。 、!=
演算子 用 、本if
文 以下 実現 。二 文 順序 入 注意 。 if (a % b != 0) System.out.println("BはAの約数ではありません。"); else System.out.println("BはAの約数です。");プ ロ グ ラ ム の 流 れ の 分 岐
3
論理補数演算子単項演算子
!
、論理補数演算子(logical complement operator) 呼 、値
false
true
生成 、true
false
生成 (Table 3-3)。本
if
文 判定 、以下 行 。▪
a
% b
0
:a
% b == 0
true
。 、!(a % b == 0)
false
。 ▪a
% b
0
:a
% b == 0
false
。 、!(a % b == 0)
true
。問題3-4
前問のプログラムを論理補数演算子!を用いて書きかえよ。
// 読み込んだ整数値は約数であるかどうか(論理補数演算子)
import java.util.Scanner; class Measure2 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("変数A:"); int a = stdIn.nextInt(); System.out.print("変数B:"); int b = stdIn.nextInt(); if (!(a % b == 0)) System.out.println("BはAの約数ではありません。"); else System.out.println("BはAの約数です。"); } } 実行例 変数A:12 Ÿ 変数B:5 Ÿ BはAの約数ではありません。 Table 3-3 論理補数演算子
!x xがfalseであればtrueを、trueであればfalseを生成。
関係演算子 等価演算子 2 項演算子 注意 。 、 『変数
a
値1
以上3
以下 』 1 <= a <= 3 // 駄目! 判定 。p.58 学習 論理積演算子&&
用 a >= 1 && a <= 3 // OK!(aは1以上 かつaは3以下 によって判定) 判定 。 、 『変数a
変数b
変数c
値 等 』 a == b == c // 駄目! 判定 。論理積演算子&&
用 a == b && b == c // OK!(aはbと等しい かつbはcと等しい によって判定) 判定 。 、 a == b && a == c // OK!(aはbと等しい かつaはcと等しい によって判定) 判定 。問題3-5 キーボードから読み込んだ整数値の符号を判定して表示するプログラムを作成せよ。 入れ子となったif文 読 込 整数値 符号(正 /負 /
0
) 判 定 表示 。 既 学習 、if
文 、以下 示 二 形式 。 if ( 式 ) 文 if ( 式 ) 文 else 文else if
… 、 構文 特別 用意 。if
文 名前 『一種 』文 、else
制御 文 、 当然if
文 。 網 部 構造 Fig.3-5 示 。if
文 中if
文 入 《入 子》 構造 分 。 ▼ 図では System.out. を省略しています(p.54 の Fig.3-7 なども同様です)。 実行例 整数値:37 Ÿ その値は正です。 実行例 整数値:0 Ÿ その値は0です。 実行例 整数値:-35 Ÿ その値は負です。 Fig.3-5 プログラムSignのif文(入れ子となったif文) if (n > 0) 文 else 文 println("その値は負です。"); println("その値は0です。"); println("その値は正です。"); if (n < 0) 文 else 文 // 読み込んだ整数値の符号(正/負/0)を判定して表示 import java.util.Scanner; class Sign {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("整数値:"); int n = stdIn.nextInt(); if (n > 0) System.out.println("その値は正です。"); else if (n < 0) System.out.println("その値は負です。"); else System.out.println("その値は0です。"); } }
プ ロ グ ラ ム の 流 れ の 分 岐
3
▶ 問題3-6 『明解Java入門編』 演習3-2(p.59) 前問のプログラムの最後のelseを、else if (n == 0)に変更したらどうなるかを検討せよ。 if文とプログラムの流れの分岐 前問if
文 以下 書 検討 問題 。 追加 網 部 流 到達 、n
> 0
n
< 0
判定 両方false
、 、n
0
等 。 、 実行 、変更前 同 結果 得 。 、n
等 分 文脈 、n
0
等 判定 、明 無駄 。 、 実験 。if
文 以下 書 作 。n
値1
、2
、3
実行 。 、if
文 網 部 削 検討 。 構文if (
式)
文else if (
式)
文else
文 。 、 流 三 分岐 前問if
文 同 形式 。 、実行 様子 異 。n
値4
5
-10
、1
2
以外 値 実行 。 、網 部 削 前、以下
if
文 同 働 。 リスト1 流 、実質的 四 分岐 。前問Sign
if
文 構造 異 、網 部 削 。 * 最後else
後 、本当 必要if (
…)
置 分 。 if (n == 1) System.out.println("それは1です。"); else if (n == 2) System.out.println("それは2です。"); else if (n == 3) System.out.println("それは3です。"); if (n == 1) System.out.println("それは1です。"); else if (n == 2) System.out.println("それは2です。"); else if (n == 3) System.out.println("それは3です。"); else ; if (n > 0) System.out.println("その値は正です。"); else if (n < 0) System.out.println("その値は負です。"); else if (n == 0) System.out.println("その値は0です。"); リスト1問題3-7 二つの変数a, bに値を読み込んで、その大小関係を以下のいずれかで表示するプログラムを作 成せよ。 『aのほうが大きいです。』『bのほうが大きいです。』『aとbは同じ値です。』 // 読み込んだ二つの整数値の大小関係を表示 import java.util.Scanner; class Balance {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("変数a:"); int a = stdIn.nextInt(); System.out.print("変数b:"); int b = stdIn.nextInt(); if (a > b) System.out.println("aのほうが大きいです。"); else if (a < b) System.out.println("bのほうが大きいです。"); else System.out.println("aとbは同じ値です。"); } } 二値の大小関係 二 変数
a
b
大小関係 判定 。前問 同様 、入 子if
文 利用 。if
文 示 、Fig.3-6 。『a
大 。』『b
大 。』『a
b
同 値 。』 一 表示 。 ▼ すなわち、三つのメッセージのどれも表示されない、あるいは、二つ以上が表示される、と いうことはありません。 実行例 変数a:12 Ÿ 変数b:3 Ÿ aのほうが大きいです。 実行例 変数a:5 Ÿ 変数b:15 Ÿ bのほうが大きいです。 aはbより大きい 『aのほうが大きいです。』と表示 No Yes 『bのほうが大きいです。』と表示 aはbより小さい No Yes 『aとbは同じ値です。』と表示 Fig.3-6 プログラムBalanceのif文のフローチャートプ ロ グ ラ ム の 流 れ の 分 岐
3
// 読み込んだ二つの整数値の大小関係を表示(誤り) import java.util.Scanner; class BalanceWrong {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("変数a:"); int a = stdIn.nextInt(); System.out.print("変数b:"); int b = stdIn.nextInt(); int diff = a - b; if (diff > 0) System.out.println("aのほうが大きいです。"); else if (diff < 0) System.out.println("bのほうが大きいです。"); else System.out.println("aとbは同じ値です。"); } } 実行例 変数a:-2147483648 Ÿ 変数b:1 Ÿ aのほうが大きいです。
BalanceWrong
、変数a
b
引 値diff
入 、 値0
大 、小 、等 、二 変数 大小関係 判断 。 ▼ このように書かれたプログラムを、時おり見かけます。 、 、変数a
b
値 、期待 動作 場合 動 作 場合 。実際 、 示 二 実行例 期待 結果 。2147483647
-1
大 判断 、1
-2147483648
大 判断 。 結果 、無限 数 表 現実 世界 異 、 世 界 有限 数値 表 。 前章 学習 、int
型 扱 数値-2147483648
∼+2147483647
。 示 実行例 、2147483647
-1
引 値 、-2147483648
1
引 値 、int
型 表現範囲 超 。 、正 判断 行 。 実行例 変数a:2147483647 Ÿ 変数b:-1 Ÿ bのほうが大きいです。Fig.3-7 プログラムGoInto5のif文(入れ子となったif文) 問題3-8 正の整数値を読み込んで、それが5で割り切れれば『その値は5で割り切れます。』と表示し、 そうでなければ『その値は5で割り切れません。』と表示するプログラムを作成せよ。 ※正でない値を読み込んだ場合は、『正でない値が入力されました。』と表示すること。 // 読み込んだ整数値が正であれば5で割り切れるかどうかを表示 import java.util.Scanner; class GoInto5 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("整数値:"); int n = stdIn.nextInt(); if (n > 0) if (n % 5 == 0) System.out.println("その値は5で割り切れます。"); else System.out.println("その値は5で割り切れません。"); else System.out.println("正でない値が入力されました。"); } } 実行例 整数値:35 Ÿ その値は5で割り切れます。 実行例 整数値:36 Ÿ その値は5で割り切れません。 入れ子となったif文 読 込 整数値 正
5
割 切 表示 、 『正 値 入力 。』 表示 。 本if
文 構造 示 、Fig.3-7 。if
文 中if
文 入 構造 。 、前々問 前問if
文 構造 違 。if
文 Fig.3-8 示 。『 値 5 割 切 。』『 値 5 割 切 。』『正 値 入力 。』 一 表示 。 ▼ このフローチャートの最初の判定から分岐する Yes と No は、前問の Fig.3-6(p.52) と逆4であることに注意しましょう。 if (n > 0) 文 else 文 println("…5で割り切れます。"); println("…5で割り切れません。"); if (n % 5 == 0) 文 else 文 println("正でない値が入力されました。");プ ロ グ ラ ム の 流 れ の 分 岐
3
Fig.3-8 プログラムGoInto5のif文のフローチャート nは0より大きい 『正でない値が … 。』と表示 Yes No 『…5で割り切れます。』と表示 nは5で割り切れる No Yes 『…5で割り切れません。』と表示 式 、式(expression) 用語 何度 使 。式 、以下 総称 。▪変数
▪
▪変数 演算子 結合 以下 式 例 考 。
abc
+ 32
変数abc
、整数32
、+
演算子 結abc
+ 32
式 。 次 、以下 式 考 。xyz
= abc + 32
、
xyz, abc, 32, abc
+ 32, xyz = abc + 32
式 。一般 、○○演算子 結合 式 、○○式 呼 。 、
代入4 4演算子
xyz
abc
+ 32
結 付 式xyz
= abc + 32
、代入4 4式 (assignment expression) 。 式文 第 1 章 学習 、文 末尾 原則;
必要 。 、 代入式a
= c + 32
付 文 。 、式4 付 文4 、Fig.3-9 構文 式文(expression statement) 。 Fig.3-9 式文の構文図 ; 式文 式Fig.3-10 式と評価 問題3-9 正の整数値を読み込んで、それが10の倍数であれば『その値は10の倍数です。』と表示し、そ うでなければ『その値は10の倍数ではありません。』と表示するプログラムを作成せよ。 ※正でない値を読み込んだ場合は、『正でない値が入力されました。』と表示すること。 // 読み込んだ整数値が正であれば10の倍数であるかどうかを表示 import java.util.Scanner; class MultipleOf10 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("整数値:"); int n = stdIn.nextInt(); if (n > 0) if (n % 10 == 0) System.out.println("その値は10の倍数です。"); else System.out.println("その値は10の倍数ではありません。"); else System.out.println("正でない値が入力されました。"); } } 実行例 整数値:1250 Ÿ その値は10の倍数です。 実行例 整数値:1254 Ÿ その値は10の倍数ではありません。 式の評価 構造 、前問 基本的 同 。
10
倍数 判定 、10
割 切 行 。 * 式 、基本的 値 。 値 、 実行時 調 。式 値 調 評価(evaluation) 。 評価 具体例 示 Fig.3-10 。 図 、int
型 変数n
値1254
場合 例 。 、n, 10, n
% 10
式 。 変数n
値1254
、 式 評価 値1254, 10, 4
。 、三 値 型int
型 。 、本書 、 温度計 図 評価値 示 。左 側 小 文字 《型》 、右側 大 文字 《値》 。 int 4 int 10 int 1254 n % 10 型 値 プログラム実行時に、 式は評価される。 式を評価すると、型と 値が得られる。プ ロ グ ラ ム の 流 れ の 分 岐
3
▶ 問題3-10 『明解Java入門編』 演習3-7(p.61) 正の整数値を読み込んで、それを3で割った値に応じて『その値は3で割り切れます。』『その値 を3で割った余りは1です。』『その値を3で割った余りは2です。』のいずれかを表示するプログ ラムを作成せよ。 ※正でない値を読み込んだ場合は、『正でない値が入力されました。』と表示すること。 // 読み込んだ整数値が正であれば3で割った剰余を表示 import java.util.Scanner; class Modulo3 {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("整数値:"); int n = stdIn.nextInt(); if (n > 0) if (n % 3 == 0) System.out.println("その値は3で割り切れます。"); else if (n % 3 == 1) System.out.println("その値を3で割った余りは1です。"); else System.out.println("その値を3で割った余りは2です。"); else System.out.println("正でない値が入力されました。"); } } 実行例 整数値:1251 Ÿ その値は3で割り切れます。 実行例 整数値:1253 Ÿ その値を3で割った余りは2です。 入れ子となったif文 本
if
文 、前問if
文 少 複雑 、 理解 。 ▼ if文の中に入っているif文の中にif文が入る、という構造となっています。 誤って置かれた空文 以下 見 。n
値 正 『 値 正 。』 表示 。 if (n > 0); System.out.println("その値は正です。"); if (n > 0) ; // if文:n > 0であれば空文を実行( 何もしない ) System.out.println("その値は正です。"); // if文とは無関係に実行される式文 、 実行 、n
値 『 値 正 。』 表示 。 原因 、(n
> 0)
後 置 空文;
(p.47) 。 上 、単一if
文 、以下 解釈 。if
文 条件( )
後 、誤 空文 置 注意 。問題3-11 キーボードから読み込んだ点数に応じて、優/良/可/不可を判定して表示するプログラムを作 成せよ。判定は以下のように行うこと。 0∼59 → 不可 / 60∼69 → 可 / 70∼79 → 良 / 80∼100 → 優 // 点数をもとに成績を判定(その1:論理積演算子&&を利用) import java.util.Scanner; class Grade1 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("点数:");
int point = stdIn.nextInt(); if (point >= 0 && point <= 59)
System.out.println("不可"); else if (point >= 60 && point <= 69)
System.out.println("可");
else if (point >= 70 && point <= 79) System.out.println("良");
else if (point >= 80 && point <= 100) System.out.println("優"); else System.out.println("不正な点数です。"); } } 論理積演算子&& 読 込 点数 応 判定結果(不可/可/良/優) 表示 。 点数 《不可》 判断 行 、網 部 制御式 。 式 利用
&&
演算子 、Fig.3-11 示 《論理積》 演算 行 論理積 演算子(logical and operator) 。 演算子 用 式x
&& y
評価 、x
y
true
true
得 、false
得 。日本語 『x
y
』 考 (Table 3-4:次 )。 本 網 部 制御式true
評価 、point
0
以上 4 459
以下 。 、《可》《良》《優》 関 、&&
演算子 同様 判定 行 。 実行例 点数:68 Ÿ 可 実行例 点数:89 Ÿ 優 実行例 点数:102 Ÿ 不正な点数です。 論理積 x y x && y true true true true false false false true false false false false論理和
x y x || y
true true true true false true false true true false false false
両方とも真であれば真 一方でも真であれば真
プ ロ グ ラ ム の 流 れ の 分 岐
3
// 点数をもとに成績を判定(その2:論理和演算子||を利用) import java.util.Scanner; class Grade2 {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("点数:");
int point = stdIn.nextInt(); if (point < 0 || point > 100) System.out.println("不正な点数です。"); else if (point <= 59) System.out.println("不可"); else if (point <= 69) System.out.println("可"); else if (point <= 79) System.out.println("良"); else System.out.println("優"); } } 論理和演算子¦¦
Grade2
、《論理和》 求 論理和演算子(logical or operator) 利用実現 。 表 示 、式
x
|| y
評価 、x
y
一方true
true
得 、false
得 。日本語 『x
y
』 近 。 ▼ 『僕または彼が行くよ。』といった場合、 僕 か 彼 のいずれか一方のみ4 4というニュアンスで すが、||演算子は、どちらか一方でも4 4という意味であることに注意しましょう。なお、||は小 文字のl(エル)ではなく、縦線記号です。 網 部 制御式 、point
0
点未満4 4 4100
点 超true
評価 、 結果『不正 点数 。』 表示 。 、 流 到達 、point
0
以上100
以下 場合 。不可 判定 、0
点以上 判定 不要 、59
点以下 調 。 、 流 到達 、point
60
以上100
以下 場合 。 、60
点以上 判定 必要 、69
点以下 調 ( 同様 )。Grade2
、論理演算子 利用 最初 1 回 、 以 降 制御式 単純 点 、Grade1
優 。 Table 3-4 論理積演算子と論理和演算子x && y xとyの両方ともtrueであればtrueを、そうでなければfalseを生成。
x || y xとyの一方でもtrueであればtrueを、そうでなければfalseを生成。 ▼ これらの演算子は短絡評価を行います(p.61)。
pointは0∼100 pointは60∼100
pointは70∼100 pointは80∼100
Fig.3-12 条件式の評価 問題3-12 二つの実数値を読み込んで、大きいほうの値を表示するプログラムを作成せよ。 // 読み込んだ二つの実数値の大きいほうの値を表示(その1:if文) import java.util.Scanner; class Max2A {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("実数a:"); double a = stdIn.nextDouble(); System.out.print("実数b:"); double b = stdIn.nextDouble(); double max; // 大きいほうの値 if (a > b) max = a; else max = b; System.out.println("大きいほうの値は" + max + "です。"); } } 条件演算子 二 値 読 込 大 値 表示 。変数
a, b
読 込 値 比較 、a
b
大 変数max
a
代入 、 変数max
b
代入 。 結果、if
文 実行 終了 、変数max
大 値 入 。 * 右Max2B
、if
文 用 実現 。網 部 利用? :
、右 Table 3-5 示 条件演算子(conditional operator) 。演算子 用 条件式(conditional expression) 評価 様子 Fig.3-12 。変数
max
入 、a
b
大a
値、b
値 。 条件式 、if
文 凝縮 、Java 好 使 。 実行例 実数a:25.7 Ÿ 実数b:15.3 Ÿ 大きいほうの値は25.7です。 条件式 式1 ? 式2 : 式3 の評価によって得られる値は、以下のようになる。 まず式1を評価。その値が trueであれば、式2を評価した値となる。 falseであれば、式3を評価した値となる。 double 25.7 a > b ? a : b aが25.7でbが15.3のとき aが2.2でbが3.14のとき double 3.14 a > b ? a : bプ ロ グ ラ ム の 流 れ の 分 岐
3
// 読み込んだ二つの実数値の大きいほうの値を表示(その2:条件演算子) import java.util.Scanner; class Max2B {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("実数a:"); double a = stdIn.nextDouble(); System.out.print("実数b:"); double b = stdIn.nextDouble(); double max = a > b ? a : b; // 大きいほうの値 System.out.println("大きいほうの値は" + max + "です。"); } } Table 3-5 条件演算子 x ? y : z xがtrueであればyを評価した値を、そうでなければzを評価した値を生成。 ▼ xを評価した値がtrueであればzは評価されませんし、falseであればyは評価されません。 、以下 、大 値 求 条件式
println
中 埋 込 、変 数max
使 。 System.out.println("大きいほうの値は" + (a > b ? a : b) + "です。"); ▼ 網かけ部を囲む( )を省略することはできません。その理由は p.79 で学習します。 短絡評価 前問Grade1
(p.58) 、変数point
-10
、最初if
文 制御式point
>= 0 && point <= 59
行 《不可》 判定 考 。左
point
>= 0
false
。 、右 式point
<= 59
調 式全体
false
( 《不可》 ) 自明 。 、&&
演算子 左 評価 値false
、右評価 行4 4 4 4 4 。
*
引 続 、
Grade2
(p.59) 最初 制御式point
< 0 || point > 100
着目 。
point
-10
、point
< 0
true
、右point
> 100
調 、式全体true
( 《不正 点数》 )分 。
、
||
演算子 左 評価 値true
、右 評価 行4 4 4 4 4 。
論理演算 式全体 評価結果 、左 評価 結果 明確 場合 、
右 評価 行 短絡評価(short circuit evaluation) 呼 。
▼ 演算子&&と||によく似た演算子として、演算子&と|があります。演算子&は論理積を求め、 演算子|は論理和を求めます。ただし、&と|による演算では、短絡評価 行 。その ため、&と|は、論理演算のために使われることは少なく、ビット単位の論理演算を行うために 用いられるのが一般的です。詳しくは、第 7 章で学習します。
問題3-13
二つの整数値を読み込んで、それらの値の差を表示するプログラムを作成せよ。
// 読み込んだ二つの整数値の差を表示(その1:if文)
import java.util.Scanner; class Diff2A {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt(); System.out.print("整数b:"); int b = stdIn.nextInt(); int diff; if (a >= b) diff = a - b; else diff = b - a; System.out.println("それらの差は" + diff + "です。"); } } // 読み込んだ二つの整数値の差を表示(その2:条件演算子) import java.util.Scanner; class Diff2B {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt(); System.out.print("整数b:"); int b = stdIn.nextInt(); int diff = a >= b ? a - b : b - a; System.out.println("それらの差は" + diff + "です。"); } } 実行例 整数a:12 Ÿ 整数b:3 Ÿ それらの差は9です。 実行例 整数a:3 Ÿ 整数b:12 Ÿ それらの差は9です。 二値の差 二 変数 差 、値 減算 結果 絶対値 求 。 、負 、
0
正 値 。Diff2A
if
文 用 実現 、Diff2B
条件演算子 用 実現 。 、以下 、差 求 条件式println
中 埋 込 、変数diff
使 。 System.out.println("それらの差は" + (a >= b ? a - b : b - a) + "です。");プ ロ グ ラ ム の 流 れ の 分 岐
3
▶ 問題3-14 『明解Java入門編』 演習3-11(p.71) 二つの整数値を読み込んで、それらの値の差が10以下であれば、『それらの差は10以下です。』 と表示し、そうでなければ『それらの差は11以上です。』と表示するプログラムを作成せよ。 // 読み込んだ二つの整数値の差が10以下かどうかを表示(その1) import java.util.Scanner; class Diff2digits1 {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("整数A:"); int a = stdIn.nextInt(); System.out.print("整数B:"); int b = stdIn.nextInt(); int diff = a >= b ? a - b : b - a; if (diff <= 10) System.out.println("それらの差は10以下です。"); else System.out.println("それらの差は11以上です。"); } } 実行例 整数A:12 Ÿ 整数B:3 Ÿ それらの差は10以下です。 実行例 整数A:35 Ÿ 整数B:23 Ÿ それらの差は11以上です。 // 読み込んだ二つの整数値の差が10以下かどうかを表示(その2) import java.util.Scanner; class Diff2digits2 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("整数A:"); int a = stdIn.nextInt(); System.out.print("整数B:"); int b = stdIn.nextInt(); int diff = a >= b ? a - b : b - a; System.out.println("それらの差は" + (diff <= 10 ? "10以下" : "11以上") + "です。"); } } 条件式を用いた文字列の連結 、二 変数
a
b
差 条件演算子 用 求 (左Diff2B
同 )。異 表示 実現法 。Diff2digits1
if
文 用 、Diff2digits2
条件演算子 用 。 条件演算子 慣 、Diff2digits2
、理解 。 、"
それらの差は"
"
です。"
部分 関 、以下 。 ▪ 1回 。 ▪他 文字列 変更 容易 。Fig.3-13 三値の最小値を求めるフローチャート 問題3-15 キーボードから読み込んだ三つの整数値の最小値を求めて表示するプログラムを作成せよ。 // 三つの整数値の最小値を求める import java.util.Scanner; class Min3 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt(); System.out.print("整数b:"); int b = stdIn.nextInt(); System.out.print("整数c:"); int c = stdIn.nextInt(); int min = a; if (b < min) min = b; if (c < min) min = c; System.out.println("最小値は" + min + "です。"); } } 三値の最小値 三 変数
a, b, c
整数値 読 込 、 最小値 求 表示 。 三値 最小値 求 手順 、以下 。min
a
値 初期化 。b
値min
小 、min
b
値 代入 。c
値min
小 、min
c
値 代入 。 《処理 流 》 定義 規則 アルゴリズム(algorithm) 呼 。三 値 最小値 求 表 Fig.3-13 。 実行例 整数a:3 Ÿ 整数b:1 Ÿ 整数c:2 Ÿ 最小値は1です。 b < min Yes No minにaを入れる minにbを入れる c < min Yes No minにcを入れる a > c > bである場合に通る経路プ ロ グ ラ ム の 流 れ の 分 岐
3
Fig.3-14 三値の最小値を求める過程での変数minの変化 実行例 、変数a, b, c
対3, 1, 2
入力 、 流 上 太 線経路 。 変数
min
、 Fig.3-14 示 変化 。 以外 値 想定 、 。 、変数a,
b, c
値 、1, 2, 3
3, 2, 1
、正 最小値 求 。 、 三 値5, 5, 5
等 、3, 1, 3
二 等 、正 最小値 求 。 int min = a; if (b < min) min = b; if (c < min) min = c; a = 3 b = 1 c = 2 min 3 ➡ 1 ➡ 1 a = 1 b = 2 c = 3 min 1 ➡ 1 ➡ 1 a = 3 b = 2 c = 1 min 3 ➡ 2 ➡ 1 a = 5 b = 5 c = 5 min 5 ➡ 5 ➡ 5 a = 3 b = 1 c = 3 min 3 ➡ 1 ➡ 1 『 』 用語 、JIS X0001 以下 定義 。 問題 解 、明確 定義 、順序付 有限個 規則 集合。 、 曖昧 記述 、変数 値 、問題 解 解 、正 。問題3-16 キーボードから読み込んだ三つの整数値の中央値を求めて表示するプログラムを作成せよ。 1, 2, 3の中央値は2で、3, 2, 3の中央値は3で、4, 4, 4の中央値は4である。 // 三つの整数値の中央値を求める import java.util.Scanner; class Med3 {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt(); System.out.print("整数b:"); int b = stdIn.nextInt(); System.out.print("整数c:"); int c = stdIn.nextInt(); int med; if (a >= b) if (b >= c) med = b; else if (a <= c) med = a; else med = c; else if (a > c) med = a; else if (b > c) med = c; else med = b; System.out.println("中央値は" + med + "です。"); } } 三値の中央値 三値 大小関係 組合 、Fig.3-15 示 図 列挙 ( 図 決定木 呼 )。 左端 枠 始 、 内 条件 成立 上側 実線 、成立 下側 点線 。 右端 内 示 、三 変数
a, b, c
大小関係 。全部 13 種類 。 、各枠 上 示 数値 、値 組合 一例 。 最大値・最小値 異 、中央値(median) 求 手続 、非常 複雑 ( 、何種類 考 )。Med3
一例 。 、 中央値med
代入 文,
,
…,
、Fig.3-15 対応 。 * 、以下 示 別解 。 実行例 整数a:152 Ÿ 整数b:324 Ÿ 整数c:75 Ÿ 中央値は152です。if ((b >= a && c <= a) || (b <= a && c >= a)) med = a;
else if ((a > b && c < b) || (a < b && c > b)) med = b;
else med = c;
プ ロ グ ラ ム の 流 れ の 分 岐
3
Fig.3-16 構文図 Fig.3-15 三値の大小関係の組合せ b>c a>b>c a>b=c a c a>c a>c>b a=c>b c>a>b a=b>c a=b=c 3 2 1 a b a>b b c a c b c a>c b c b>c>a b=c>a b>c c>a=b b>a>c b>a=c c>b>a b>c 3 2 2 3 2 1 3 3 2 3 2 1 3 3 2 3 3 3 3 2 2 3 2 1 3 2 2 3 2 1 3 3 2 3 2 1 Yes No 構文図の読み方 構文図 慣 、 、 具体例 理解 。 Fig.3-16 示 構文図 見 。 文 文 文 文先頭 末尾 行 終了 、分岐点 下 《文》 通 。
『0 個 文、 1個 文』 表 。
先頭 末尾 行 終了 同 。分岐点 下 《文》 通 先頭 戻 。戻 後 、末尾 行 終了 、再 分岐点 《文》 通 、 先頭 戻 。
『0 個以上 、任意 個数 文』 表 。
同 『0 個 文、 1個 文』 表 。
先頭 末尾 途中 《文》 。 、分岐点 下 先頭 戻 。 戻 後 、再 《文》 通過 終了 、再 分岐点 先頭 戻 。
『1 個以上 、任意 個数 文』 表 。
Fig.3-17 プログラムMinMaxEqのif文の構造 問題3-17 二つの整数値を読み込んで、小さいほうの値と大きいほうの値の両方を表示するプログラムを作 成せよ。二つの整数値が等しい場合は、『二つの値は同じです。』と表示すること。 ブロック 二 整数値 読 込 、小 値 大 値 両方 求 。値 等
a
== b
成立 場合 、『二 値 同 。』 表示 。 二 値 等 場合 実行 様子 Fig.3-17 考 。 実行例 整数a:12 Ÿ 整数b:3 Ÿ 小さいほうの値は3です。 大きいほうの値は12です。 実行例 整数a:17 Ÿ 整数b:17 Ÿ 二つの値は同じです。 if (式) 文 else { 宣言文 if文 式文 式文 } if (a == b) System.out.println("二つの値は同じです。"); else {int min, max; if (a < b) { min = a; max = b; } else { min = b; max = a; } System.out.println("小さいほうの値は" + min + "です。"); System.out.println("大きいほうの値は" + max + "です。"); } // 二つの整数値の小さいほうの値と大きいほうの値を求めて表示 import java.util.Scanner; class MinMaxEq {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt(); System.out.print("整数b:"); int b = stdIn.nextInt(); if (a == b)
System.out.println("二つの値は同じです。"); else {
int min, max; // 小さいほうの値/大きいほうの値
if (a < b) { // aがbより小さければ min = a; max = b; } else { min = b; max = a; } System.out.println("小さいほうの値は" + min + "です。"); System.out.println("大きいほうの値は" + max + "です。"); } } }
プ ロ グ ラ ム の 流 れ の 分 岐
3
図 網 部 、{ }
中 以下 文 入 構造 。▪変数 宣言 宣言文
▪大 値 小 値 求
if
文▪表示 行 式文 、文 並
{ }
囲 ブロック(block) 呼 。 Fig.3-18 、 構文図 。 、構文上 単一 文 。 Fig.3-18 ブロックの構文図 { 文 } ブロック 、if
文 構文 思 出 。以下 示 形式 。if (
式)
文if (
式)
文else
文 、if
文 制御 文 一4 4 4 4 4 4(else
以降 一4 4 4 4 4 4)。 、 本if
文 、 構文 。 単一 文 要求 箇所 、複数 文 実行 、 実現 。 先頭行 、変数min
max
宣言 。 中 宣言 変数 、 使 。換言 、 内 利用 変数 、 内 宣言 原則 。 * 中 置 内側if
文 、小 値 大 値 求 。if
文 、a
b
小 { min = a; max = b; } 実行 、 { min = b; max = a; } 実行 。if
文{ }
二 削除 実験 。if
文 部 、続 部 式文 。 後else
if
対 応 。 時 。 if文 式文 ➡ 理解不能if (a < b) min = a; max = b; else min = b; max = a; if ( 式 ) 文 式;
問題3-18 二つの整数値を読み込んで降順(大きい順)にソートするプログラムを作成せよ。 二値のソート 二 変数
a, b
整数値 読 込 、降順(大 順)、a b
ソートする(sort:並 ) 。 ▼ 本プログラムが行うのは、二値の『降順ソート』です。大きい順ではなくて、小さい順に並 べる手続きは、『昇順ソート』と呼ばれます。 手順 、以下 。▪
a
値b
小 …a
b
値 交換 。▪
… 何 ( )。
a
b
値 交換 行 、網 部 。 先頭行 、変数t
宣言 。 、二 変数 値 交換 必要 、作業用 変数 。 二値の交換 、 行 《二値 交換》 手順 、以下 。a
値t
保存 。b
値a
代入 。t
保存 最初a
値b
代入 。 三 、a
b
値 交換 完了 。 変数a
13
、変数b
57
交換 様子 示 Fig.3-19 。交換後 、a
57
b
13
。 実行例 変数a:13 Ÿ 変数b:57 Ÿ a≧bとなるようにソートしました。 変数aは57です。 変数bは13です。 // 二つの変数を降順(大きい順)にソート import java.util.Scanner; class Sort2Descending {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("変数a:"); int a = stdIn.nextInt(); System.out.print("変数b:"); int b = stdIn.nextInt(); if (a < b) { // aがbより小さければ int t = a; // それらの値を交換 a = b; b = t; } System.out.println("a≧bとなるようにソートしました。"); System.out.println("変数aは" + a + "です。"); System.out.println("変数bは" + b + "です。"); } }
プ ロ グ ラ ム の 流 れ の 分 岐
3
Fig.3-19 二値の交換手順 交換後-t
13 57 13 57 57 13 57 13 13t
= a;
a
= b;
b
= t;
a b t 13 57a
b
交換前 if文の構文に関する補足 if (a == 1) if (b == 1) 文1 else 文2 if (a == 1) if (b == 1) 文1 else 文2 aが1のときに実行される文(if文) if (a == 1) { if (b == 1) 文1 } else 文2 aが1のときに実行される文(ブロック) aが1でないときに実行される文 右 示if
文 見 。if
文 、文1 文2 実行 、 条件 。 二 文 実行 条件 、下表 示 《条件1》 、 感 。 条件1 文 実行される条件 文1 aが1でありbも1であるとき 文2 aが1でないとき 、 。if
文else
、最 近if
対応 。 、上if
文else
、if (a == 1)
対応 、if (b == 1)
対応 。 《条件1》 基 二 文 実行 必要 場合 、 導入 、以下 実現 。 条件2 文 実行される条件 文1 aが1でありbも1であるとき 文2 aが1でありbが1でないときif
文 『嘘 』、 。以下 記 述 。 紛 。 二 文 実行 条件 、表 《条件2》 明確 。a
値1
、何 実行 注意 。問題3-19 三つの整数値を読み込んで昇順(小さい順)にソートするプログラムを作成せよ。 三値のソート 三 変数
a, b, c
昇順 。 三値 、三if
文 行 。 原理 示 、Fig.3-20 。a,
b, c
5, 3, 2
格納 、 手順 理解 。 ▼ 三つのif文が実行する各ブロック内で変数tが宣言されています。ブロック内で宣言された 変数は、そのブロックに所属する特有のものであって、その名前もブロック内でのみ通用しま す(p.69)ので、三つの変数tの名前が衝突することはありません。a
b
値 比 。小 順 並 、 左側a
右側b
大 話 。 、 値 交換 。2番目
if
文 、b
c
対 同 操作 行 。 、左側b
右側c
大 、 値 交換 。2段階 手続 、最 大 値
c
格納 。 、 右側 図 示 「 」 。 図 照 合 、最初 二if
文 最強(最大) 値c
格納 分 。 最大値c
格納 、次 行 、残 二値a, b
最大値b
格納 。 、第2位 決定 「敗者復活戦」 。if
文 実行例 変数a:53 Ÿ 変数b:35 Ÿ 変数c:42 Ÿ a≦b≦cとなるように ソートしました。 変数aは35です。 変数bは42です。 変数cは53です。 // 三つの変数を昇順(小さい順)にソート import java.util.Scanner; class Sort3 {public static void main(String[] args) { Scanner stdIn = new Scanner(System.in);
System.out.print("変数a:"); int a = stdIn.nextInt(); System.out.print("変数b:"); int b = stdIn.nextInt(); System.out.print("変数c:"); int c = stdIn.nextInt(); if (a > b) { // aがbより大きければaとbを交換 int t = a; a = b; b = t; } if (b > c) { // bがcより大きければbとcを交換 int t = b; b = c; c = t; } if (a > b) { // aがbより大きければaとbを交換 int t = a; a = b; b = t; } System.out.println("a≦b≦cとなるようにソートしました。"); System.out.println("変数aは" + a + "です。"); System.out.println("変数bは" + b + "です。"); System.out.println("変数cは" + c + "です。"); } }
プ ロ グ ラ ム の 流 れ の 分 岐
3
Fig.3-20 三値のソート(その1) 5 3 2 a b c 3 5 2 3 2 5 2 3 5 5 3 2 if (a > b) aとbを交換 if (b > c) bとcを交換 if (a > b) aとbを交換 a b c 実行 、a
b
大 値b
格納 。最大値
c
格納 、2番目 大 値b
格納 、a
当 然最小値 格納 。 完了 。 * 別 数値 組合 手順 示 、Fig.3-21 。 前 変数a,
b, c
値5, 3, 4
。 、a
> b
成立 、交換 行 。 Fig.3-21 三値のソート(その2) 5 3 4 a b c 3 5 4 3 4 5 3 4 5 5 3 4 if (a > b) aとbを交換 if (b > c) bとcを交換 if (a > b) aとbを交換 a b c ▼ ここに示したソートの手順は、単純交換ソート(バブルソート)と呼ばれるソートアルゴリ ズムを、ソート対象が3要素である場合に特化したものです。 ソートのアルゴリズムには、単純交換ソート、シェルソート、マージソート、クイックソー トなど、数多くのものが考案されています。これらのアルゴリズムについては、『明解 Java によ るアルゴリズムとデータ構造』で学習いただけます(巻末の広告をご覧ください)。問題3-20 0, 1, 2のいずれかの値の乱数を生成し、0であれば"グー"を、1であれば"チョキ"を、2であ れば"パー"を表示するプログラムを作成せよ。 // 生成した乱数に応じてジャンケンの手を表示 import java.util.Random; class FingerFlashing {
public static void main(String[] args) { Random rand = new Random();
System.out.print("コンピュータが生成した手:"); int hand = rand.nextInt(3); // 0∼2の乱数
switch (hand) {
case 0: System.out.println("グー"); break; case 1: System.out.println("チョキ"); break; case 2: System.out.println("パー"); break;
} } } switch文 生成 乱数 値 応 《手》 表示 。
0
"
グー"
、1
"
チョキ"
、2
"
パー"
表示 。本 、switch 文(switch statement) 処理 流 分岐 実現
。
switch
文 、 式 評価 値 流 複数 分岐 文 、 名 、《切替 》 。 ラベル 流switch
文 差 、( )
内 書 制御式 評価 行 。 、 結果 基 、switch
文内 流 移 決定 。 制御式hand
値1
、 流 case 1: 書 目印 一気 移 (case
1
間 空白 必要 )。 、 飛 先 示 目印 ラベル(label) 。 ▼ 異なるラベルが同じ値をもつことは許されません。また、ラベルの値は《定数》でなければ ならず、変数は許されません。 流 飛 後 、 後 置 文 順次実行 。 、hand
1
、 、以下 文 実行 (Fig.3-22)。 System.out.println("チョキ"); break文流 、break 文(break statement) 呼
break;
出会 、switch
文 実行 終了 。実行例
プ ロ グ ラ ム の 流 れ の 分 岐
3
Fig.3-22 switch文におけるプログラムの流れとbreak文の働き break 、『破 』『抜 出 』 意味 。break
文 実行 、 流 、 囲switch
文 突 破 抜 出 。 、hand
値1
、画面"
チョキ"
表示 。 下 置"
パー"
表示 文 実行 。 、hand
0
"
グー"
表示 、2
"
パー"
表示 。 ▼ break文によって抜け出た後は、switch文の次に置かれた文が実行されます。本プログラムの 場合は、switch文の後ろには文がありませんので、プログラムの実行が終了します。 、hand
値0, 1, 2
以外 値 、一致 、switch
文 実質的 素通 (何 表示 )。 最後のcaseに置かれたbreak文case 2
見 。"
パー"
表示 後break
文 置 。 削除 動作 変 (break
文 、switch
文 終了 )。 、break
文 何 置 。 手 4 種類 増 、値3
「 」 追加 。switch
文 以下 変更 。 handが1のときのプログラムの流れ switch ( hand ) {case 0: System.out.println("グー"); break; case 1: System.out.println("チョキ"); break; case 2: System.out.println("パー"); break;
}
switch文を突き破って抜け出す!
switch (hand) {
case 0: System.out.println("グー"); break; case 1: System.out.println("チョキ"); break; case 2: System.out.println("パー"); break; case 3: System.out.println("プー"); break;
}
追加 点線部 。今回
switch
文 、case 2:
break
文 省略、 。
変更前
case 2:
break
文 、『 追加 伴必要
break
文 追加 忘 。』 犯 。最後break
、 追加 伴 変更 確実 容易問題3-21
月を1∼12の整数値として読み込んで、それに対応する季節を表示するプログラムを作成せよ。
// 読み込んだ月の季節を表示
import java.util.Scanner; class Season {
public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.print("何月ですか:"); int month = stdIn.nextInt(); switch (month) {
case 3 : case 4 :
case 5 : System.out.println("春"); break; case 6 :
case 7 :
case 8 : System.out.println("夏"); break; case 9 :
case 10 :
case 11 : System.out.println("秋"); break; case 12 :
case 1 :
case 2 : System.out.println("冬"); break;
default : System.out.println("そんな月はありません。"); break;
} } } defaultラベル 今回
switch
文 、前 default: 。分岐 制御式 評価 値 、case
一致 、 流 、default
飛 。 、break
文 箇所 、 流 次 文 落 。 、month
3
、4
、5
『春』 表示 。 本switch
文内 出現順序 変 、実行結果 変 。switch
文 使 、 順序 配慮 必要 。 選択文if
文switch
文 、 流 分岐 点 共通 。 二 文 選択文(selection statement) 呼 。 Fig.3-23 示switch
文 構文図 。( )
囲 判定 制御式 、 整数型 。▼ 具体的にはchar, byte, short, int, Character, Byte, Short, Integer, 列挙型のいずれか でなければなりません。実数や文字列は許されません。 実行例 何月ですか:6 Ÿ 夏 実行例 何月ですか:11 Ÿ 秋 実行例 何月ですか:13 Ÿ そんな月はありません。
プ ロ グ ラ ム の 流 れ の 分 岐