85
本本本本 本本本本本本本 本本本本本本本本本本本本本本本本本本本本本本本本本本本 本本本本本 本本本 本本本本本本本本本本本 本本本本 本本本 本本本本本本本 本本 ()(),,、、( 本本本本本本本本本本本本本本本 80% 本本本本本本本本本本本本本本本 本本本本本本本本本本本本本本本本 本本本本本本本本本本本本本本本本本本 本本本本本本本本本 ),,、; 本本本本 本本本本本本本本本本本本本本本本 本本本本本本本本本本本本本本本本本本本本本本本本本本本本 ,,。 本本本本本 © 本本本本本本本本本本 本本本本 ( ) 本本本本 本 5 本

SCJP ch05

Embed Size (px)

Citation preview

Page 1: SCJP ch05

本投影片(下稱教用資源)僅授權給採用教用資源相關之旗標書籍為教科書之授課老師(下稱老師)專用,老師為教學使用之目的,得摘錄、編輯、重製教用資源(但使用量不得超過各該教用資源內容之 80% )以製作為輔助教學之教學投影片,並於授課時搭配旗標書籍公開播放,但不得為網際網路公開傳輸之遠距教學、網路教學等之使用;除此之外,老師不得再授權予任何第三人使用,並不得將依此授權所製作之教學投影片之相關著作物移作他用。

著作權所有 © 旗標出版股份有限公司

流程控制 ( 一 ) :條件分支第 5 章

Page 2: SCJP ch05

2

學習目標

以條件判斷執行不同的流程 將口語的狀況轉譯成條件判斷式 熟悉 if/else 及 switch 敘述

Page 3: SCJP ch05

3

前言

經過第 3 章的變數宣告及第 4 章的運算式的練習後 , 相信讀者對 Java 程式的運算及執行都有了一定的概念。

但是在現實生活中 , 並非每件事都只要一個動作就能解決 , 程式也是一樣 , 大部分的計算結果也不是一個運算式或一個敘述就能處理的。當一件事情需要兩個以上的步驟才能處理時 , 就必須規劃處理的步驟。

Java 程式也是相同的情況 , 因此 , 本章的重點就會放在如何安排程式中各個步驟的執行順序 , 也就是流程控制上。

Page 4: SCJP ch05

4

5- 1 甚麼是流程控制?

在說明流程控制前 , 先了解何謂『流程』? 以一天的生活為例 , 『早上起床後 , 會先刷牙洗臉 ,

接著吃完早餐後就出門上課 , 上完了早上的三堂課 ,

在餐廳吃自助餐 , 午休後繼續上下午的課 , 下課後跟同學相約去外面的小吃店用餐 , 晚上回宿舍唸書 , 最後上床睡覺』 , 結束一天的流程。

Page 5: SCJP ch05

5

甚麼是流程控制?

程式的執行也是相同的 , 如同第 2 章時曾提及 , 程式在執行時是以敘述為單元,由上往下循序進行。如右圖:

由右圖不難發現 , 程式的執行就如同平常的生活一樣 , 是有順序性地在執行 ,

整個執行的順序與過程 , 就是流程。

Page 6: SCJP ch05

6

甚麼是流程控制?

但是流程並非僅僅依序進行 , 它可能會因為一些狀況而變化。

以一天的生活為例 , 如果下午老師請假沒來上課 , 下午的課就會取消 , 因而更改流程 , 變成『早上起床後 ,

先刷牙洗臉 , 接著吃完早餐後出門上課 , 上完了早上的三堂課 , 由於下午老師請假 , 因此決定去學校外面吃午餐 , 並在市區逛街 , 下午再回學校後去打球等』。

程式中的流程也是一樣 , 可能會因為狀況不同而改變 ,

執行不同的敘述 , 如下圖:

Page 7: SCJP ch05

7

甚麼是流程控制?

Page 8: SCJP ch05

8

甚麼是流程控制?

因此 , 對於程式執行的流程順序以及因應不同狀況而選取不同的流程 , 即為流程控制。

在 Java 中 , 對流程的控制敘述大致可以分為兩大類 , 一為條件判斷敘述 ( 或稱為選擇敘述 ), 包含有 if 以及 switch 敘述兩種 , 會在這一章詳細說明;另一類為迴圈式敘述 ( 或稱重複敘述 ), 將留待下一章介紹。

Page 9: SCJP ch05

9

5-2 if 條件分支

