SlideShare uma empresa Scribd logo
1 de 85
第 5 章

流程控制 ( 一 ) :條件分支
本投影片(下稱教用資源)僅授權給採用教用資源相關之旗標書籍為教科書之授課老師(下稱老師)專用,老
師為教學使用之目的,得摘錄、編輯、重製教用資源(但使用量不得超過各該教用資源內容之 80% )以製作為
輔助教學之教學投影片,並於授課時搭配旗標書籍公開播放,但不得為網際網路公開傳輸之遠距教學、網路教
學等之使用;除此之外,老師不得再授權予任何第三人使用,並不得將依此授權所製作之教學投影片之相關著
作物移作他用。
著作權所有 © 旗標出版股份有限公司
學習目標
 以條件判斷執行不同的流程
 將口語的狀況轉譯成條件判斷式
 熟悉 if/else 及 switch 敘述
前言
 經過第 3 章的變數宣告及第 4 章的運算式的練習後
, 相信讀者對 Java 程式的運算及執行都有了一定的
概念。
 但是在現實生活中 , 並非每件事都只要一個動作就能
解決 , 程式也是一樣 , 大部分的計算結果也不是一個
運算式或一個敘述就能處理的。當一件事情需要兩個
以上的步驟才能處理時 , 就必須規劃處理的步驟。
 Java 程式也是相同的情況 , 因此 , 本章的重點就會
放在如何安排程式中各個步驟的執行順序 , 也就是流
程控制上。
5- 1 甚麼是流程控制?
 在說明流程控制前 , 先了解何謂『流程』?
 以一天的生活為例 , 『早上起床後 , 會先刷牙洗臉 ,
接著吃完早餐後就出門上課 , 上完了早上的三堂課 ,
在餐廳吃自助餐 , 午休後繼續上下午的課 , 下課後跟
同學相約去外面的小吃店用餐 , 晚上回宿舍唸書 , 最
後上床睡覺』 , 結束一天的流程。
甚麼是流程控制?
 程式的執行也是相同的 , 如同第 2 章
時曾提及 , 程式在執行時是以敘述為單
元,由上往下循序進行。如右圖:
 由右圖不難發現 , 程式的執行就如同平
常的生活一樣 , 是有順序性地在執行 ,
整個執行的順序與過程 , 就是流程。
甚麼是流程控制?
 但是流程並非僅僅依序進行 , 它可能會因為一些狀況
而變化。
 以一天的生活為例 , 如果下午老師請假沒來上課 , 下
午的課就會取消 , 因而更改流程 , 變成『早上起床後
, 先刷牙洗臉 , 接著吃完早餐後出門上課 , 上完了早
上的三堂課 , 由於下午老師請假 , 因此決定去學校外
面吃午餐 , 並在市區逛街 , 下午再回學校後去打球
等』。
 程式中的流程也是一樣 , 可能會因為狀況不同而改變
, 執行不同的敘述 , 如下圖:
甚麼是流程控制?
甚麼是流程控制?
 因此 , 對於程式執行的流程順序以及因應不同狀況而
選取不同的流程 , 即為流程控制。
 在 Java 中 , 對流程的控制敘述大致可以分為兩大類
, 一為條件判斷敘述 ( 或稱為選擇敘述 ), 包含有 if
以及 switch 敘述兩種 , 會在這一章詳細說明;另一
類為迴圈式敘述 ( 或稱重複敘述 ), 將留待下一章介
紹。
5-2 if 條件分支
 在條件判斷敘述中 , 最常用到的就是 if 敘述了 , 它
就如同日常生活中常使用的『如果 . . 就 . . 否則 . . 』
是一樣的意思。
 比方說下述的情況:
if 條件分支
 以圖形來表示就是:
if 條件分支
 在 Java 程式中 , 判斷當然不是使用這麼口語的說法
, 而是使用 if 敘述 , 來依條件判斷的結果執行對應
的程式敘述。
 if 敘述的語法如下:
if 條件分支
 if :『如果』 的意思。會根據條件運算式的結果 , 來
判斷是否執行區塊中的敘述。如果條件運算式的結果
為 true, 則執行區塊內的敘述;如果結果為 false,
則跳過區塊。
 條件運算式:運算結果為布林型別的運算式 , 通常由
比較運算或邏輯運算所組成。
 敘述:條件運算式結果為 t rue 時所要執行的動作。
如果只有單一敘述 , 則可以省略大括號。
if 條件分支
 以生活中常見的例子來說 , 使用 if 判斷汽車是否該
加油的程式可以寫成這樣。
if 條件分支
if 條件分支

1. 第 1 、 6 、 11 ~ 18 行是為了讓使用者可以輸入
代表目前油量的數值而加上的程式 , 這些敘述會
在第 16 章細說明。
if 條件分支
2. 第 9 行的 System.out.print(), 其功能和
System.out.println() 相同 , 但在輸出資料後不會自
動換行。
3. 第 15 行的 『 br.readLine() 』 就是讓使用者輸入
資料的動作 , 執行到這一行時 , 會等待使用者輸入資
料並按下 [Enter] 鍵之後才會繼續執行 , 並且將輸入
的資料放入 str 這個字串變數中。
if 條件分支
4. 第 18 行的 『 Integer.parseInt(str) 』 則是將 str
變數中所儲存以數字組成的字串轉換成 int 型別的數
值 , 然後放入 liter 變數中。往後在需要使用者輸入
資料的範例中 , 都會出現第 1~3 項所描述的這幾行
程式,這裡您只需要知道它們的用途即可 , 等到後續
的章節就會一一說明各部分的意義。
5. 第 20 行就是 if 敘述 , 它會以 liter 變數的內容為
判斷依據 , 以決定是否執行第 21 行的敘述。
if 條件分支
 在執行結果 1 中 , 輸入的剩餘汽油量為 2 公升 , if
