1 第 4 章 流程控制 4-1 循序結構 4-2 選擇結構 4-3 重複結構 4-4...

Post on 19-Dec-2015

246 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

第 4章 流程控制

4-1 循序結構 4-2 選擇結構 4-3 重複結構4-4 其他迴圈相關敘述 4-5 本章綜合練習

2

4-1 循序結構

循序結構的程式,是以程式第一行敘述為進入點,依序由上往下執行到程式的最後一行敘述。以下是流程示意圖:

3

循序式結構的流程示範: CH04_01

程式範例是很簡單的輸出輸入功能,不過是用來說明循序結構由上往下的執行順序。

4

選擇結構

選擇結構的條件敘述是讓程式能夠選擇應該執行的程式碼,就好比各位開車到十字路口,可根據不同的狀況來選擇需要的路徑。

C 中提供了五種相實用的條件控制敘述,分別為 if 、 if-else 、條件運算子、 if else if 以及 switch 控制敘述等五種。

5

選擇結構流程示意圖

6

if 條件敘述

if 敘述式是最簡單的一種條件判斷式,可先行判斷條件敘述是否成立,再依照結果來決定所要執行的程式敘述。

在 C 中,經過比較運算子的運算,其中非 0( 零 ) 的數都會被視為真 (true) ,而將 0 視為假 (false) 。

7

if 條件敘述的流程圖

8

if 條件敘述的應用與示範: CH04_02

程式範例是讓各位輸入停車時數,以一小時 50 元收費,當大於一小時才開始收費,並列印出停車費用。

9

if- else 條件敘述

if-else 敘述提供了兩種不同的選擇,可以比單純只使用 if 條件敘述,節省更多判斷的時間。

if-else 敘述的作用是當 if 的判斷條件成立時,就執行程式區塊內的敘述,如果不成立,就會執行 else 後的敘述區塊。

10

if else 條件敘述的流程圖

11

if else 條件敘述的應用與示範: CH04_03

程式範例是利用 if else 條件敘述來判斷所輸入的國文成績是否及格,如果大於或等於 60 則列印 " 本科成績及格 ." ,否則列印 " 本科成績不及格 ." 。

12

條件運算子

條件運算子 (conditional operator) 是 C 中唯一的一個三元運算子 (ternary operator) ,它和 if else 條件敘述功能一樣,可以用來替代簡單的 if else 條件敘述,讓程式碼看起來更為簡潔。語法格式如下: 條件運算式?程式敘述一:程式敘述二 ;

13

條件運算子的應用與示範: CH04_04

程式範例是利用條件運算子來判斷所輸入的數字為偶數與奇數,並列印其判斷結果。

14

if else if 條件敘述

if else if 條件敘述是一種多選一的條件敘述,讓使用者在 if 敘述和 else if 中選擇符合條件運算式的程式敘述區塊,如果以上條件運算式都不符合,就執行最後的 else 敘述,或者這也可看成是一種巢狀 if else 結構。

並非每個 if 都會有對應的 else ,但是 else 一定對應到最接近的一個 if ,如果對應錯誤,往往會造成不同的結果,這也是日後各位除錯時容易犯的小 bug 。

15

if else if 條件敘述的流程圖

16

if else if 條件敘述與閏年的判斷應用與示範: CH04_05

程式範例是利用 if else if 條件敘述來執行潤年計算規則,以讓使用者輸入西元年來判斷是否為潤年。

17

switch 條件敘述

在進行多重選擇的時候,過多的 else-if 條件敘述經常會造成程式維護上的困擾。

C 提供了 switch 條件敘述,讓程式更加簡潔清楚。

switch 敘述必須依據同一個運算式的不同結果來選擇所要執行的 case 敘述。

18

「失敗經過」 (falling through) 現象

switch 條件敘述,如果找到相同的結果值則執行該 case 內的程式敘述,當執行完任何 case 區塊後,並不會直接離開 switch 區塊。

通常每道 case 敘述最後,必須加上 break敘述來結束 switch 敘述,才可以避免「失敗經過」的情況。

switch( 條件運算式 ) 敘述中的括號絕不可省略,這也是除錯的熱門景點之一喔!

19

switch 條件敘述的流程圖

20

switch 條件敘述的應用與示範: CH04_06

