C語言 第五章 程式流程控制

61
第五章 程式流程控制 5-1 流程控制簡介 5-2 認識選擇結構 5-1-1 循序結構 5-2-1 if 條件敘述 5-2-2 if-else 條件敘述 5-2-3 switch 選擇敘述 5-3-1 for 重複結構 5-3-2 while 迴圈敘述 5-3-3 do-while 敘述 5-5 上機實習課程 5-3 重複式結構 5-4 跳離迴圈敘述 5-1-2 選擇結構 5-1-3 重複結構 5-4-1 break 敘述 5-4-2 continue 敘述 5-4-3 goto 敘述

Transcript of C語言 第五章 程式流程控制

Page 1: C語言 第五章 程式流程控制

王智祥

第五章 程式流程控制

5-1 流程控制簡介

5-2 認識選擇結構

5-1-1 循序結構

5-2-1 if 條件敘述5-2-2 if-else 條件敘述5-2-3 switch 選擇敘述

5-3-1 for 重複結構5-3-2 while 迴圈敘述5-3-3 do-while 敘述

5-5 上機實習課程

5-3 重複式結構

5-4 跳離迴圈敘述

5-1-2 選擇結構5-1-3 重複結構

5-4-1 break 敘述5-4-2 continue 敘述5-4-3 goto 敘述

Page 2: C語言 第五章 程式流程控制

5-1-1 循序結構 5-1 流程控制簡介

P 5-2

是一個程式敘述由上而下接著一個程式敘述的執行 指令。

Entry

Exit

程式敘述

程式敘述

程式敘述

如圖所示:

Page 3: C語言 第五章 程式流程控制

5-1-2 選擇結構 5-1 流程控制簡介

P 5-3

是一種條件控制敘述,包含有一個條件判斷式,如果條件為真,則執行某些程式,一旦條件為假,則執行另一些程式。

如圖所示:

程式敘述 程式敘述

Entry

Exit

條件

Page 4: C語言 第五章 程式流程控制

5-1-3 重複結構 5-1 流程控制簡介

P 5-3

重複結構主要是迴圈控制的功能。

迴圈 (loop) 會重複執行一個程式區塊的程式碼,直到符合特定的結束條件為止。

依照結束條件的位置不同分為兩種:

1. 前測試型迴圈:迴圈結束條件在程式區塊的前頭。符合條件者,才執行迴圈內的敘述。

2. 後測試型迴圈:迴圈結束條件在程式區塊的結尾。所以至少會執行一次迴圈內的敘述,再測試條件是否成立,若成立則返回迴圈起點重複執行迴圈。

Page 5: C語言 第五章 程式流程控制

5-1-3 重複結構 5-1 流程控制簡介

P 5-4

1. 前測試型迴圈: 2. 後測試型迴圈:

程式敘述

Entry

Exit

條件條件不成立

程式敘述

Entry

Exit

條件

條件成立

條件不成立

Page 6: C語言 第五章 程式流程控制

5-2-1 if 條件敘述 (1) 5-2 認識選擇結構

P 5-5

當 if 的判斷條件成立時(傳回 1 ),程式將執行括號內的敘述;否則測試條件不成立(傳回 0 )時,則不執行括號敘述並結束 if 敘述。

如圖所示:

其它敘述

條件

{ 程式敘述區 }

結束 if

條件成立 (1)

條件不成立 (0)

Page 7: C語言 第五章 程式流程控制

5-2-1 if 條件敘述 (1)

if ( 條件運算子){ 程式敘述;}

if ( 條件運算子 ) 程式敘述 ;

5-2 認識選擇結構

P 5-5

if 敘述的語法格式如下所示:

如果 {} 區塊內的僅包含一個程式敘述,則可省略括號{ } ,語法如下所示:

Page 8: C語言 第五章 程式流程控制

5-2-1 if 條件敘述 (2) 5-2 認識選擇結構

P 5-6

程式範例: If 敘述的應用範例:CH05_01.c