的條件運算式『 (liter < 2) 』的運算結果為 false, 因
此 Java 會忽略第 21 行的敘述 , 直接執行之後的
程式。
 在執行結果 2 中 , 輸入的剩餘汽油量小於 2 公升 ,
此時 if 的條件運算式結果為 true, 將會執行第 21
行的敘述。
if 條件分支
 程式流程如右:

▪ 請切記 if 的條件運算式的運算結果一定要是布林型別
。
if 條件分支
 如果符合條件時所要執行的敘述不只一個 , 就必須使
用一對大括號將這些敘述括起來成為一個區塊 , 例如
:
if 條件分支
if 條件分支
 如果忘記加上大括號 , 而將 if 敘述寫成這樣:

 那麼不管輸入甚麼資料 , 都會執行第 22 行:
if 條件分支
 因為對應於 if 條件的敘述只有第 21 行 , 因此第
22 行並不受 if 條件的影響 , 一定都會執行。
▪ 建議您不論 if 成立後要執行的敘述有幾個 , 都養成加
上大括號的習慣 , 如此不但可以避免往後修改程式添
加敘述而忘記加大括號的錯誤 , 同時也可以讓 if 敘述
的結構更清楚。
5-2-1 多條件運算式與巢狀 if
 由於 if 是藉由條件運算式的結果來決定是否繼續指
定的敘述 , 而條件運算式通常是由比較運算子以及邏
輯運算子所構成 , 像是 checkOil.java 中的『 if (liter
< 2) 』 就是利用了 『 < 』 這個比較運算子來判斷。
 您也可以由多個比較運算子或是邏輯運算子來組成條
件運算式。
多條件運算式與巢狀 i f
多條件運算式與巢狀 if
多條件運算式與巢狀 if
 其中第 17 行的 『 if ((liter >= 2) & (liter < 5)) 』 就
是使用邏輯運算子 & 將兩個條件運算式結合成條件
運算式 , 只有在 liter 的值大於或等於 2 而且小於
5 的時候運算結果才是 true 。
▪ 提醒您 & 與 && 、 | 與 || 看起來好像功能相同 , 但
其最大的差異在於 && 及 || 會以短路模式執行 , 只
要左邊的運算元可以決定運算結果 , 就不再去執行右
邊的運算元。請參考第 4-4-3 節。
多條件運算式與巢狀 if
 同樣的程式也可以改寫這樣:
多條件運算式與巢狀 if
多條件運算式與巢狀 if
 在上述的例子中 , 執行的結果雖與
CheckOilThree.java 相同 , 不過卻是利用了巢狀 if
敘述。
 剩餘油量必須先在 17 行第 1 個 if 的條件運算式
(liter >= 2) 成立時 , 才會繼續執行第 18 行的 if 敘
述 , 並在滿足其條件 (liter < 5) 時 , 才會執行第 19
行的敘述。
多條件運算式與巢狀 if
 由流程圖可以看出其差異性:
多條件運算式與巢狀 if
5-2-2 加上 else if 的多條件敘述
 除了巢狀 if 的使用方式外 , 也可以加上多個 else if
讓程式流程配合較為複雜的規則來執行。語法如下:
加上 else if 的多條件敘述
 當條件運算式 1 的結果為 true 時 , 就執行 if 區塊
內的敘述;否則就檢查條件運算式 2 的結果 , 如果
是 true, 就執行第 2 個 if 區塊內的敘述;依此類推
, 如果前面 if 的條件運算式結果都是 false, 就檢查
條件運算式 n 的結果 , 如果是 true, 就執行第 n 個
if 區塊內的敘述。
 同樣的 , 個別 if 區塊中如果僅有單一敘述 , 就可以
省略成對的大括號。
 以上述檢查油量的程式為例 , 就可以新增更多的條件
來控制程式流程 , 例如。
加上 else if 的多條件敘述
加上 else if 的多條件敘述
加上 else if 的多條件敘述
加上 else if 的多條件敘述
 這裡每一個 else if 都是額外的條件 , 程式執行時 ,
會從 if 及後續的 else if 中挑選第一個條件運算式
結果為 true 的敘述來執行 , 以口語來說就是:
加上 else if 的多條件敘述
 以流程圖
表示如右:
加上 else if 的多條件敘述
 因此 , 當輸入 1 時 , 第 1 個符合的就是條件 1 。
 輸入 4 時第 1 個符合的就是條件 2 。
 輸入 10 時第 1 個符合的就是條件 3, 執行的就是
個別條件對應的敘述。
注意個別條件的順序
 在使用多條件的 if 敘述時 , 請特別留意個別條件的