程式範例是利用 switch 條件敘述來輸入所要旅遊的地點,並分別顯示其價格。

其中大小寫字母都代表同一地點,並利用 break 的特性,設定多重的 case 條件。

21

重複結構

重複結構是一種迴圈控制,根據所設立的條件,重複執行某一段程式敘述,直到條件判斷不成立,才會跳出迴圈。迴圈種類 功能說明

for敘述 適用於計數式的條件控制,使用者已事先知道迴圈的次數。

while敘述 迴圈次數為未知,必須滿足特定條件,才能進入迴圈,同樣的,只有不滿足條件測試後,迴圈才會結束。

do-while敘述 會先執行一次迴圈內的敘述,再進行條件測試。

22

for 迴圈敘述

1.設定控制變數起始值。2. 如果條件運算式為真則執行 for 迴圈內的

敘述。3. 執行完成之後,增加或減少控制變數的

值,可視使用者的需求來作控制,再重複步驟 2 。

4. 如果條件運算式為假,則跳離 for 迴圈。

23

for 迴圈敘述的流程圖

24

for 迴圈敘述的應用與示範: CH04_07

程式範例是利用 for 迴圈來計算 1 加到 10 的累加值,是相當經典的 for 迴圈教學範例。

25

巢狀 for 迴圈

所謂巢狀 for 迴圈,就是多層式的 for 迴圈架構。

巢狀 for 迴圈結構中,執行流程必須先將內層迴圈執行完畢,才會繼續執行外層迴圈,容易犯錯的地方是迴圈間不可交錯。

26

九九乘法表的列印實作: CH04_08

程式範例是利用巢狀 for 迴圈來設計的九九乘法表列印實作。

其中兩個 for 迴圈的執行次數都是 9次,所以內圈的「 printf("%d x %d=%d\t", b, a, a*b); 」敘述共執行了 81次。而外圈的「 printf("\n"); 」只執行 9次。

27

while 迴圈敘述

while 迴圈敘述與 for 迴圈敘述類似,都是屬於前測試型迴圈。

運作方式則是在程式敘述區塊中的開頭必須先行檢查條件運算式,當運算式結果為 true 時,才會執行區塊內的程式。

while 迴圈還必須自行加入起始值與設定一個變數作為計數器,當每執行一次迴圈,在程式區塊敘述中計數器的值必須要改變,否則如果條件式永遠成立時,也將造成所謂無窮迴圈。

28

while 迴圈敘述的流程圖

29

while 迴圈敘述來計算 n! 的值: CH04_09

程式範例是利用利用 while 迴圈讓使用者輸入 n 值,並分別計算 1! 到 n! 的值。

程式中的 i 就是 while 迴圈中控制迴圈的計數器。

30

一個整數的所有正因數: CH04_10

程式範例也是利用 while 迴圈來求出使用者所輸入整數的所有正因數。

while 迴圈中,藉由「 a<=n 」的條件式以及「 a++; 」敘述來控制程式重複的次數。

31

do while 迴圈敘述

do-while 迴圈敘述無論如何一定會先執行迴圈內的程式敘述,再測試條件式是否成立,如果成立的話再返回迴圈起點重複執行敘述。

do-while 迴圈內的程式敘述,無論如何至少會被執行一次。

32

do while 迴圈敘述的流程圖

33

do while 迴圈的應用實作: CH04_11

程式範例是利用 do while 迴圈敘述來由使用者輸入 n 值,當 n 小於 10 時才進行 1 到 n 的累加計算。

過當 n 大於 10 時, do while 敘述還是會執行一次迴圈內的敘述,這點可是和使用 while 迴圈敘述不同之處。

34

蝸牛爬樹問題: CH04_12

這個程式範例也是利用 do while 迴圈敘述來解決蝸牛爬樹問題。

假如有一隻蝸牛爬一棵 10公尺的大樹,白天往上爬 2 公尺,但晚上會掉下 1 公尺,請問要幾天才可爬到樹頂?

35

其他迴圈相關敘述

一個由 C 的基本流程控制寫出的應用程式,有時候會出現一些特別的需求。

要跳出程式敘述區塊或者返回迴圈起點時,就可以使用 break 或 continue 敘述,又或是想要將程式流程直接改變至任何位置執行,也可以使用 goto 敘述來達成。

