第3章 程序流程控制
3.1 順序與分支結構
3.1.1 順序結構
程序的基本結構形式有順序結構、分支結構和循環結構。順序結構是程序中經常見到的,也是最簡單的一種結構。語句依次排列,就形成了順序結構。語句的先后順序決定其執行次序,也就是排在前面的語句先執行,排在后面的語句后執行。
順序結構可以獨立使用,構成一個簡單的完整程序,不過大多數情況下,順序結構都是作為程序的一部分,與其他結構一起構成一個復雜的程序。例如,分支結構中的復合語句、循環結構中的循環體等。
【例3-1】隨機生成一道20以內的加法測試題。
【程序】

【運行結果】

【程序說明】
程序中的語句就是按順序結構來組織的。先產生一個20以內的隨機整數賦值給a,再產生一個20以內的隨機整數賦值給b,最后輸出對應的加法測試題。
Math.random()調用Math類中的random()方法產生一個[0, 1)之間的double型隨機數。這樣表達式Math.random()的值是一個[0,1)之間的隨機實數,而表達式(int)(Math.random()*20)的值是一個[0, 20)之間的隨機整數。程序運行后,每次輸出的加法測試題是不一樣的。
3.1.2 if語句實現分支結構
if語句的一般格式為:

條件表達式有true和false兩種可能的取值,分別表示邏輯判斷的真和假。if語句的執行流程如圖3-1所示,如果條件表達式的值為true,就執行語句A;否則不執行語句A。

圖3-1 if語句的執行流程
這里的語句A可以是單個語句,也可以是包含多條語句的語句塊。語句塊也稱為復合語句,以“{”開始,“}”結束,中間包含若干條語句。
【例3-2】隨機生成一道20以內的減法測試題,要求被減數大于或等于減數。
【程序】

【運行結果】

【程序說明】
程序先產生一個20以內的隨機整數賦值給a,再產生一個20以內的隨機整數賦值給b。為了讓被減數大于等于減數,當a小于b時,需要將a和b的值互換。
語句塊{t=a;a=b;b=t;}中的3條語句是一個整體,在a小于b時一一執行,而在a大于或等于b時都不執行。語句塊中的3條語句用來實現變量a和變量b之間的交換。先把a暫存在變量t中,然后把b賦值給a,最后把t賦值給b。
3.1.3 if-else語句實現分支結構
if-else語句的一般格式為:

if-else語句的功能是,根據條件表達式的值,確定執行語句A或語句B,執行流程如圖3-2所示。如果條件表達式的值為true,則執行語句A;否則執行語句B。

圖3-2 if-else語句的執行流程
【例3-3】隨機生成一道20以內的加法測試題,由程序對測試者輸入的計算結果進行評判。
【程序】

【運行結果】
第1次運行:

第2次運行:

【程序說明】
程序先隨機產生一個加法測試題,再由測試者輸入計算結果,然后由程序對輸入的計算結果進行評判。計算正確輸出“Good!”,計算錯誤輸出“Wrong!”。在計算正確和錯誤兩種情況下,執行不同的語句。
3.1.4 嵌套if語句實現多分支結構
前面介紹了兩種形式的if語句。if語句所包含的語句A(或語句B)也可以是一個if語句,也就是說,if語句內嵌了另一個if語句,這種情況一般稱為嵌套if語句。多分支結構可以采用嵌套if語句來實現。
【例3-4】隨機生成一道20以內的加法、減法或乘法測試題,由計算機對測試者輸入的計算結果進行評判。
【程序】

【運行結果】
第1次運行:

第2次運行:

【程序說明】
本例不僅要求運算數據是隨機的,而且運算類型也是不確定的,可能是加、減、乘運算中的一種。如何產生一個運算類型不確定的算式呢?一個簡單的思路是,先生成一個0~2的隨機整數,然后根據整數的值輸出相應類型的算式。0、1、2對應加法、減法、乘法這3個分支,可以采用嵌套if語句實現。
3.1.5 switch語句實現多分支結構
例3-4用嵌套if語句實現了多分支選擇結構。多層的if嵌套可以實現多分支的選擇結構,但過多的if嵌套會使程序不太容易理解。Java語言提供了switch語句,用于處理多分支問題。switch語句的一般格式為:

每個case及default表示一個分支,語句執行時會根據表達式A的值,選擇執行對應的分支。switch語句的執行流程如下:
(1)首先計算表達式A的值,然后用此值依次與各個case常量表達式的值比較,當表達式A的值與某個case后面的常量表達式的值相等時,就轉去執行此case后面的語句序列,執行break語句后,退出switch語句。
(2)若表達式A的值與所有case后面的常量表達式值都不相等,則執行default后面的語句序列n+1,然后退出switch語句。
使用switch語句時,需要注意下面幾個問題:
(1)表達式A的數據類型可以是byte、short、int或char,但不可以是long、float、double和boolean。
(2)每個case后面都是常量表達式,其中不可以出現變量。每個case后常量表達式的值必須互不相同,否則就會出現互相矛盾的現象。
(3)從形式上來說,break語句并不是必需的。但去掉break語句以后,程序流程會發生變化。例如,如果把語句序列2后面的break語句刪除,那么當表達式A的值與常量表達式2的值相等時,不僅會執行語句序列2,還會執行其后的語句,一直執行至遇到break語句為止。
【例3-5】用switch語句重新編寫例3-4的程序。
【程序】

【運行結果】
第1次運行:

第2次運行:

【程序說明】
程序中op的值是用隨機方法生成的,其值只能是0、1或2。因此,default分支對應op的值為2的情況,也可以替換為case 2。另外,default分支后面沒有其他分支,因此語句序列后面可以沒有break語句。
- Objective-C Memory Management Essentials
- Java EE 6 企業級應用開發教程
- 小創客玩轉圖形化編程
- 大學計算機基礎(第2版)(微課版)
- 小程序開發原理與實戰
- 深入RabbitMQ
- 零基礎學Python網絡爬蟲案例實戰全流程詳解(入門與提高篇)
- Swift 4從零到精通iOS開發
- 計算機應用基礎教程(Windows 7+Office 2010)
- OpenStack Networking Essentials
- Modern C++ Programming Cookbook
- Practical Predictive Analytics
- LabVIEW入門與實戰開發100例(第4版)
- Clojure編程樂趣
- React and React Native