在條件判斷敘述中 , 最常用到的就是 if 敘述了 , 它就如同日常生活中常使用的『如果 . . 就 . .否則 . . 』是一樣的意思。

比方說下述的情況:

Page 10: SCJP ch05

10

if 條件分支

以圖形來表示就是:

Page 11: SCJP ch05

11

if 條件分支

在 Java 程式中 , 判斷當然不是使用這麼口語的說法 , 而是使用 if 敘述 , 來依條件判斷的結果執行對應的程式敘述。

if 敘述的語法如下:

Page 12: SCJP ch05

12

if 條件分支

if :『如果』 的意思。會根據條件運算式的結果 ,

來判斷是否執行區塊中的敘述。如果條件運算式的結果為 true, 則執行區塊內的敘述;如果結果為 false,

則跳過區塊。 條件運算式:運算結果為布林型別的運算式 , 通常由比較運算或邏輯運算所組成。

敘述:條件運算式結果為 t rue 時所要執行的動作。如果只有單一敘述 , 則可以省略大括號。

Page 13: SCJP ch05

13

if 條件分支

以生活中常見的例子來說 , 使用 if 判斷汽車是否該加油的程式可以寫成這樣。

Page 14: SCJP ch05

14

if 條件分支

Page 15: SCJP ch05

15

if 條件分支

1.第 1 、 6 、 11 ~ 18 行是為了讓使用者可以輸入代表目前油量的數值而加上的程式 , 這些敘述會在第 16 章細說明。

Page 16: SCJP ch05

16

if 條件分支

2. 第 9 行的 System.out.print(), 其功能和 System.

out.println() 相同 , 但在輸出資料後不會自動換行。

3. 第 15 行的 『 br.readLine() 』 就是讓使用者輸入資料的動作 , 執行到這一行時 , 會等待使用者輸入資料並按下 [Enter] 鍵之後才會繼續執行 , 並且將輸入的資料放入 str 這個字串變數中。

Page 17: SCJP ch05

17

if 條件分支

4. 第 18 行的 『 Integer.parseInt(str) 』 則是將 st

r 變數中所儲存以數字組成的字串轉換成 int 型別的數值 , 然後放入 liter 變數中。往後在需要使用者輸入資料的範例中 , 都會出現第 1~3 項所描述的這幾行程式,這裡您只需要知道它們的用途即可 , 等到後續的章節就會一一說明各部分的意義。

5. 第 20 行就是 if 敘述 , 它會以 liter 變數的內容為判斷依據 , 以決定是否執行第 21 行的敘述。

Page 18: SCJP ch05

18

if 條件分支

在執行結果 1 中 , 輸入的剩餘汽油量為 2 公升 , if

的條件運算式『 (liter < 2) 』的運算結果為 false, 因此 Java 會忽略第 21 行的敘述 , 直接執行之後的程式。

在執行結果 2 中 , 輸入的剩餘汽油量小於 2 公升 ,

此時 if 的條件運算式結果為 true, 將會執行第 21

行的敘述。

Page 19: SCJP ch05

19

if 條件分支

程式流程如右:

▪ 請切記 if 的條件運算式的運算結果一定要是布林型別。

Page 20: SCJP ch05

20

if 條件分支

如果符合條件時所要執行的敘述不只一個 , 就必須使用一對大括號將這些敘述括起來成為一個區塊 , 例如:

Page 21: SCJP ch05

21

if 條件分支

Page 22: SCJP ch05

22

if 條件分支

如果忘記加上大括號 , 而將 if 敘述寫成這樣:

那麼不管輸入甚麼資料 , 都會執行第 22 行:

Page 23: SCJP ch05

23

if 條件分支

因為對應於 if 條件的敘述只有第 21 行 , 因此第 22 行並不受 if 條件的影響 , 一定都會執行。▪ 建議您不論 if 成立後要執行的敘述有幾個 , 都養成加上大括號的習慣 , 如此不但可以避免往後修改程式添加敘述而忘記加大括號的錯誤 , 同時也可以讓 if

敘述的結構更清楚。

Page 24: SCJP ch05

24

5-2-1 多條件運算式與巢狀 if

由於 if 是藉由條件運算式的結果來決定是否繼續指定的敘述 , 而條件運算式通常是由比較運算子以及邏輯運算子所構成 , 像是 checkOil.java 中的『 if (liter

< 2) 』 就是利用了 『 < 』 這個比較運算子來判斷。 您也可以由多個比較運算子或是邏輯運算子來組成條件運算式。

Page 25: SCJP ch05

25

多條件運算式與巢狀 i f