36

break 敘述

break 敘述在之前多重選擇 switch 敘述中已經使用過,相信各位應該有點眼熟不過 break 並不只限於和 switch搭配使用,任何一種迴圈類型,都能使用 break 敘述來強制跳出所在的迴圈敘述區塊。

break 敘述在巢狀迴圈中的內層迴圈,一旦執行 break 敘述時, break 就會立刻跳出最近的一層迴圈區塊,並將控制權交給區塊外的下一行程式。

37

break 敘述的應用與示範: CH04_13

程式範例是利用 break 敘述來控制九九乘法表的列印程式,由使用者輸入數字,並列印此數字之前的九九乘法表項目。

38

continue 敘述

continue 敘述的功能是強迫 for 、 while 、do while 等迴圈敘述,結束正在迴圈本體區塊內進行的程序,而將控制權轉移到迴圈開始處。

continue 與 break 敘述的最大差別在於 continue 只是忽略之後未執行的敘述,但並未跳離迴圈。語法格式如下: continue;

39

continue 敘述的應用與示範: CH04_14

程式範例是利用 continue 敘述來控制九九乘法表的列印程式,由使用者輸入數字,並列印所指定數字之外的所有九九乘法表項目。

40

簡單密碼驗證程式: CH04_15

程式範例是同時結合 break 以及 continue 敘述特性來設計一程式讓使用者輸入密碼後,進行簡單密碼驗證工作,不過輸入次數以三次為限喔!

41

goto 敘述

goto 敘述是一種允許強制跳脫的流程控制敘述,只要在 goto 敘述所要前往的程式敘述所在設立標記,就可以直接從 goto 所在位置跳到標記處。

goto 敘述必須搭配設定的標籤來使用,而標籤名稱則是一個識別字加上冒號 ( : ) 所組成。

程式執行到 goto 敘述時,便會跳躍至標籤名稱所在敘述,而繼續往下執行。

42

goto 敘述的應用與示範: CH04_16

程式範例用來說明 goto 敘述的使用方式,其中分別設定了三個標籤,透過 if 敘述判斷,只要程式執行到所搭配的 goto 敘述,則會跳至該標籤敘述,繼續往下執行。

43

kbhit()函數應用

kbhit()函數含括在 <conio.h>標頭檔內,主要功用是在不會中斷程式來等待使用者輸入的情況下,會去檢查緩衝區是否有資料。

適合在某些需要程式持續執行,直到使用者碰觸任一按鍵,才產生其它執行請求的狀況,例如螢幕保護程式。

44

體重計算程式實作: CH04_17.c

while 迴圈重複在畫面顯示字串 " 輸入任一鍵結束程式 " ,直到使用者碰觸任一鍵後才會結束執行。

45

求取最大值程式: CH04_18.c

設計一程式,讓使用者輸入任意數目之數字,並利用 for 迴圈來輸入與尋找這些數字中的最大值。

46

π 近似值的求解程式: CH04_19.c

設計一程式可輸入 k 值,求 π 的近似值: ,其中 k 的值越大, π 的近似

值越精確。

k

n

n

n0 12

)1(

4

47

n! 的計算程式: CH04_20.c

利用 while 迴圈讓使用者輸入 n 值,並計算 n! 的值。

48

商品金額與折扣計算 榮欽百貨公司準備促銷三種商品,再依照顧客消

費金額進行折扣優惠。促銷的商品資料如下:

根據上表,可計算出顧客的總消費金額。至於折扣如下表所示:

商品代碼 商品名稱 價格X或 x 電冰箱 10000

Y或 y 冷氣機 15000

Z或 z 個人電腦 25000

消費金額 折扣15萬元 15%

10萬元 10%

5萬元以下 5%

49

商品金額與折扣計算程式: CH04_21.c

利用 switch 敘述來撰寫一程式,依據商品金額以及購買數量,計算出總消費金額、折扣金額以及應付金額。

50

判斷使用者所輸入的數為整數或奇數: CH04_22.c

各位可經由數值與 1 進行 & 運算的結果來判斷其為奇數或偶數。請設計一程式,使用 & 運算子來判斷使用者所輸入的數為整數或奇數。

top related