Page 9: C語言 第五章 程式流程控制

5-2-1 if 條件敘述 (2) 5-2 認識選擇結構

P 5-7

在第 8 行中請輸入某一數值給變數 charge ,第 9 行的 if 敘述便會判斷 charge 是否大於等於 100 ,如果判斷式成立,則顯示下一行敘述。請注意喔!由於 i 判斷式成立之後要執行多行敘述,則要使用 {}

來包含這些敘述。

執行結果

程式解說

Page 10: C語言 第五章 程式流程控制

5-2-1 if 條件敘述 (3) 5-2 認識選擇結構

P 5-7

程式範例: If 敘述的進階範例:CH05_02.c

Page 11: C語言 第五章 程式流程控制

5-2-1 if 條件敘述 (3) 5-2 認識選擇結構

P 5-8

在第 10 、 11 行將使用者所選擇代表平方或立方的數值,指定給變 數 select_a ,接著在 12 、 17 行中使用兩個 if 敘述分別判斷

select_a 值,其中第 12 “ ” 行中使用了 等於 條件運算子 (==) ,這 和指定運算子 (=) 並不相同,請各位留意。

範例中當使用者輸入 1( 平方 ) 時,程式會先執行第一個 if 敘述。

執行結果

程式解說

Page 12: C語言 第五章 程式流程控制

5-2-2 if-else條件敘述 (1) 5-2 認識選擇結構

P 5-9

if-else 敘述提供了兩種不同的選擇,當 if 的判斷條件 (Condition) 成立時(傳回 1 ),將執行 if 程式敘

述區內的程式;否則執行 else 程式敘述區內的程式 後結束 if 敘述。

如圖所示:

其它敘述

if 條件式

{ else 程式敘述區 }

結束 if

條件不成立 (0)

{ if 程式敘述區 }

條件成立 (1)

Page 13: C語言 第五章 程式流程控制

5-2-2 if-else條件敘述 (1)

if ( 條件運算式 ){

}else{

}

程式敘述 ;

程式敘述 ;

5-2 認識選擇結構

P 5-9

if-else 敘述的語法格式如下所示:

Page 14: C語言 第五章 程式流程控制

5-2-2 if-else條件敘述 (2) 5-2 認識選擇結構

P 5-10

程式範例: If-else 敘述的應用範例:CH05_03.c

Page 15: C語言 第五章 程式流程控制

5-2-2 if-else條件敘述 (2) 5-2 認識選擇結構

P 5-10

在第 9 行的 if(num%2) 判斷式中,由於整數除以 2 餘數只有 1 或 0 兩種,而在 C 中,非 0( 零 ) 的數都會被視為真 (true) ,

而將 0( 零 ) 視為假 (false) 。所以當餘數等於 1 時則條件式將傳回 true( 條件式成立 ) ,反之當

餘數為 0 時條件式將傳回 false ,則執行第 11 行 else 之後的敘 述。

執行結果

程式解說

Page 16: C語言 第五章 程式流程控制

5-2-2 if-else條件敘述 (3) 5-2 認識選擇結構

P 5-12

程式範例: If else if 敘述的應用範例:CH05_04.c

Page 17: C語言 第五章 程式流程控制

5-2-2 if-else條件敘述 (3) 5-2 認識選擇結構

P 5-12

在 9~18 行中,各位可在 if 敘述和 else if 中選擇符合條件運算式的程式敘述區塊,如果以上條件運算式都不符合,就執行

最後的 else 敘述。

執行結果

程式解說

Page 18: C語言 第五章 程式流程控制

5-2-3 switch選擇敘述 (1) 5-2 認識選擇結構

P 5-13

底下先以流程圖來表示 switch 敘述的執行方式:

其它敘述

switch 條件式

結束 switch

case A 敘述 break;Case A

Case B

default 敘述

case A 敘述 break;

條件不成立 (0)

條件成立 (1)

條件成立 (1)

條件不成立 (0)