Page 26: SCJP ch05

26

多條件運算式與巢狀 if

Page 27: SCJP ch05

27

多條件運算式與巢狀 if

其中第 17 行的 『 if ((liter >= 2) & (liter < 5)) 』 就是使用邏輯運算子 & 將兩個條件運算式結合成條件運算式 , 只有在 liter 的值大於或等於 2 而且小於 5 的時候運算結果才是 true 。▪ 提醒您 & 與 && 、 | 與 || 看起來好像功能相同 ,

但其最大的差異在於 && 及 || 會以短路模式執行 ,

只要左邊的運算元可以決定運算結果 , 就不再去執行右邊的運算元。請參考第 4-4-3 節。

Page 28: SCJP ch05

28

多條件運算式與巢狀 if

同樣的程式也可以改寫這樣:

Page 29: SCJP ch05

29

多條件運算式與巢狀 if

Page 30: SCJP ch05

30

多條件運算式與巢狀 if

在上述的例子中 , 執行的結果雖與 CheckOilThree.j

ava 相同 , 不過卻是利用了巢狀 if 敘述。 剩餘油量必須先在 17 行第 1 個 if 的條件運算式

(liter >= 2) 成立時 , 才會繼續執行第 18 行的 if 敘述 , 並在滿足其條件 (liter < 5) 時 , 才會執行第 19

行的敘述。

Page 31: SCJP ch05

31

多條件運算式與巢狀 if

由流程圖可以看出其差異性:

Page 32: SCJP ch05

32

多條件運算式與巢狀 if

Page 33: SCJP ch05

33

5-2-2 加上 else if 的多條件敘述

除了巢狀 if 的使用方式外 , 也可以加上多個 else if

讓程式流程配合較為複雜的規則來執行。語法如下:

Page 34: SCJP ch05

34

加上 else if 的多條件敘述

當條件運算式 1 的結果為 true 時 , 就執行 if 區塊內的敘述;否則就檢查條件運算式 2 的結果 , 如果是 true, 就執行第 2 個 if 區塊內的敘述;依此類推 , 如果前面 if 的條件運算式結果都是 false,

就檢查條件運算式 n 的結果 , 如果是 true, 就執行第 n 個 if 區塊內的敘述。

同樣的 , 個別 if 區塊中如果僅有單一敘述 , 就可以省略成對的大括號。

以上述檢查油量的程式為例 , 就可以新增更多的條件來控制程式流程 , 例如。

Page 35: SCJP ch05

35

加上 else if 的多條件敘述

Page 36: SCJP ch05

36

加上 else if 的多條件敘述

Page 37: SCJP ch05

37

加上 else if 的多條件敘述

Page 38: SCJP ch05

38

加上 else if 的多條件敘述

這裡每一個 else if 都是額外的條件 , 程式執行時 ,

會從 if 及後續的 else if 中挑選第一個條件運算式結果為 true 的敘述來執行 , 以口語來說就是:

Page 39: SCJP ch05

39

加上 else if 的多條件敘述

以流程圖表示如右:

Page 40: SCJP ch05

40

加上 else if 的多條件敘述

因此 , 當輸入 1 時 , 第 1 個符合的就是條件 1 。 輸入 4 時第 1 個符合的就是條件 2 。 輸入 10 時第 1 個符合的就是條件 3, 執行的就是個別條件對應的敘述。

Page 41: SCJP ch05

41

注意個別條件的順序 在使用多條件的 if 敘述時 , 請特別留意個別條件的順序。舉例來說 , 如果將 CheckOil3.java 中的條件順序顛倒 , 變成這樣:

Page 42: SCJP ch05

42

注意個別條件的順序

當輸入 1 時 , 執行結果就會錯誤:

這是因為輸入 1 時 , 第 21 行的條件就成立了 , 根本不會檢查到第 25 行的條件 , 所以就會顯示錯誤的結果。

請記得在使用多條件的 if 時 , 要先列最嚴苛的條件 ,

條件越寬鬆的越往後移。

Page 43: SCJP ch05

43

5-2-3 捕捉其餘狀況的 else 在使用 if 敘述時 , 還可以加上 else 區塊在所有條件都不成立的狀況下 , 執行指定的動作。語法如下:

Page 44: SCJP ch05

44

捕捉其餘狀況的 else

當 else 之前的所有 if 的條件運算式結果都是 fals

e 時 , 就會執行最後的 else區塊的敘述。 如果 else 區塊內僅有單一敘述 , 也同樣可以省略成對的大括號。