順序。舉例來說 , 如果將 CheckOil3.java 中的條件
順序顛倒 , 變成這樣:
注意個別條件的順序
 當輸入 1 時 , 執行結果就會錯誤:

 這是因為輸入 1 時 , 第 21 行的條件就成立了 , 根
本不會檢查到第 25 行的條件 , 所以就會顯示錯誤的
結果。
 請記得在使用多條件的 if 時 , 要先列最嚴苛的條件 ,
條件越寬鬆的越往後移。
5-2-3 捕捉其餘狀 況的 else
 在使用 if 敘述時 , 還可以加上 else 區塊在所有條
件都不成立的狀況下 , 執行指定的動作。語法如下:
捕捉其餘狀 況的 else
 當 else 之前的所有 if 的條件運算式結果都是 false
時 , 就會執行最後的 else 區塊的敘述。
 如果 else 區塊內僅有單一敘述 , 也同樣可以省略成
對的大括號。
 以前述的 CheckOilElseIf.java 為例 , 就可以改寫為
這樣。
捕捉其餘狀 況的 else
捕捉其餘狀 況的 else
捕捉其餘狀 況的 else
 第 25 行的 else 會在最前面的 if, 以及後續的任何
else if 的條件運算式都不成立的情況下成立 , 並執行
其對應的敘述。
 因此 , 這個程式其實就和 CheckOil3.java 是一模一
樣的 , 因為前 2 個條件都不成立的話,表示 liter
一定大於或是等於 10 。
▪ 如果沒有第 25 行的 else, 那麼程式每次執行時都會
執行第 27 行 , 但加上第 25 行的 else 後 , 只有在
第 17 與 21 行的條件都不成立 , 也就是 liter 大於
或等於 10 時才會執行第 27 行的敘述。
5-3 switch 多條件分支
 除了用 if 加上多個 else if 來針對不同條件控制流程
外 , Java 還提供另一種多條件分支的敘述 ―
switch 。
 switch 是一種多選一的敘述。舉個例子來說 , 在本
年度初 , 我們對自己訂了幾個目標 , 如果年度考績拿
到優 , 就出國去玩;如果拿到甲 , 就買台電腦犒賞自
己;拿到乙 , 就去逛個街放鬆一下;如果考績是丙 ,
就要準備翻報紙找工作了:
switch 多條件分支
 switch 多條件分支
的用法與上述的
情況十分類似 ,
是由一個條件
運算式的值來
決定應執行的
對應敘述 ,
語法如右:
switch 多條件分支
 switch :『選擇 . . 』的意思 , 表示要根據條件運算

式的結果 , 選擇接下來要執行哪一個 case 內的動作。
switch 之後的條件運算式的運算結果必須是 char 、
byte 、 short 、或是 int 型別的值 ( 在 Java 5.0 以
上也可使用 enum 列舉型別 , 詳情參見第 12 章 ) ,
否則編譯時會出現錯誤。
 case :列出個別的條件 , case 之後的條件值必須是
常數或是由常數所構成的運算式 , 且不同的 case 的
條件值運算結果不能相同。 switch 會根據條件運算
式的運算結果 , 從各個 case 挑選相同的條件值 , 並
執行對應的敘述。
 break :結束 case 。
switch 多條件分支
 雖然 switch 表面上看起來跟 if 完全不同 , 但是
switch 私底下仍然是使用條件運算式與條件值的比
較來作為其控制流程的機制。
 如下圖。
switch 多條件分支
switch 多條件分支
 根據上述 switch 語法 , 年度考績的例子就可以寫成
以下的
switch
程式片段:
switch 多條件分支
 以下是實際的程式範例 , 我們將設計一個可以依季節
來判斷該穿什麼衣服的程式:
switch 多條件分支
switch 多條件分支
switch 多條件分支
 程式一開始先顯示訊息請使用者選擇季節 , 然後讓使
用者輸入代表季節的數字 , 並且將該數字轉成整數之
後放入 season 變數中 , 最後使用 switch 敘述顯示
適合於該季節的穿著。
 您可以看到 , switch 敘述會依據 season 的值 , 去
執行對應 case 內的敘述。
▪ 注意到每一個 case 可以對應多個敘述 , 而不是只能有
單一敘述 , 然後接著 break 。
▪ 請切記 switch 後的條件運算式運算結果只能是
char 、 byte 、 short 、以及 int 等型別。
5-3-1 break 敘述的重要性
 前面提過 break 是用來結束單一個 case, 如果不加
上 break, 程式也能執行 , 但是會發生程式繼續往下
一個 case 對應的敘述執行的情況 , 例如。
break 敘述的重要性
break 敘述的重要性
break 敘述的重要性
 由於 case 1 的敘述中沒有 break, 因此 , 程式就會
繼續執行第 22 行的程式 , 直到遇到第 23 行的
break 才中斷。
 雖然遺漏 break 可能會讓程式執行的結果錯誤 , 但
有些情況下不使用 break 卻可以縮短程式的長度 ,
請看以下這個範例:
break 敘述的重要性
break 敘述的重要性
break 敘述的重要性
break 敘述的重要性
 由於漢堡餐及起司堡餐的價錢一樣 , 因此我們故意拿
掉 case 2 的敘述以及 break, 當使用者輸入 2 號
餐時 , switch 便會選擇第 22 行的 case 2 來執行。
 由於 case 2 並無 break, 故程式繼續往下執行第