條件不成立 (0)

Page 19: C語言 第五章 程式流程控制

5-2-3 switch選擇敘述 (1) 5-2 認識選擇結構

P 5-13

switch 敘述的執行過程重點說明如下:

1. 先求出運算式的值,再將此值與 case 的常數值進行比對。

1. 如果找不到吻合的常數值,則會執行 default 敘述 ,如果沒有 default 敘述則結束 switch 敘述。

1. 若找到相同的值則執行 case 內的程式敘述,執行完 任何 case 區塊後,並不會離開 switch 區塊。而是

往下繼續執行其它的 case 敘述與 default 敘述。所 以 case 敘述的最後必須加上 break 敘述來結束

switch 敘述。

Page 20: C語言 第五章 程式流程控制

5-2-3 switch選擇敘述 (1) 5-2 認識選擇結構

P 5-14

底下即為 switch 的標準格式:

Page 21: C語言 第五章 程式流程控制

5-2-3 switch選擇敘述 (2) 5-2 認識選擇結構

P 5-15

程式範例: switch 敘述的應用範例: CH05_05.c

開啟CH05_05.c

在此程式的執行結果中可以發現,執行過第 16 行「 case ‘+’ :」後面的 printf 敘述之後, break 敘述便立刻跳出switch 敘述。

如果沒有加上 break 敘述的 話,程式將繼續往下執行。

執行結果 程式解說

Page 22: C語言 第五章 程式流程控制

5-3 重複式結構

1. 迴圈的執行主體,由程式敘述或複合敘述組成。2. 迴圈的條件判斷,決定迴圈何時停止執行。

5-3 重複式結構

P 5-16

重複式結構 (iteration structure) ,是一種迴圈(loop) 控制,根據所設立的條件,重複執行某一段程式敘述,直到條件判斷不成立,才會跳出迴圈。

迴圈主要由底下的兩個基本元素組成:

Page 23: C語言 第五章 程式流程控制

5-3-1 for重複結構 (1) 5-3 重複式結構

P 5-17

for 迴圈必須事先指定迴圈控制變數的起始值、條件以及控制變數的增減值,以決定迴圈重複的次數。

for 迴圈的執行流程:

其它敘述

重複條件式

{ 程式敘述 增減控制變數的值 }

離開 for 迴圈

條件成立 (1)

條件不成立 (0)

設定起始值

進入 for 迴圈

Page 24: C語言 第五章 程式流程控制

5-3-1 for重複結構 (1)

for( 控制變數起始值 ; 迴圈重複條件式 ; 控制變數增減值 ){

} 程式敘述 ;

5-3 重複式結構

P 5-17

底下為 for 迴圈的格式:

for 迴圈中的三個運算式必須以分號 ( ; ) 分開,而且一定要設定跳離迴圈的條件以及控制變數的遞增

或遞減值。

Page 25: C語言 第五章 程式流程控制

5-3-1 for重複結構 (1)

int i=1,sum=0; /* 宣告 i初值 */for (; i<=10 ; i++) /* 省略變數起始值的設定,分號不可省略 */{ sum+=i; /* 迴圈敘述 */ printf("i=%d\t sum=%d\n", i, sum);}

5-3 重複式結構

P 5-18

for 迴圈中的三個運算式相當具有彈性,可以省略不需要的運算式,也可以擁有一個以上的運算子句。

如下是使用 for 迴圈來計算 1 加到 10 的程式片斷:

Page 26: C語言 第五章 程式流程控制

5-3-1 for重複結構 (2) 5-3 重複式結構

P 5-18

程式範例: for 條件敘述與 n! 的應用範例:CH05_06.c

Page 27: C語言 第五章 程式流程控制

5-3-1 for重複結構 (2) 5-3 重複式結構

P 5-19

在第 8 行中 for 敘述中我們先設定了變數 i 的起始值為 1 , 迴圈重複條件為 I 小於等於 10 , I 的遞增值為 1 ,所以

