• 検索結果がありません。

解きながら学ぶJava入門編

N/A
N/A
Protected

Academic year: 2021

シェア "解きながら学ぶJava入門編"

Copied!
43
0
0

読み込み中.... (全文を見る)

全文

(1)

3

プログラムの

流れの分岐

 本章では、数多くの演算子とともに、プログラムの流れを選択的に決 定するためのif文とswitch文を学習します。 if文 switch文 break文 式文と空文 ブロック アルゴリズム 演算子の優先順位と結合性 式と評価 キーワードと識別子

(2)

実行例 整数値:-10 Ÿ その値は負です。 問題3-1 整数値を読み込んで、値が負であれば『その値は負です。』と表示するプログラムを作成せよ。 if文(その1:if-then文) 読 込 整数値

0

小 『 値 負 。』 表示 。 読 込 値 変数

n

格納 。 値 判定 網 部 if 文(if statement) 呼 、 構文(文法上 構造) 、次 。

if (

)

if

文 一種 if-then文 。先頭

i

f

フ 『 ∼』 意味 。 式 値 調 、 値 《真》 文 実行 。 、本書 、

( )

内 書 条件判定 式 制御式 呼 。

if

文 制御式

n

< 0

利用

<

、左 右 小

true

(真) 、

false

(偽) 生成 演算子 。

truefalseは、論理値リテラル(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)

プ ロ グ ラ ム の 流 れ の 分 岐

3

実行例 、

n

0

小 、制御式 値

true

。 、 以下 文 実行 、『 値 負 。』 表示 。 System.out.println("その値は負です。"); 、実行例 示 、

n

入力 値

0

以上 、 文 実行 。画面 何 表示 。 関係演算子 演算子

<

、 大小関係 判定 演算子 、関係演算子(relational operator) 呼 。関係演算子 、Table 3-1 示 4 種類

<=

演算子

>=

演算子 等号 左側

=<

=>

<

=

間 入

< =

。間違 注 意 。   Table 3-1 関係演算子 x < y xyより小さければtrueを、そうでなければfalseを生成。 x > y xyより大きければtrueを、そうでなければfalseを生成。 x <= y xyより小さいか等しければtrueを、そうでなければfalseを生成。 x >= y xyより大きいか等しければtrueを、そうでなければfalseを生成。 if文の構文図

if

文 、本問 学習

if-then

文 他 、次問 学習

if-then-else

文 。

if

文 構文図 Fig.3-2 示if ()elseifFig.3-2 if文の構文図 構文図 読 、矢印 方向 進 。左端 、 右端 。分岐点 、 進 構 。 ★ 分岐点 、

if

文 構文図 左端 右端 、以下 二 。 if ( 式 ) if-thenif ( 式 ) 文 else 文 … if-then-else

if

文 形式 構文 表 。 ★

(4)

実行例 整数値: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のときに実行される

(5)

プ ロ グ ラ ム の 流 れ の 分 岐

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 ;

(6)

問題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 xyが等しければtrueを、そうでなければfalseを生成。 x != y xyが等しくなければtrueを、そうでなければfalseを生成。 、

!=

演算子 用 、本

if

文 以下 実現 。二 文 順序 入 注意 。 if (a % b != 0) System.out.println("BはAの約数ではありません。"); else System.out.println("BはAの約数です。");

(7)

プ ロ グ ラ ム の 流 れ の 分 岐

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 xfalseであれば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!(abと等しい かつbcと等しい によって判定) 判定 。 、 a == b && a == c // OK!(abと等しい かつacと等しい によって判定) 判定 。

(8)

問題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です。"); } }

(9)

プ ロ グ ラ ム の 流 れ の 分 岐

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

(10)

問題3-7 二つの変数a, bに値を読み込んで、その大小関係を以下のいずれかで表示するプログラムを作 成せよ。 『aのほうが大きいです。』『bのほうが大きいです。』『abは同じ値です。』 // 読み込んだ二つの整数値の大小関係を表示 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("abは同じ値です。"); } } 二値の大小関係 二 変数

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文のフローチャート

(11)

プ ロ グ ラ ム の 流 れ の 分 岐

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("abは同じ値です。"); } } 実行例 変数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のほうが大きいです。

(12)

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("正でない値が入力されました。");

(13)

プ ロ グ ラ ム の 流 れ の 分 岐

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 式文の構文図 ; 式文 式

(14)

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 型 値 プログラム実行時に、 式は評価される。 式を評価すると、型と 値が得られる。

(15)

プ ロ グ ラ ム の 流 れ の 分 岐

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

文 条件

( )

後 、誤 空文 置 注意 。

(16)

問題3-11 キーボードから読み込んだ点数に応じて、優/良/可/不可を判定して表示するプログラムを作 成せよ。判定は以下のように行うこと。 059 不可 6069 7079 80100 // 点数をもとに成績を判定(その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 4

59

以下 。 、《可》《良》《優》 関 、

&&

演算子 同様 判定 行 。 実行例 点数: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

両方とも真であれば真 一方でも真であれば真

(17)

プ ロ グ ラ ム の 流 れ の 分 岐

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 4

100

点 超

true

評価 、 結果『不正 点数 。』 表示 。 、 流 到達 、

point

0

以上

100

以下 場合 。不可 判定 、

0

点以上 判定 不要 、

59

点以下 調 。 、 流 到達 、

point

60

以上

100

以下 場合 。 、

60

点以上 判定 必要 、

69

点以下 調 ( 同様 )。

Grade2

、論理演算子 利用 最初 1 回 、 以 降 制御式 単純 点 、

Grade1

優 。   Table 3-4 論理積演算子と論理和演算子