24 行的程式 , 直到第 25 行的 break 才中斷
switch 敘述。
 如果不這樣寫 , 就得在第 22 行之後重複一段和第
24 ~ 25 一樣的程式。
5-3-2 捕捉其餘狀 況的 default
 在 switch 內還可以加上一個 default 敘述 , 用來捕
捉條件運算式與所有 case 條件值都不相符的狀況 ,
就像是 else 用來捕捉所有的 if 條件都不成立的狀
況一樣。
 語法如下。
捕捉其餘狀 況的 default
捕捉其餘狀 況的 default
 以之前的點餐程式為例 , 如果使用者輸入了非 1 ~ 4
的數值 , switch 敘述並不會處理 , 只會簡單的跳出
switch 敘述 , 我們可以加上 default 來處理這樣的
狀況。
捕捉其餘狀 況的 default
捕捉其餘狀 況的 default
捕捉其餘狀 況的 default
 這樣一來 , 當使用者輸入的數值不符合可以點餐的數
值時 , 就會執行 default 條件的敘述 , 顯示訊息告知
使用者了。
▪ 通常我們會把 default 寫在 switch 的最後面 , 但
default 也可以寫在各個 case 的前面 , 其效果和寫在
最後面完全一樣 , 此時請記得在 default 對應敘述的
最後加上 break, 以終止 default 。
 5-A 判斷是否可為三角形三邊長
 5-B 電影票票價計算
 5-C 利用手機號碼前四碼判斷使用者使用的電信系統
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.
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.
▪ 當 s 為 null 時 , 執行 『 s == null 』 結果會是 true,
而執行 『 s.length() = 0 』 時則會造成錯誤。在第 4
行若將 | 改為短路的 ||, 則可以正確執行 , 並輸出
NULL 。
3. Given:
What will be the result?
A. Compilation fails.
B. ?
C. b
D. ?bc
E. bc
4. Given:
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.
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
6. What will be the result to run the following program?

A. Cool
D. CoolColdWarm

B. Cold
C. CoolCold
E. ColdHotAndWarm
7. Given:
What is the result?
A. 1000
B. 1010
C. 1011
D. 1100
E. 1101

當有多個 if 、 else 時 , 若沒有以大括號標出範圍 , 則會
以較內層的優先配對。例如 if()...if()...TIIP else, 則 else
會和第二個 if 配對。
8. Which three of following statements are illegal?
A. S1
B. S2
C. S3
D. S4
E. S5

Mais conteúdo relacionado

Semelhante a SCJP ch05

1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學Sita Liu
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集shademoon
 
基于J2 Ee的Web应用
基于J2 Ee的Web应用基于J2 Ee的Web应用
基于J2 Ee的Web应用yiditushe
 
Java script 编程 第2课 条件与循环
Java script 编程 第2课 条件与循环Java script 编程 第2课 条件与循环
Java script 编程 第2课 条件与循环willchrisup
 
第五章解答
第五章解答第五章解答
第五章解答jiannrong
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)wang hongjiang
 
Struct免費入口不限量免費下載論文的方法ural equationmodeling
Struct免費入口不限量免費下載論文的方法ural equationmodelingStruct免費入口不限量免費下載論文的方法ural equationmodeling
Struct免費入口不限量免費下載論文的方法ural equationmodelingssuser5547c4
 
Chapter 3 basic syntax and operator
Chapter 3  basic syntax and operatorChapter 3  basic syntax and operator
Chapter 3 basic syntax and operatorhhliu
 
Java解惑(中文)
Java解惑(中文)Java解惑(中文)
Java解惑(中文)yiditushe
 
3. java basics
3. java basics3. java basics
3. java basicsnetdbncku
 
Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source CodeBo-Yi Wu
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算建興 王
 
My visual basic入門指引 3
My visual basic入門指引 3My visual basic入門指引 3
My visual basic入門指引 3Xavier Chou
 

Semelhante a SCJP ch05 (20)

Ch05
Ch05Ch05
Ch05
 
SCJP ch06
SCJP ch06SCJP ch06
SCJP ch06
 
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
 
SCJP ch04
SCJP ch04SCJP ch04
SCJP ch04
 
C語言分支流程
C語言分支流程C語言分支流程
C語言分支流程
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
 
基于J2 Ee的Web应用
基于J2 Ee的Web应用基于J2 Ee的Web应用
基于J2 Ee的Web应用
 
Java script 编程 第2课 条件与循环
Java script 编程 第2课 条件与循环Java script 编程 第2课 条件与循环
Java script 编程 第2课 条件与循环
 
第五章解答
第五章解答第五章解答
第五章解答
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
 
Struct免費入口不限量免費下載論文的方法ural equationmodeling
Struct免費入口不限量免費下載論文的方法ural equationmodelingStruct免費入口不限量免費下載論文的方法ural equationmodeling
Struct免費入口不限量免費下載論文的方法ural equationmodeling
 
Chapter 3 basic syntax and operator
Chapter 3  basic syntax and operatorChapter 3  basic syntax and operator
Chapter 3 basic syntax and operator
 
SCJP ch08
SCJP ch08SCJP ch08
SCJP ch08
 
SCJP ch15
SCJP ch15SCJP ch15
SCJP ch15
 