當 I 大於 10 時,就會離開 for 迴圈。

執行結果

程式解說

Page 28: C語言 第五章 程式流程控制

5-3-1 for重複結構 (2)

for( 控制變數起始值 1; 迴圈重複條件式 ; 控制變數增減值 ){

for( 控制變數起始值 2; 迴圈重複條件式 ; 控制變數增減值) {

}}

程式敘述 ;

程式敘述 ;

5-3 重複式結構

P 5-19

在此還要介紹一種 for 的巢狀迴圈 (Nested loop) 。

在巢狀 for 迴圈結構中,執行流程必須先等內層迴圈執行完畢,才會繼續執行外層迴圈。

兩層式的巢狀 for 迴圈結構格式如下:

Page 29: C語言 第五章 程式流程控制

5-3-1 for重複結構 (3) 5-3 重複式結構

P 5-19

程式範例: 巢狀 for 條件敘述與 n! 的應用範例:CH05_07.c

Page 30: C語言 第五章 程式流程控制

5-3-1 for重複結構 (3)

5-3 重複式結構

P 5-20

在本程式中,是利用巢狀迴圈 (Nested loop) 來列印 n! 及其值。第 8 行外層 for 迴圈控制 i 輸出,而第 10 行則利用內層 for 迴圈控

制 sum 輸出。請注意!for 迴圈雖然具有很大的彈性,使用時務必要設定跳離迴圈的條件,否

則程式將會陷入無窮迴圈。

執行結果

程式解說

Page 31: C語言 第五章 程式流程控制

5-3-2 while迴圈敘述 (1) 5-3 重複式結構

P 5-21

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

下圖為 while 敘述執行的流程:

其它敘述

while 條件式

{ while 程式敘述 增減運算式 }

離開 while 迴圈

條件成立 (1)

條件不成立 (0)

進入 while 迴圈

Page 32: C語言 第五章 程式流程控制

5-3-2 while迴圈敘述 (1)

while( 重複條件式 ){

程式敘述 ;}

5-3 重複式結構

P 5-21

迴圈內的敘述可以是一個敘述或是多個陳述句。

如果有多個陳述句在迴圈中執行,可以使用大括號括住。

While 敘述的語法大致如下:

While 迴圈必須自行加入起始值以及遞增或遞減運算式,否則條件式永遠成

立時,將造成無窮迴圈。

Page 33: C語言 第五章 程式流程控制

5-3-2 while迴圈敘述 (2) 5-3 重複式結構

P 5-22

程式範例: While 條件敘述的說明與應用範例:CH05_08.c

Page 34: C語言 第五章 程式流程控制

5-3-2 while迴圈敘述 (2)

5-3 重複式結構

P 5-22

在第 10 行 while 敘述內的條件式,是將 ch=getche() 以及 ch!=‘\r’ 兩個 敘述合併為一個敘述,也就是由鍵盤鍵入的字元會先放在 ch 變數內,再

檢查 ch ‘是否為 \r’ 。而第 12 行的 if 敘述只要檢查到空白字元時,變數 word_num 就會加1 ,而輸入的單字數目會比空白字元的數目多 1 個。而第 15 行使用了「 ++word_num 」敘述將 word_num 加 1 。

執行結果

程式解說

Page 35: C語言 第五章 程式流程控制

5-3-3 do-while敘述 (1) 5-3 重複式結構

P 5-23

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

do-while 敘述執行的流程:

繼續下一個敘述

while 條件式

do{ 程式敘述 增減運算式 }

離開 do-while 迴圈

條件成立(1)

條件不成立 (0)

進入 do-while 迴圈

Page 36: C語言 第五章 程式流程控制

5-3-3 do-while敘述 (2) 5-3 重複式結構

P 5-24

程式範例: do While 條件敘述的說明與應用範例:CH05_09.c

Page 37: C語言 第五章 程式流程控制

5-3-3 do-while敘述 (2) 5-3 重複式結構

P 5-24