以前述的 CheckOilElseIf.java 為例 , 就可以改寫為這樣。

Page 45: SCJP ch05

45

捕捉其餘狀況的 else

Page 46: SCJP ch05

46

捕捉其餘狀況的 else

Page 47: SCJP ch05

47

捕捉其餘狀況的 else

第 25 行的 else 會在最前面的 if, 以及後續的任何 else if 的條件運算式都不成立的情況下成立 , 並執行其對應的敘述。

因此 , 這個程式其實就和 CheckOil3.java 是一模一樣的 , 因為前 2 個條件都不成立的話,表示 liter

一定大於或是等於 10 。▪ 如果沒有第 25 行的 else, 那麼程式每次執行時都會執行第 27 行 , 但加上第 25 行的 else 後 , 只有在第 17 與 21 行的條件都不成立 , 也就是 liter 大於或等於 10 時才會執行第 27 行的敘述。

Page 48: SCJP ch05

48

5-3 switch 多條件分支

除了用 if 加上多個 else if 來針對不同條件控制流程外 , Java 還提供另一種多條件分支的敘述 ― swi

tch 。 switch 是一種多選一的敘述。舉個例子來說 , 在本年度初 , 我們對自己訂了幾個目標 , 如果年度考績拿到優 , 就出國去玩;如果拿到甲 , 就買台電腦犒賞自己;拿到乙 , 就去逛個街放鬆一下;如果考績是丙 ,

就要準備翻報紙找工作了:

Page 49: SCJP ch05

49

switch 多條件分支 switch 多條件分支的用法與上述的情況十分類似 , 是由一個條件運算式的值來決定應執行的對應敘述 , 語法如右:

Page 50: SCJP ch05

50

switch 多條件分支 switch :『選擇 . . 』的意思 , 表示要根據條件運算式的結果 , 選擇接下來要執行哪一個 case 內的動作。 switch 之後的條件運算式的運算結果必須是 char 、 byte 、 short 、或是 int 型別的值 ( 在 Java 5.0 以上也可使用 enum 列舉型別 , 詳情參見第 12 章 ) , 否則編譯時會出現錯誤。

case :列出個別的條件 , case 之後的條件值必須是常數或是由常數所構成的運算式 , 且不同的 case 的條件值運算結果不能相同。 switch 會根據條件運算式的運算結果 , 從各個 case 挑選相同的條件值 , 並執行對應的敘述。

break :結束 case 。

Page 51: SCJP ch05

51

switch 多條件分支

雖然 switch 表面上看起來跟 if 完全不同 , 但是 s

witch 私底下仍然是使用條件運算式與條件值的比較來作為其控制流程的機制。

如下圖。

Page 52: SCJP ch05

52

switch 多條件分支

Page 53: SCJP ch05

53

switch 多條件分支 根據上述 switch 語法 , 年度考績的例子就可以寫成以下的 switch 程式片段:

Page 54: SCJP ch05

54

switch 多條件分支 以下是實際的程式範例 , 我們將設計一個可以依季節來判斷該穿什麼衣服的程式:

Page 55: SCJP ch05

55

switch 多條件分支

Page 56: SCJP ch05

56

switch 多條件分支

Page 57: SCJP ch05

57

switch 多條件分支 程式一開始先顯示訊息請使用者選擇季節 , 然後讓使用者輸入代表季節的數字 , 並且將該數字轉成整數之後放入 season 變數中 , 最後使用 switch 敘述顯示適合於該季節的穿著。

您可以看到 , switch 敘述會依據 season 的值 , 去執行對應 case 內的敘述。▪ 注意到每一個 case可以對應多個敘述 , 而不是只能有單一敘述 , 然後接著 break 。

▪ 請切記 switch 後的條件運算式運算結果只能是 char 、byte 、 short 、以及 int 等型別。

Page 58: SCJP ch05

58

5-3-1 break 敘述的重要性

前面提過 break 是用來結束單一個 case, 如果不加上 break, 程式也能執行 , 但是會發生程式繼續往下一個 case 對應的敘述執行的情況 , 例如。

Page 59: SCJP ch05

59

break 敘述的重要性

Page 60: SCJP ch05

60

break 敘述的重要性

Page 61: SCJP ch05

61

break 敘述的重要性

由於 case 1 的敘述中沒有 break, 因此 , 程式就會繼續執行第 22 行的程式 , 直到遇到第 23 行的 break 才中斷。