Java解惑(中文)
Java解惑(中文)Java解惑(中文)
Java解惑(中文)
 
3. java basics
3. java basics3. java basics
3. java basics
 
C語言應用前置處理
C語言應用前置處理C語言應用前置處理
C語言應用前置處理
 
Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source Code
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
 
My visual basic入門指引 3
My visual basic入門指引 3My visual basic入門指引 3
My visual basic入門指引 3
 

Mais de r82093403

Ciw going mobile
Ciw going mobileCiw going mobile
Ciw going mobiler82093403
 
The lpic 2 exam prep
The lpic 2 exam prepThe lpic 2 exam prep
The lpic 2 exam prepr82093403
 
Exploration network chapter3
Exploration network chapter3Exploration network chapter3
Exploration network chapter3r82093403
 
Exploration network chapter7
Exploration network chapter7Exploration network chapter7
Exploration network chapter7r82093403
 
Exploration network chapter11
Exploration network chapter11Exploration network chapter11
Exploration network chapter11r82093403
 
Exploration network chapter10
Exploration network chapter10Exploration network chapter10
Exploration network chapter10r82093403
 
Exploration network chapter9
Exploration network chapter9Exploration network chapter9
Exploration network chapter9r82093403
 
Exploration network chapter6
Exploration network chapter6Exploration network chapter6
Exploration network chapter6r82093403
 
Exploration network chapter4
Exploration network chapter4Exploration network chapter4
Exploration network chapter4r82093403
 

Mais de r82093403 (20)

Ciw going mobile
Ciw going mobileCiw going mobile
Ciw going mobile
 
The lpic 2 exam prep
The lpic 2 exam prepThe lpic 2 exam prep
The lpic 2 exam prep
 
SCJP ch18
SCJP ch18SCJP ch18
SCJP ch18
 
SCJP ch16
SCJP ch16SCJP ch16
SCJP ch16
 
SCJP ch12
SCJP ch12SCJP ch12
SCJP ch12
 
SCJP ch11
SCJP ch11SCJP ch11
SCJP ch11
 
SCJP ch10
SCJP ch10SCJP ch10
SCJP ch10
 
SCJP ch09
SCJP ch09SCJP ch09
SCJP ch09
 
SCJP ch07
SCJP ch07SCJP ch07
SCJP ch07
 
SCJP ch03
SCJP ch03SCJP ch03
SCJP ch03
 
SCJP ch02
SCJP ch02SCJP ch02
SCJP ch02
 
SCJP ch01
SCJP ch01SCJP ch01
SCJP ch01
 
SCJP ch13
SCJP ch13SCJP ch13
SCJP ch13
 
Exploration network chapter3
Exploration network chapter3Exploration network chapter3
Exploration network chapter3
 
Exploration network chapter7
Exploration network chapter7Exploration network chapter7
Exploration network chapter7
 
Exploration network chapter11
Exploration network chapter11Exploration network chapter11
Exploration network chapter11
 
Exploration network chapter10
Exploration network chapter10Exploration network chapter10
Exploration network chapter10
 
Exploration network chapter9
Exploration network chapter9Exploration network chapter9
Exploration network chapter9
 
Exploration network chapter6
Exploration network chapter6Exploration network chapter6
Exploration network chapter6
 
Exploration network chapter4
Exploration network chapter4Exploration network chapter4
Exploration network chapter4
 