在第 9 行中要計算 n 的階層值,所以將輸入的值存放在變數 n 。第 16 行則於每次迴圈時遞減 1 ,當 n 等於 1 時對於運算結果並不會有任何改變。因此第 17 行中將迴圈重複執行的條件設為 n>1 ,以避免進入 do-while 迴圈做不必要的運算。

執行結果

程式解說

Page 38: C語言 第五章 程式流程控制

5-3-3 do-while敘述 (3) 5-3 重複式結構

P 5-25

程式範例: While 與 do While 條件敘述的比較範例:CH05_10.c

執行結果

Page 39: C語言 第五章 程式流程控制

5-3-3 do-while敘述 (4) 5-3 重複式結構

P 5-26

程式範例: do While 與 While 條件敘述的比較範例:CH05_11.c

執行結果

Page 40: C語言 第五章 程式流程控制

5-4-1 break敘述 (1)

break;

5-4 跳離迴圈敘述

P 5-27

break 敘述在多重選擇 switch 敘述中已使用過 ,不過 break 並不只限於和 switch 搭配使用

,它的主要用途是用來跳離最近的for 、 while 、 do - while 、與 switch 的敘述本體區塊,並將控制權交給區塊之外的下一行程式。

語法格式如下:

Page 41: C語言 第五章 程式流程控制

5-4-1 break敘述 (2)

程式範例: break 敘述的說明與應用範例:CH05_12.c

5-4 跳離迴圈敘述

P 5-27

Page 42: C語言 第五章 程式流程控制

5-4-1 break敘述 (2) 5-4 跳離迴圈敘述

P 5-28

在程式第 12 行的 if 敘述,在 b 的值大於 4 時就會執行break 敘述,並跳出最近的 for 迴圈到第 16 行來繼續執行。

執行結果

程式解說

Page 43: C語言 第五章 程式流程控制

5-4-2 continue敘述 (1)

continue;

5-4 跳離迴圈敘述

P 5-28

在迴圈中遇到 continue 敘述時,會跳過該迴圈剩下的敘述,重新執行下一次的迴圈;而將控制權轉移到迴圈開始處,再開始新的迴圈週期。

continue 與 break 的差異處在於 continue 只是忽略之後未執行的敘述,但並未跳離迴圈。

語法格式如下:

Page 44: C語言 第五章 程式流程控制

5-4-2 continue敘述 (2) 5-4 跳離迴圈敘述

P 5-29

程式範例: continue 敘述的說明與應用範例: CH05_13.c

Page 45: C語言 第五章 程式流程控制

5-4-2 continue敘述 (2) 5-4 跳離迴圈敘述

P 5-29

程式第 13 行的 if 敘述,在 b 的值大於 4 時就會執行continue 敘述,而回到第 9 行的 for 迴圈繼續執行,所以5 還是會被印出。

執行結果

程式解說

Page 46: C語言 第五章 程式流程控制

5-4-3 goto敘述 (1)

goto 標籤名稱 ; ...

標籤名稱:

5-4 跳離迴圈敘述

P 5-30

goto 敘述的語法如下所示:

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

標籤名稱不一定要在 goto 的下方,它可以出現 在程式中任意的位置。

Page 47: C語言 第五章 程式流程控制

5-4-3 goto敘述 (2) 5-4 跳離迴圈敘述

P 5-30

隨堂範例: goto 敘述的應用與示範:CH05_14.c

Page 48: C語言 第五章 程式流程控制

5-4-3 goto敘述 (2) 5-4 跳離迴圈敘述

P 5-31

第 13 行中使用 if 判斷式,如果成立就執行 14 行 goto 敘述。在第 21 行中設定了 一個標籤,只要程式執行到所搭配的goto 敘述,則會跳至該標籤敘述,繼續往下執行。

執行結果

程式解說

Page 49: C語言 第五章 程式流程控制

5-5 上機實習課程 (1) 5-5 上機實習課程

P 5-32

上機實習範例: CH05_15.c

