王智祥
著
第五章 程式流程控制
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 敘述
5-1-1 循序結構 5-1 流程控制簡介
P 5-2
是一個程式敘述由上而下接著一個程式敘述的執行 指令。
Entry
Exit
程式敘述
程式敘述
程式敘述
如圖所示:
5-1-2 選擇結構 5-1 流程控制簡介
P 5-3
是一種條件控制敘述,包含有一個條件判斷式,如果條件為真,則執行某些程式,一旦條件為假,則執行另一些程式。
如圖所示:
程式敘述 程式敘述
Entry
Exit
條件
5-1-3 重複結構 5-1 流程控制簡介
P 5-3
重複結構主要是迴圈控制的功能。
迴圈 (loop) 會重複執行一個程式區塊的程式碼,直到符合特定的結束條件為止。
依照結束條件的位置不同分為兩種:
1. 前測試型迴圈:迴圈結束條件在程式區塊的前頭。符合條件者,才執行迴圈內的敘述。
2. 後測試型迴圈:迴圈結束條件在程式區塊的結尾。所以至少會執行一次迴圈內的敘述,再測試條件是否成立,若成立則返回迴圈起點重複執行迴圈。
5-1-3 重複結構 5-1 流程控制簡介
P 5-4
1. 前測試型迴圈: 2. 後測試型迴圈:
程式敘述
Entry
Exit
條件條件不成立
程式敘述
Entry
Exit
條件
條件成立
條件不成立
5-2-1 if 條件敘述 (1) 5-2 認識選擇結構
P 5-5
當 if 的判斷條件成立時(傳回 1 ),程式將執行括號內的敘述;否則測試條件不成立(傳回 0 )時,則不執行括號敘述並結束 if 敘述。
如圖所示:
其它敘述
條件
{ 程式敘述區 }
結束 if
條件成立 (1)
條件不成立 (0)
5-2-1 if 條件敘述 (1)
if ( 條件運算子){ 程式敘述;}
if ( 條件運算子 ) 程式敘述 ;
5-2 認識選擇結構
P 5-5
if 敘述的語法格式如下所示:
如果 {} 區塊內的僅包含一個程式敘述,則可省略括號{ } ,語法如下所示:
5-2-1 if 條件敘述 (2) 5-2 認識選擇結構
P 5-6
程式範例: If 敘述的應用範例:CH05_01.c
5-2-1 if 條件敘述 (2) 5-2 認識選擇結構
P 5-7
在第 8 行中請輸入某一數值給變數 charge ,第 9 行的 if 敘述便會判斷 charge 是否大於等於 100 ,如果判斷式成立,則顯示下一行敘述。請注意喔!由於 i 判斷式成立之後要執行多行敘述,則要使用 {}
來包含這些敘述。
執行結果
程式解說
5-2-1 if 條件敘述 (3) 5-2 認識選擇結構
P 5-7
程式範例: If 敘述的進階範例:CH05_02.c
5-2-1 if 條件敘述 (3) 5-2 認識選擇結構
P 5-8
在第 10 、 11 行將使用者所選擇代表平方或立方的數值,指定給變 數 select_a ,接著在 12 、 17 行中使用兩個 if 敘述分別判斷
select_a 值,其中第 12 “ ” 行中使用了 等於 條件運算子 (==) ,這 和指定運算子 (=) 並不相同,請各位留意。
範例中當使用者輸入 1( 平方 ) 時,程式會先執行第一個 if 敘述。
執行結果
程式解說
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)
5-2-2 if-else條件敘述 (1)
if ( 條件運算式 ){
}else{
}
程式敘述 ;
程式敘述 ;
5-2 認識選擇結構
P 5-9
if-else 敘述的語法格式如下所示:
5-2-2 if-else條件敘述 (2) 5-2 認識選擇結構
P 5-10
程式範例: If-else 敘述的應用範例:CH05_03.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 之後的敘 述。
執行結果
程式解說
5-2-2 if-else條件敘述 (3) 5-2 認識選擇結構
P 5-12
程式範例: If else if 敘述的應用範例:CH05_04.c
5-2-2 if-else條件敘述 (3) 5-2 認識選擇結構
P 5-12
在 9~18 行中,各位可在 if 敘述和 else if 中選擇符合條件運算式的程式敘述區塊,如果以上條件運算式都不符合,就執行
最後的 else 敘述。
執行結果
程式解說
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)
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 敘述。
5-2-3 switch選擇敘述 (1) 5-2 認識選擇結構
P 5-14
底下即為 switch 的標準格式:
5-2-3 switch選擇敘述 (2) 5-2 認識選擇結構
P 5-15
程式範例: switch 敘述的應用範例: CH05_05.c
開啟CH05_05.c
在此程式的執行結果中可以發現,執行過第 16 行「 case ‘+’ :」後面的 printf 敘述之後, break 敘述便立刻跳出switch 敘述。
如果沒有加上 break 敘述的 話,程式將繼續往下執行。
執行結果 程式解說
5-3 重複式結構
1. 迴圈的執行主體,由程式敘述或複合敘述組成。2. 迴圈的條件判斷,決定迴圈何時停止執行。
5-3 重複式結構
P 5-16
重複式結構 (iteration structure) ,是一種迴圈(loop) 控制,根據所設立的條件,重複執行某一段程式敘述,直到條件判斷不成立,才會跳出迴圈。
迴圈主要由底下的兩個基本元素組成:
5-3-1 for重複結構 (1) 5-3 重複式結構
P 5-17
for 迴圈必須事先指定迴圈控制變數的起始值、條件以及控制變數的增減值,以決定迴圈重複的次數。
for 迴圈的執行流程:
其它敘述
重複條件式
{ 程式敘述 增減控制變數的值 }
離開 for 迴圈
條件成立 (1)
條件不成立 (0)
設定起始值
進入 for 迴圈
5-3-1 for重複結構 (1)
for( 控制變數起始值 ; 迴圈重複條件式 ; 控制變數增減值 ){
} 程式敘述 ;
5-3 重複式結構
P 5-17
底下為 for 迴圈的格式:
for 迴圈中的三個運算式必須以分號 ( ; ) 分開,而且一定要設定跳離迴圈的條件以及控制變數的遞增
或遞減值。
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 的程式片斷:
5-3-1 for重複結構 (2) 5-3 重複式結構
P 5-18
程式範例: for 條件敘述與 n! 的應用範例:CH05_06.c
5-3-1 for重複結構 (2) 5-3 重複式結構
P 5-19
在第 8 行中 for 敘述中我們先設定了變數 i 的起始值為 1 , 迴圈重複條件為 I 小於等於 10 , I 的遞增值為 1 ,所以
當 I 大於 10 時,就會離開 for 迴圈。
執行結果
程式解說
5-3-1 for重複結構 (2)
for( 控制變數起始值 1; 迴圈重複條件式 ; 控制變數增減值 ){
for( 控制變數起始值 2; 迴圈重複條件式 ; 控制變數增減值) {
}}
程式敘述 ;
程式敘述 ;
5-3 重複式結構
P 5-19
在此還要介紹一種 for 的巢狀迴圈 (Nested loop) 。
在巢狀 for 迴圈結構中,執行流程必須先等內層迴圈執行完畢,才會繼續執行外層迴圈。
兩層式的巢狀 for 迴圈結構格式如下:
5-3-1 for重複結構 (3) 5-3 重複式結構
P 5-19
程式範例: 巢狀 for 條件敘述與 n! 的應用範例:CH05_07.c
5-3-1 for重複結構 (3)
5-3 重複式結構
P 5-20
在本程式中,是利用巢狀迴圈 (Nested loop) 來列印 n! 及其值。第 8 行外層 for 迴圈控制 i 輸出,而第 10 行則利用內層 for 迴圈控
制 sum 輸出。請注意!for 迴圈雖然具有很大的彈性,使用時務必要設定跳離迴圈的條件,否
則程式將會陷入無窮迴圈。
執行結果
程式解說
5-3-2 while迴圈敘述 (1) 5-3 重複式結構
P 5-21
while 結構與 for 結構類似,都是屬於前測試型迴圈。
下圖為 while 敘述執行的流程:
其它敘述
while 條件式
{ while 程式敘述 增減運算式 }
離開 while 迴圈
條件成立 (1)
條件不成立 (0)
進入 while 迴圈
5-3-2 while迴圈敘述 (1)
while( 重複條件式 ){
程式敘述 ;}
5-3 重複式結構
P 5-21
迴圈內的敘述可以是一個敘述或是多個陳述句。
如果有多個陳述句在迴圈中執行,可以使用大括號括住。
While 敘述的語法大致如下:
While 迴圈必須自行加入起始值以及遞增或遞減運算式,否則條件式永遠成
立時,將造成無窮迴圈。
5-3-2 while迴圈敘述 (2) 5-3 重複式結構
P 5-22
程式範例: While 條件敘述的說明與應用範例:CH05_08.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 。
執行結果
程式解說
5-3-3 do-while敘述 (1) 5-3 重複式結構
P 5-23
do-while 敘述會先執行迴圈內的程式敘述,再測試條件式是否成立,如果成立的話再返回迴圈起點重複執行敘述。
do-while 敘述執行的流程:
繼續下一個敘述
while 條件式
do{ 程式敘述 增減運算式 }
離開 do-while 迴圈
條件成立(1)
條件不成立 (0)
進入 do-while 迴圈
5-3-3 do-while敘述 (2) 5-3 重複式結構
P 5-24
程式範例: do While 條件敘述的說明與應用範例:CH05_09.c
5-3-3 do-while敘述 (2) 5-3 重複式結構
P 5-24
在第 9 行中要計算 n 的階層值,所以將輸入的值存放在變數 n 。第 16 行則於每次迴圈時遞減 1 ,當 n 等於 1 時對於運算結果並不會有任何改變。因此第 17 行中將迴圈重複執行的條件設為 n>1 ,以避免進入 do-while 迴圈做不必要的運算。
執行結果
程式解說
5-3-3 do-while敘述 (3) 5-3 重複式結構
P 5-25
程式範例: While 與 do While 條件敘述的比較範例:CH05_10.c
執行結果
5-3-3 do-while敘述 (4) 5-3 重複式結構
P 5-26
程式範例: do While 與 While 條件敘述的比較範例:CH05_11.c
執行結果
5-4-1 break敘述 (1)
break;
5-4 跳離迴圈敘述
P 5-27
break 敘述在多重選擇 switch 敘述中已使用過 ,不過 break 並不只限於和 switch 搭配使用
,它的主要用途是用來跳離最近的for 、 while 、 do - while 、與 switch 的敘述本體區塊,並將控制權交給區塊之外的下一行程式。
語法格式如下:
5-4-1 break敘述 (2)
程式範例: break 敘述的說明與應用範例:CH05_12.c
5-4 跳離迴圈敘述
P 5-27
5-4-1 break敘述 (2) 5-4 跳離迴圈敘述
P 5-28
在程式第 12 行的 if 敘述,在 b 的值大於 4 時就會執行break 敘述,並跳出最近的 for 迴圈到第 16 行來繼續執行。
執行結果
程式解說
5-4-2 continue敘述 (1)
continue;
5-4 跳離迴圈敘述
P 5-28
在迴圈中遇到 continue 敘述時,會跳過該迴圈剩下的敘述,重新執行下一次的迴圈;而將控制權轉移到迴圈開始處,再開始新的迴圈週期。
continue 與 break 的差異處在於 continue 只是忽略之後未執行的敘述,但並未跳離迴圈。
語法格式如下:
5-4-2 continue敘述 (2) 5-4 跳離迴圈敘述
P 5-29
程式範例: continue 敘述的說明與應用範例: CH05_13.c
5-4-2 continue敘述 (2) 5-4 跳離迴圈敘述
P 5-29
程式第 13 行的 if 敘述,在 b 的值大於 4 時就會執行continue 敘述,而回到第 9 行的 for 迴圈繼續執行,所以5 還是會被印出。
執行結果
程式解說
5-4-3 goto敘述 (1)
goto 標籤名稱 ; ...
標籤名稱:
5-4 跳離迴圈敘述
P 5-30
goto 敘述的語法如下所示:
goto 敘述必須搭配設定的標籤來使用,而標籤名稱 則是一個識別字加上冒號 ( : ) 所組成。
標籤名稱不一定要在 goto 的下方,它可以出現 在程式中任意的位置。
5-4-3 goto敘述 (2) 5-4 跳離迴圈敘述
P 5-30
隨堂範例: goto 敘述的應用與示範:CH05_14.c
5-4-3 goto敘述 (2) 5-4 跳離迴圈敘述
P 5-31
第 13 行中使用 if 判斷式,如果成立就執行 14 行 goto 敘述。在第 21 行中設定了 一個標籤,只要程式執行到所搭配的goto 敘述,則會跳至該標籤敘述,繼續往下執行。
執行結果
程式解說
5-5 上機實習課程 (1) 5-5 上機實習課程
P 5-32
上機實習範例: CH05_15.c
請設計一程式,讓使用者輸入一整數,並判斷是否為 2 或 3 的倍數 ,不過卻不能為 6 的倍數。
執行結果
5-5 上機實習課程 (2) 5-5 上機實習課程
P 5-33
上機實習範例: CH05_16.c
請使用雙重 for 迴圈來設計一程式,描繪出如下圖畫面:
5-5 上機實習課程 (2) 5-5 上機實習課程
P 5-33
上機實習範例: CH05_16.c
執行結果
5-5 上機實習課程 (3)
112123123412341234
5-5 上機實習課程
P 5-34
上機實習範例: CH05_17.c
請使用雙重 for 迴圈與 break 指令來設計一程式,描繪出如下圖畫面:
5-5 上機實習課程 (3) 5-5 上機實習課程
P 5-35
上機實習範例: CH05_17.c
執行結果
5-5 上機實習課程 (4) 5-5 上機實習課程
P 5-36
上機實習範例: CH05_18.c
以下程式範例是請使用者輸入一個代表成績的字元,包括A 、 B 、 C 、 D 、 E 五級,輸入大小寫字母都可接受,並輸出所代表的成績意義。如果所輸入的不是以上字元,將輸出 " 沒有此分數群組 " 。
開啟CH05_18.c
執行結果
5-5 上機實習課程 (5) 5-5 上機實習課程
P 5-37
上機實習範例: CH05_19.c
以下程式範例是請使用者輸入一個整數,並將此整數的每一個數字反向 輸出,例如輸入 12345 ,這是程式可輸出 54321 。
執行結果
5-5 上機實習課程 (6) 5-5 上機實習課程
P 5-38
上機實習範例: CH05_20.c
請利用輾轉相除法與 while 迴圈來設計一程式,來求取輸入兩數的最 大公因數 (g.c.d) 。
執行結果
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 ,來計算以下式子的總和:
執行結果
5-5 上機實習課程 (8)
1!+2!+3!+4!+….+n-1!+n!
5-5 上機實習課程
P 5-40
上機實習範例: CH05_22.c
請利用雙重 for 迴圈來設計一 C 程式, . 輸入整數 n ,求出 1!+2!+...+n! 的合。如右所示:
執行結果
5-5 上機實習課程 (9) 5-5 上機實習課程
P 5-41
上機實習範例: CH05_23.c請設計一程式讓使用者輸入一整數,
並輸出 2 到 n 之間所有的質數(prime number) ,設計本程式時要
求必須同時使用 for 及 while 迴圈。
執行結果
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 指令來設計一個程式,並計算每月電費。
5-5 上機實習課程 (10) 5-5 上機實習課程
P 5-42
上機實習範例: CH05_24.c
執行結果