雖然遺漏 break 可能會讓程式執行的結果錯誤 , 但有些情況下不使用 break 卻可以縮短程式的長度 ,

請看以下這個範例:

Page 62: SCJP ch05

62

break 敘述的重要性

Page 63: SCJP ch05

63

break 敘述的重要性

Page 64: SCJP ch05

64

break 敘述的重要性

Page 65: SCJP ch05

65

break 敘述的重要性

由於漢堡餐及起司堡餐的價錢一樣 , 因此我們故意拿掉 case 2 的敘述以及 break, 當使用者輸入 2 號餐時 , switch 便會選擇第 22 行的 case 2 來執行。

由於 case 2 並無 break, 故程式繼續往下執行第 24 行的程式 , 直到第 25 行的 break 才中斷 swit

ch 敘述。 如果不這樣寫 , 就得在第 22 行之後重複一段和第 2

4 ~ 25 一樣的程式。

Page 66: SCJP ch05

66

5-3-2 捕捉其餘狀況的 default

在 switch 內還可以加上一個 default 敘述 , 用來捕捉條件運算式與所有 case 條件值都不相符的狀況 ,

就像是 else 用來捕捉所有的 if 條件都不成立的狀況一樣。

語法如下。

Page 67: SCJP ch05

67

捕捉其餘狀況的 default

Page 68: SCJP ch05

68

捕捉其餘狀況的 default

以之前的點餐程式為例 , 如果使用者輸入了非 1 ~ 4

的數值 , switch 敘述並不會處理 , 只會簡單的跳出 switch 敘述 , 我們可以加上 default 來處理這樣的狀況。

Page 69: SCJP ch05

69

捕捉其餘狀況的 default

Page 70: SCJP ch05

70

捕捉其餘狀況的 default

Page 71: SCJP ch05

71

捕捉其餘狀況的 default

這樣一來 , 當使用者輸入的數值不符合可以點餐的數值時 , 就會執行 default 條件的敘述 , 顯示訊息告知使用者了。▪ 通常我們會把 default 寫在 switch 的最後面 , 但 d

efault 也可以寫在各個 case 的前面 , 其效果和寫在最後面完全一樣 , 此時請記得在 default 對應敘述的最後加上 break, 以終止 default 。

Page 72: SCJP ch05

72

5-A 判斷是否可為三角形三邊長

5-B 電影票票價計算

5-C 利用手機號碼前四碼判斷使用者使用的電信系統

Page 73: SCJP ch05

73

1. What will be the result of attempting to compile and run the following program?

A. NULL B. BLANK C. STRING D. This program will not compile. E. This program will error at runtime.

Page 74: SCJP ch05

74

2. Given :

What will the program print when compiled and run? A. NULL B. STRING C. print nothing. D. This program will not compile.

E. This program will error at runtime.

Page 75: SCJP ch05

75

▪ 當 s 為 null 時 , 執行 『 s == null 』 結果會是 tr

ue, 而執行 『 s.length() = 0 』 時則會造成錯誤。在第 4 行若將 | 改為短路的 ||, 則可以正確執行 , 並輸出 NULL 。

Page 76: SCJP ch05

76

3. Given:

Page 77: SCJP ch05

77

What will be the result? A. Compilation fails. B. ? C. b D. ?bc E. bc

Page 78: SCJP ch05

78

4. Given:

Page 79: SCJP ch05

79

What will be the result? (Choose al l that apply.)A. Compiles error at S1.

B. Compiles error at S2.

C. Compiles error at S3.

D. Compiles error at S4.

E. Compiles error at S5.

F. It will run and print "200300" after removing all the errors.

Page 80: SCJP ch05

80

5. Which are legal argument types for switch statement?(Choose all that apply.)A. byte

B. boolean

C. short

D. D. int

E. long

F. char

G. String

Page 81: SCJP ch05

81

6. What will be the result to run the following program?

A. Cool B. Cold C. CoolCold D. CoolColdWarm E. ColdHotAndWarm

Page 82: SCJP ch05

82

7. Given:

Page 83: SCJP ch05

83

What is the result? A. 1000B. 1010C. 1011D. 1100E. 1101

當有多個 if 、 else 時 , 若沒有以大括號標出範圍 , 則會以較內層的優先配對。例如 if()...if()...TIIP else, 則 else 會和第二個 if 配對。

Page 84: SCJP ch05

84

8. Which three of following statements are illegal?

Page 85: SCJP ch05

85

A. S1

B. S2

C. S3

D. S4

E. S5