x && y xyの両方ともtrueであればtrueを、そうでなければfalseを生成。

x || y xyの一方でもtrueであればtrueを、そうでなければfalseを生成。 ▼ これらの演算子は短絡評価を行います(p.61)。

pointは0∼100 pointは60∼100

pointは70∼100 pointは80∼100

(18)

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

(19)

プ ロ グ ラ ム の 流 れ の 分 岐

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 xtrueであれば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 章で学習します。

(20)

問題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) + "です。");

(21)

プ ロ グ ラ ム の 流 れ の 分 岐

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回 。 ▪他 文字列 変更 容易 。

(22)

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である場合に通る経路

(23)

プ ロ グ ラ ム の 流 れ の 分 岐

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 以下 定義 。 問題 解 、明確 定義 、順序付 有限個 規則 集合。 、 曖昧 記述 、変数 値 、問題 解 解 、正 。

(24)

問題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;

(25)

プ ロ グ ラ ム の 流 れ の 分 岐

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 個以上 、任意 個数 文』 表

(26)

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) { // abより小さければ min = a; max = b; } else { min = b; max = a; } System.out.println("小さいほうの値は" + min + "です。"); System.out.println("大きいほうの値は" + max + "です。"); } } }

(27)

プ ロ グ ラ ム の 流 れ の 分 岐

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 ( 式 ) ;

(28)

問題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) { // abより小さければ int t = a; // それらの値を交換 a = b; b = t; } System.out.println("abとなるようにソートしました。"); System.out.println("変数a" + a + "です。"); System.out.println("変数b" + b + "です。"); } }

(29)

プ ロ グ ラ ム の 流 れ の 分 岐

3

Fig.3-19 二値の交換手順 交換後

-t

13 57 13 57 57 13 57 13 13

t

= a;

a

= b;

b

= t;

a b t 13 57

a

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

文 、文12 実行 、 条件 。 二 文 実行 条件 、下表 示 《条件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

、何 実行 注意 。

(30)

問題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) { // abより大きければabを交換 int t = a; a = b; b = t; } if (b > c) { // bcより大きければbcを交換 int t = b; b = c; c = t; } if (a > b) { // abより大きければabを交換 int t = a; a = b; b = t; } System.out.println("abcとなるようにソートしました。"); System.out.println("変数a" + a + "です。"); System.out.println("変数b" + b + "です。"); System.out.println("変数c" + c + "です。"); } }

(31)

プ ロ グ ラ ム の 流 れ の 分 岐

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) abを交換 if (b > c) bcを交換 if (a > b) abを交換 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) abを交換 if (b > c) bcを交換 if (a > b) abを交換 a b c ▼ ここに示したソートの手順は、単純交換ソート(バブルソート)と呼ばれるソートアルゴリ ズムを、ソート対象が3要素である場合に特化したものです。 ソートのアルゴリズムには、単純交換ソート、シェルソート、マージソート、クイックソー トなど、数多くのものが考案されています。これらのアルゴリズムについては、『明解 Java によ るアルゴリズムとデータ構造』で学習いただけます(巻末の広告をご覧ください)。

(32)

問題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

文 実行 終了 。

実行例

(33)

プ ロ グ ラ ム の 流 れ の 分 岐

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

、 追加 伴 変更 確実 容易

(34)

問題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 Ÿ そんな月はありません。

(35)

プ ロ グ ラ ム の 流 れ の 分 岐

3

Fig.3-25 等価なif文とswitch文 Fig.3-23 switch文の構文図 switch () switch文 定数式 列挙定数名 case default{ : } break ; break文 識別子

if

switch

文 使 実現 分岐 、

switch

文 利用 実現 読 傾向 。 、Fig.3-25 示 二 部分 考 。 、

if

文 読 。先頭三

if

a

4 値 調 、最後

if

b

4 値 調 。変数

c

80

代入 、

a

1, 2, 3

b

4

。 連続

if

文 、分岐 比較対象 、必 単一 式 限 。最後 判定 、

if (a == 4)

読 間違 、

if (a == 4)

書 間違 誤解 。 点、

switch

文 、全体 見通 、 読 人 、 疑念 抱 少 。 Fig.3-24 break文の構文図 if (a == 1) c = 10; else if (a == 2) c = 20; else if (a == 3) c = 50; else if (b == 4) c = 80; // 左のif文を書き直したswitchswitch (a) { case 1 : c = 10; break; case 2 : c = 20; break; case 3 : c = 50; break; default : if (b == 4) c = 80; break; }

break

文 構文図 Fig.3-24 示 。 ▼ breakの後ろに識別子(p.78)が置かれるプログラム例は、次章で学習します。

参照

関連したドキュメント

Jones, 村上順, 大槻知忠, 葉廣和夫, (量子力学, 統計学, 物理学など様々な分野との結びつき ながら大きく発展中!!

日本語で書かれた解説がほとんどないので , 専門用 語の訳出を独自に試みた ( たとえば variety を「多様クラス」と訳したり , subdirect

[r]

脱型時期などの違いが強度発現に大きな差を及ぼすと

開催数 開 催 日 相談者数(対応した専門職種・人数) 対応法人・場 所 第1回 4月24日 相談者 1 人(法律職1人、福祉職 1 人)

Chrstianity A Chrstianity B 国際地域理解入門A 国際地域理解入門B Basic Seminar A Basic Seminar B キリスト教と世界 Special Topics in Japanese Society Contemporary

国際地域理解入門B 国際学入門 日本経済基礎 Japanese Economy 基礎演習A 基礎演習B 国際移民論 研究演習Ⅰ 研究演習Ⅱ 卒業論文