SCJP ch05

  • 1. 第 5 章 流程控制 ( 一 ) :條件分支 本投影片(下稱教用資源)僅授權給採用教用資源相關之旗標書籍為教科書之授課老師(下稱老師)專用,老 師為教學使用之目的,得摘錄、編輯、重製教用資源(但使用量不得超過各該教用資源內容之 80% )以製作為 輔助教學之教學投影片,並於授課時搭配旗標書籍公開播放,但不得為網際網路公開傳輸之遠距教學、網路教 學等之使用;除此之外,老師不得再授權予任何第三人使用,並不得將依此授權所製作之教學投影片之相關著 作物移作他用。 著作權所有 © 旗標出版股份有限公司
  • 3. 前言  經過第 3 章的變數宣告及第 4 章的運算式的練習後 , 相信讀者對 Java 程式的運算及執行都有了一定的 概念。  但是在現實生活中 , 並非每件事都只要一個動作就能 解決 , 程式也是一樣 , 大部分的計算結果也不是一個 運算式或一個敘述就能處理的。當一件事情需要兩個 以上的步驟才能處理時 , 就必須規劃處理的步驟。  Java 程式也是相同的情況 , 因此 , 本章的重點就會 放在如何安排程式中各個步驟的執行順序 , 也就是流 程控制上。
  • 4. 5- 1 甚麼是流程控制?  在說明流程控制前 , 先了解何謂『流程』?  以一天的生活為例 , 『早上起床後 , 會先刷牙洗臉 , 接著吃完早餐後就出門上課 , 上完了早上的三堂課 , 在餐廳吃自助餐 , 午休後繼續上下午的課 , 下課後跟 同學相約去外面的小吃店用餐 , 晚上回宿舍唸書 , 最 後上床睡覺』 , 結束一天的流程。
  • 5. 甚麼是流程控制?  程式的執行也是相同的 , 如同第 2 章 時曾提及 , 程式在執行時是以敘述為單 元,由上往下循序進行。如右圖:  由右圖不難發現 , 程式的執行就如同平 常的生活一樣 , 是有順序性地在執行 , 整個執行的順序與過程 , 就是流程。
  • 6. 甚麼是流程控制?  但是流程並非僅僅依序進行 , 它可能會因為一些狀況 而變化。  以一天的生活為例 , 如果下午老師請假沒來上課 , 下 午的課就會取消 , 因而更改流程 , 變成『早上起床後 , 先刷牙洗臉 , 接著吃完早餐後出門上課 , 上完了早 上的三堂課 , 由於下午老師請假 , 因此決定去學校外 面吃午餐 , 並在市區逛街 , 下午再回學校後去打球 等』。  程式中的流程也是一樣 , 可能會因為狀況不同而改變 , 執行不同的敘述 , 如下圖:
  • 8. 甚麼是流程控制?  因此 , 對於程式執行的流程順序以及因應不同狀況而 選取不同的流程 , 即為流程控制。  在 Java 中 , 對流程的控制敘述大致可以分為兩大類 , 一為條件判斷敘述 ( 或稱為選擇敘述 ), 包含有 if 以及 switch 敘述兩種 , 會在這一章詳細說明;另一 類為迴圈式敘述 ( 或稱重複敘述 ), 將留待下一章介 紹。
  • 9. 5-2 if 條件分支  在條件判斷敘述中 , 最常用到的就是 if 敘述了 , 它 就如同日常生活中常使用的『如果 . . 就 . . 否則 . . 』 是一樣的意思。  比方說下述的情況:
  • 11. if 條件分支  在 Java 程式中 , 判斷當然不是使用這麼口語的說法 , 而是使用 if 敘述 , 來依條件判斷的結果執行對應 的程式敘述。  if 敘述的語法如下:
  • 12. if 條件分支  if :『如果』 的意思。會根據條件運算式的結果 , 來 判斷是否執行區塊中的敘述。如果條件運算式的結果 為 true, 則執行區塊內的敘述;如果結果為 false, 則跳過區塊。  條件運算式:運算結果為布林型別的運算式 , 通常由 比較運算或邏輯運算所組成。  敘述:條件運算式結果為 t rue 時所要執行的動作。 如果只有單一敘述 , 則可以省略大括號。
  • 13. if 條件分支  以生活中常見的例子來說 , 使用 if 判斷汽車是否該 加油的程式可以寫成這樣。
  • 15. if 條件分支 1. 第 1 、 6 、 11 ~ 18 行是為了讓使用者可以輸入 代表目前油量的數值而加上的程式 , 這些敘述會 在第 16 章細說明。
  • 16. if 條件分支 2. 第 9 行的 System.out.print(), 其功能和 System.out.println() 相同 , 但在輸出資料後不會自 動換行。 3. 第 15 行的 『 br.readLine() 』 就是讓使用者輸入 資料的動作 , 執行到這一行時 , 會等待使用者輸入資 料並按下 [Enter] 鍵之後才會繼續執行 , 並且將輸入 的資料放入 str 這個字串變數中。
  • 17. if 條件分支 4. 第 18 行的 『 Integer.parseInt(str) 』 則是將 str 變數中所儲存以數字組成的字串轉換成 int 型別的數 值 , 然後放入 liter 變數中。往後在需要使用者輸入 資料的範例中 , 都會出現第 1~3 項所描述的這幾行 程式,這裡您只需要知道它們的用途即可 , 等到後續 的章節就會一一說明各部分的意義。 5. 第 20 行就是 if 敘述 , 它會以 liter 變數的內容為 判斷依據 , 以決定是否執行第 21 行的敘述。
  • 18. if 條件分支  在執行結果 1 中 , 輸入的剩餘汽油量為 2 公升 , if 的條件運算式『 (liter < 2) 』的運算結果為 false, 因 此 Java 會忽略第 21 行的敘述 , 直接執行之後的 程式。  在執行結果 2 中 , 輸入的剩餘汽油量小於 2 公升 , 此時 if 的條件運算式結果為 true, 將會執行第 21 行的敘述。
  • 19. if 條件分支  程式流程如右: ▪ 請切記 if 的條件運算式的運算結果一定要是布林型別 。
  • 20. if 條件分支  如果符合條件時所要執行的敘述不只一個 , 就必須使 用一對大括號將這些敘述括起來成為一個區塊 , 例如 :
  • 22. if 條件分支  如果忘記加上大括號 , 而將 if 敘述寫成這樣:  那麼不管輸入甚麼資料 , 都會執行第 22 行:
  • 23. if 條件分支  因為對應於 if 條件的敘述只有第 21 行 , 因此第 22 行並不受 if 條件的影響 , 一定都會執行。 ▪ 建議您不論 if 成立後要執行的敘述有幾個 , 都養成加 上大括號的習慣 , 如此不但可以避免往後修改程式添 加敘述而忘記加大括號的錯誤 , 同時也可以讓 if 敘述 的結構更清楚。
  • 24. 5-2-1 多條件運算式與巢狀 if  由於 if 是藉由條件運算式的結果來決定是否繼續指 定的敘述 , 而條件運算式通常是由比較運算子以及邏 輯運算子所構成 , 像是 checkOil.java 中的『 if (liter < 2) 』 就是利用了 『 < 』 這個比較運算子來判斷。  您也可以由多個比較運算子或是邏輯運算子來組成條 件運算式。
  • 27. 多條件運算式與巢狀 if  其中第 17 行的 『 if ((liter >= 2) & (liter < 5)) 』 就 是使用邏輯運算子 & 將兩個條件運算式結合成條件 運算式 , 只有在 liter 的值大於或等於 2 而且小於 5 的時候運算結果才是 true 。 ▪ 提醒您 & 與 && 、 | 與 || 看起來好像功能相同 , 但 其最大的差異在於 && 及 || 會以短路模式執行 , 只 要左邊的運算元可以決定運算結果 , 就不再去執行右 邊的運算元。請參考第 4-4-3 節。
  • 30. 多條件運算式與巢狀 if  在上述的例子中 , 執行的結果雖與 CheckOilThree.java 相同 , 不過卻是利用了巢狀 if 敘述。  剩餘油量必須先在 17 行第 1 個 if 的條件運算式 (liter >= 2) 成立時 , 才會繼續執行第 18 行的 if 敘 述 , 並在滿足其條件 (liter < 5) 時 , 才會執行第 19 行的敘述。
  • 33. 5-2-2 加上 else if 的多條件敘述  除了巢狀 if 的使用方式外 , 也可以加上多個 else if 讓程式流程配合較為複雜的規則來執行。語法如下:
  • 34. 加上 else if 的多條件敘述  當條件運算式 1 的結果為 true 時 , 就執行 if 區塊 內的敘述;否則就檢查條件運算式 2 的結果 , 如果 是 true, 就執行第 2 個 if 區塊內的敘述;依此類推 , 如果前面 if 的條件運算式結果都是 false, 就檢查 條件運算式 n 的結果 , 如果是 true, 就執行第 n 個 if 區塊內的敘述。  同樣的 , 個別 if 區塊中如果僅有單一敘述 , 就可以 省略成對的大括號。  以上述檢查油量的程式為例 , 就可以新增更多的條件 來控制程式流程 , 例如。
  • 35. 加上 else if 的多條件敘述
  • 36. 加上 else if 的多條件敘述
  • 37. 加上 else if 的多條件敘述
  • 38. 加上 else if 的多條件敘述  這裡每一個 else if 都是額外的條件 , 程式執行時 , 會從 if 及後續的 else if 中挑選第一個條件運算式 結果為 true 的敘述來執行 , 以口語來說就是:
  • 39. 加上 else if 的多條件敘述  以流程圖 表示如右:
  • 40. 加上 else if 的多條件敘述  因此 , 當輸入 1 時 , 第 1 個符合的就是條件 1 。  輸入 4 時第 1 個符合的就是條件 2 。  輸入 10 時第 1 個符合的就是條件 3, 執行的就是 個別條件對應的敘述。
  • 41. 注意個別條件的順序  在使用多條件的 if 敘述時 , 請特別留意個別條件的 順序。舉例來說 , 如果將 CheckOil3.java 中的條件 順序顛倒 , 變成這樣:
  • 42. 注意個別條件的順序  當輸入 1 時 , 執行結果就會錯誤:  這是因為輸入 1 時 , 第 21 行的條件就成立了 , 根 本不會檢查到第 25 行的條件 , 所以就會顯示錯誤的 結果。  請記得在使用多條件的 if 時 , 要先列最嚴苛的條件 , 條件越寬鬆的越往後移。
  • 43. 5-2-3 捕捉其餘狀 況的 else  在使用 if 敘述時 , 還可以加上 else 區塊在所有條 件都不成立的狀況下 , 執行指定的動作。語法如下:
  • 44. 捕捉其餘狀 況的 else  當 else 之前的所有 if 的條件運算式結果都是 false 時 , 就會執行最後的 else 區塊的敘述。  如果 else 區塊內僅有單一敘述 , 也同樣可以省略成 對的大括號。  以前述的 CheckOilElseIf.java 為例 , 就可以改寫為 這樣。
  • 47. 捕捉其餘狀 況的 else  第 25 行的 else 會在最前面的 if, 以及後續的任何 else if 的條件運算式都不成立的情況下成立 , 並執行 其對應的敘述。  因此 , 這個程式其實就和 CheckOil3.java 是一模一 樣的 , 因為前 2 個條件都不成立的話,表示 liter 一定大於或是等於 10 。 ▪ 如果沒有第 25 行的 else, 那麼程式每次執行時都會 執行第 27 行 , 但加上第 25 行的 else 後 , 只有在 第 17 與 21 行的條件都不成立 , 也就是 liter 大於 或等於 10 時才會執行第 27 行的敘述。
  • 48. 5-3 switch 多條件分支  除了用 if 加上多個 else if 來針對不同條件控制流程 外 , Java 還提供另一種多條件分支的敘述 ― switch 。  switch 是一種多選一的敘述。舉個例子來說 , 在本 年度初 , 我們對自己訂了幾個目標 , 如果年度考績拿 到優 , 就出國去玩;如果拿到甲 , 就買台電腦犒賞自 己;拿到乙 , 就去逛個街放鬆一下;如果考績是丙 , 就要準備翻報紙找工作了:
  • 49. switch 多條件分支  switch 多條件分支 的用法與上述的 情況十分類似 , 是由一個條件 運算式的值來 決定應執行的 對應敘述 , 語法如右:
  • 50. switch 多條件分支  switch :『選擇 . . 』的意思 , 表示要根據條件運算 式的結果 , 選擇接下來要執行哪一個 case 內的動作。 switch 之後的條件運算式的運算結果必須是 char 、 byte 、 short 、或是 int 型別的值 ( 在 Java 5.0 以 上也可使用 enum 列舉型別 , 詳情參見第 12 章 ) , 否則編譯時會出現錯誤。  case :列出個別的條件 , case 之後的條件值必須是 常數或是由常數所構成的運算式 , 且不同的 case 的 條件值運算結果不能相同。 switch 會根據條件運算 式的運算結果 , 從各個 case 挑選相同的條件值 , 並 執行對應的敘述。  break :結束 case 。
  • 51. switch 多條件分支  雖然 switch 表面上看起來跟 if 完全不同 , 但是 switch 私底下仍然是使用條件運算式與條件值的比 較來作為其控制流程的機制。  如下圖。
  • 53. switch 多條件分支  根據上述 switch 語法 , 年度考績的例子就可以寫成 以下的 switch 程式片段:
  • 54. switch 多條件分支  以下是實際的程式範例 , 我們將設計一個可以依季節 來判斷該穿什麼衣服的程式:
  • 57. switch 多條件分支  程式一開始先顯示訊息請使用者選擇季節 , 然後讓使 用者輸入代表季節的數字 , 並且將該數字轉成整數之 後放入 season 變數中 , 最後使用 switch 敘述顯示 適合於該季節的穿著。  您可以看到 , switch 敘述會依據 season 的值 , 去 執行對應 case 內的敘述。 ▪ 注意到每一個 case 可以對應多個敘述 , 而不是只能有 單一敘述 , 然後接著 break 。 ▪ 請切記 switch 後的條件運算式運算結果只能是 char 、 byte 、 short 、以及 int 等型別。
  • 58. 5-3-1 break 敘述的重要性  前面提過 break 是用來結束單一個 case, 如果不加 上 break, 程式也能執行 , 但是會發生程式繼續往下 一個 case 對應的敘述執行的情況 , 例如。
  • 61. break 敘述的重要性  由於 case 1 的敘述中沒有 break, 因此 , 程式就會 繼續執行第 22 行的程式 , 直到遇到第 23 行的 break 才中斷。  雖然遺漏 break 可能會讓程式執行的結果錯誤 , 但 有些情況下不使用 break 卻可以縮短程式的長度 , 請看以下這個範例:
  • 65. break 敘述的重要性  由於漢堡餐及起司堡餐的價錢一樣 , 因此我們故意拿 掉 case 2 的敘述以及 break, 當使用者輸入 2 號 餐時 , switch 便會選擇第 22 行的 case 2 來執行。  由於 case 2 並無 break, 故程式繼續往下執行第 24 行的程式 , 直到第 25 行的 break 才中斷 switch 敘述。  如果不這樣寫 , 就得在第 22 行之後重複一段和第 24 ~ 25 一樣的程式。
  • 66. 5-3-2 捕捉其餘狀 況的 default  在 switch 內還可以加上一個 default 敘述 , 用來捕 捉條件運算式與所有 case 條件值都不相符的狀況 , 就像是 else 用來捕捉所有的 if 條件都不成立的狀 況一樣。  語法如下。
  • 68. 捕捉其餘狀 況的 default  以之前的點餐程式為例 , 如果使用者輸入了非 1 ~ 4 的數值 , switch 敘述並不會處理 , 只會簡單的跳出 switch 敘述 , 我們可以加上 default 來處理這樣的 狀況。
  • 71. 捕捉其餘狀 況的 default  這樣一來 , 當使用者輸入的數值不符合可以點餐的數 值時 , 就會執行 default 條件的敘述 , 顯示訊息告知 使用者了。 ▪ 通常我們會把 default 寫在 switch 的最後面 , 但 default 也可以寫在各個 case 的前面 , 其效果和寫在 最後面完全一樣 , 此時請記得在 default 對應敘述的 最後加上 break, 以終止 default 。
  • 72.  5-A 判斷是否可為三角形三邊長  5-B 電影票票價計算  5-C 利用手機號碼前四碼判斷使用者使用的電信系統
  • 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.
  • 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.
  • 75. ▪ 當 s 為 null 時 , 執行 『 s == null 』 結果會是 true, 而執行 『 s.length() = 0 』 時則會造成錯誤。在第 4 行若將 | 改為短路的 ||, 則可以正確執行 , 並輸出 NULL 。
  • 77. What will be the result? A. Compilation fails. B. ? C. b D. ?bc E. bc
  • 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.
  • 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
  • 81. 6. What will be the result to run the following program? A. Cool D. CoolColdWarm B. Cold C. CoolCold E. ColdHotAndWarm
  • 83. What is the result? A. 1000 B. 1010 C. 1011 D. 1100 E. 1101 當有多個 if 、 else 時 , 若沒有以大括號標出範圍 , 則會 以較內層的優先配對。例如 if()...if()...TIIP else, 則 else 會和第二個 if 配對。
  • 84. 8. Which three of following statements are illegal?
  • 85. A. S1 B. S2 C. S3 D. S4 E. S5