請設計一程式,讓使用者輸入一整數,並判斷是否為 2 或 3 的倍數 ,不過卻不能為 6 的倍數。

執行結果

Page 50: C語言 第五章 程式流程控制

5-5 上機實習課程 (2) 5-5 上機實習課程

P 5-33

上機實習範例: CH05_16.c

請使用雙重 for 迴圈來設計一程式,描繪出如下圖畫面:

Page 51: C語言 第五章 程式流程控制

5-5 上機實習課程 (2) 5-5 上機實習課程

P 5-33

上機實習範例: CH05_16.c

執行結果

Page 52: C語言 第五章 程式流程控制

5-5 上機實習課程 (3)

112123123412341234

5-5 上機實習課程

P 5-34

上機實習範例: CH05_17.c

請使用雙重 for 迴圈與 break 指令來設計一程式,描繪出如下圖畫面:

Page 53: C語言 第五章 程式流程控制

5-5 上機實習課程 (3) 5-5 上機實習課程

P 5-35

上機實習範例: CH05_17.c

執行結果

Page 54: C語言 第五章 程式流程控制

5-5 上機實習課程 (4) 5-5 上機實習課程

P 5-36

上機實習範例: CH05_18.c

以下程式範例是請使用者輸入一個代表成績的字元,包括A 、 B 、 C 、 D 、 E 五級,輸入大小寫字母都可接受,並輸出所代表的成績意義。如果所輸入的不是以上字元,將輸出 " 沒有此分數群組 " 。

開啟CH05_18.c

執行結果

Page 55: C語言 第五章 程式流程控制

5-5 上機實習課程 (5) 5-5 上機實習課程

P 5-37

上機實習範例: CH05_19.c

以下程式範例是請使用者輸入一個整數,並將此整數的每一個數字反向 輸出,例如輸入 12345 ,這是程式可輸出 54321 。

執行結果

Page 56: C語言 第五章 程式流程控制

5-5 上機實習課程 (6) 5-5 上機實習課程

P 5-38

上機實習範例: CH05_20.c

請利用輾轉相除法與 while 迴圈來設計一程式,來求取輸入兩數的最 大公因數 (g.c.d) 。

執行結果

Page 57: C語言 第五章 程式流程控制

5-5 上機實習課程 (7)

1*1+2*2+3*3+4*4+….+n-1*n-1+n*n

5-5 上機實習課程

P 5-39

上機實習範例: CH05_21.c

請利用 for 迴圈來設計一 C 程式,可輸入一小於 100 的整數 n ,來計算以下式子的總和:

執行結果

Page 58: C語言 第五章 程式流程控制

5-5 上機實習課程 (8)

1!+2!+3!+4!+….+n-1!+n!

5-5 上機實習課程

P 5-40

上機實習範例: CH05_22.c

請利用雙重 for 迴圈來設計一 C 程式, . 輸入整數 n ,求出 1!+2!+...+n! 的合。如右所示:

執行結果

Page 59: C語言 第五章 程式流程控制

5-5 上機實習課程 (9) 5-5 上機實習課程

P 5-41

上機實習範例: CH05_23.c請設計一程式讓使用者輸入一整數,

並輸出 2 到 n 之間所有的質數(prime number) ,設計本程式時要

求必須同時使用 for 及 while 迴圈。

執行結果

Page 60: C語言 第五章 程式流程控制

5-5 上機實習課程 (10)

度數 1~ 20度 21~ 60度 61~ 80度 81度以上單價 10 12.5 18 22

5-5 上機實習課程

P 5-42

上機實習範例: CH05_24.c

由使用者輸入每月用電量,並計算該月的電費。

假設每月基本費為 300 元,而電量與度數的對應表如下:

請使用 if else if 指令來設計一個程式,並計算每月電費。

Page 61: C語言 第五章 程式流程控制

5-5 上機實習課程 (10) 5-5 上機實習課程

P 5-42

上機實習範例: CH05_24.c

執行結果