Download presentation
Presentation is loading. Please wait.
1
第4章 流程控制結構 4-1 結構化程式設計 4-2 程式區塊 4-3 簡單的條件控制敘述 4-4 巢狀條件敘述 4-5 多選一條件敘述
4-6 for計數迴圈 4-7 條件迴圈 4-8 巢狀迴圈 4-9 跳躍程式敘述
2
4-1 結構化程式設計 4-1-1 結構化程式設計 4-1-2 UML活動圖 4-1-3 流程控制的種類
3
4-1-1 結構化程式設計 結構化程式設計是一種軟體開發方法,它是一種組織和撰寫程式碼的技術,使用由上而下的設計方法(Top-down Design)來分析問題,將程式分解成階層架構的「模組」(Modules),每個模組是一段擁有獨立功能的程式碼,而且只有單一的進入點和離開點,各模組間使用三種流程控制來整合:循序結構(Sequential)、選擇結構(Selection)和重複結構(Iteration)。 結構化程式設計的主要觀念有三項,如下所示: 由上而下的設計方法,在第7章有進一步的說明。 流程控制結構。 模組。
4
4-1-2 UML活動圖-說明 「UML」(Unified Modelling Language)是一種符號語言,如同工程式師閱讀藍圖就可以蓋房子,程式設計師看到UML繪出的模型圖,就可以寫出所需的程式碼。 「活動圖」(Activity Diagram)是UML眾多符號圖形之一,主要的目的是用來描述事件流程和和所需的作業和活動。在本章筆者使用活動圖取代傳統流程圖(Flowchart),用來描述C語言流程控制的執行流程。
5
4-1-2 UML活動圖-圖例
6
4-1-3 流程控制的種類-說明 程式語言撰寫的程式碼大部分是一列指令接著一列指令循序的執行,但是對於複雜的工作,為了達成預期的執行結果,我需要使用「流程控制結構」(Control Structures)來改變執行順序。
7
4-1-3 流程控制的種類-循序結構 循序結構是程式預設的執行方式,也就是一個程式敘述接著一個敘述的依序執行,如右圖所示:
8
4-1-3 流程控制的種類-選擇結構 選擇結構(Selection)是一種條件控制敘述,它是一個選擇題,可以分為單一選擇、二選一或多選一三種。程式執行順序是依照第2章條件運算式的條件,來決定執行哪一個程式區塊的程式碼,如右圖所示:
9
4-1-3 流程控制的種類-重複結構 (說明) 重複結構是迴圈控制,可以重複執行一個程式區塊的程式碼,並且提供一個結束條件結束迴圈執行,依結束條件測試的位置不同分為兩種,如下所示: 前測式重複結構 後測式重複結構
10
4-1-3 流程控制的種類-重複結構 (前測式重複結構)
測試迴圈結束條件在程式區塊的開頭,需要符合條件,才允許執行迴圈中程式區塊的程式碼,如右圖所示:
11
4-1-3 流程控制的種類-重複結構 (後測式重複結構)
測試迴圈結束條件在程式區塊的結尾,所以迴圈的程式區塊至少執行一次,如右圖所示:
12
4-2 程式區塊-語法 程式區塊(Blocks)是一種最簡單的結構敘述,它的目的只是將零到多列的程式敘述組合成一個群組,所以也稱為「結合敘述」(Compound Statements)。 我們可以將整個程式區塊視為一列程式敘述,以結構化程式設計來說,程式區塊就是最簡單的模組,其語法如下所示: { ………… 程式敘述; }
13
4-2 程式區塊-範例 程式區塊提供群組方式的程式編排,不只如此,它還可以隱藏變數宣告,如下所示: { int temp;
temp = a; a = b; b = temp; } 程式區塊宣告整數變數temp,只能在區塊內使用,一旦離開程式區塊,就無法存取變數,稱為程式區塊的區域變數(Local to the Block)。
14
4-3 簡單的條件控制敘述 4-3-1 if是否選條件敘述 4-3-2 if/else二選一條件敘述 4-3-3 ?:條件運算子
15
4-3-1 if是否選條件敘述-語法 if條件敘述是一種是否執行的單選題,決定是否執行程式區塊內的程式碼,如果條件運算式不為0(即true),就執行括號間的程式區塊,其語法如下所示: if ( 條件運算式 ) { 程式敘述; ……… } if條件的條件運算式如果不等於0,就執行區塊的程式碼,如果為0就不執行程式區塊。
16
4-3-1 if是否選條件敘述-範例 學生成績是否及格的if條件敘述,如下所示:
if ( score >= 60 ) { printf("成績及格!\n"); printf(“成績為%d\n”, score); } 如果程式區塊的程式敘述只有一列,還可以省略區塊的大括號,如下所示: if ( score < 60 ) printf("成績不及格!%d\n", score);
17
4-3-1 if是否選條件敘述-UML活動圖
18
4-3-2 if/else二選一條件敘述-語法 if ( 條件運算式 ) { 程式敘述1; ……… } else { 程式敘述2;
19
4-3-2 if/else二選一條件敘述-範例 學生成績以60分區分是否及格的if/else條件敘述,如下所示:
if ( score >= 60 ) { printf("成績及格!%d\n", score); } else { printf("成績不及格!%d\n", score); 程式碼因為成績有排它性,60分以上為及格分數,60分以下為不及格,所以只會執行其中一個程式區塊。
20
4-3-2 if/else二選一條件敘述-UML活動圖
21
4-3-3 ?:條件運算子-語法 C語言提供「條件運算式」(Conditional Expressions),可以使用條件運算子?:在指定敘述以條件指定變數值,其語法格式如下所示: 變數 = ( 條件運算式 ) ? 變數值1 : 變數值2; 在指定敘述的「=」號右邊是條件運算式,其功能如同if/else條件,使用「?」符號代替if,「:」符號代替else,如果條件成立,就將變數指定成變數值1,否則就是變數值2。
22
4-3-3 ?:條件運算子-範例 一個條件敘述運算子的範例,如下所示:
hour = (hour >= 12) ? hour-12 : hour; 上述程式碼使用條件敘述運算子指定變數hour的值,如果條件為true(即不等於0),hour變數值為hour-12,false(等於0)就是hour。
23
4-4 巢狀條件敘述-說明 在if條件敘述的程式區塊如果擁有其它if條件敘述,程式架構稱為「巢狀條件敘述」,如下:
if ( guess == target ) { printf("猜中數字: %d\n", target); } else { printf("猜錯: "); if ( guess > target ) printf("數字太大!\n"); else printf("數字太小!\n");
24
4-4 巢狀條件敘述-UML活動圖
25
4-5 多選一條件敘述 4-5-1 if/else/if多選一條件敘述 4-5-2 switch多選一條件敘述
26
4-5-1 if/else/if多選一條件敘述-說明
多選一條件敘述只是重複使用if/else條件建立if/else/if條件敘述,如下所示: if ( guess == target ) { printf("猜中數字: %d\n", target); } else if ( guess > target ) printf("猜錯: 數字太大!\n"); else printf("猜錯: 數字太小!\n");
27
4-5-1 if/else/if多選一條件敘述-UML活動圖
28
4-5-2 switch多選一條件敘述-語法 switch多選一條件敘述只需依照符合條件,就可以執行不同程式區塊的程式碼,其語法如下所示:
case 常數值1: 程式敘述1; break; case 常數值2: …… default: 程式敘述; }
29
4-5-2 switch多選一條件敘述-語法說明
switch條件只擁有一個條件運算式,每一個case條件的比較相當於一個「==」運算子,如果符合,就執行break指令之前的程式碼,每一個條件需要使用break指令跳出條件敘述。 default指令並非必要指令,這是一個例外條件,如果case條件都沒有符合,就執行default程式區塊。switch條件敘述的注意事項,如下所示: switch條件只支援「==」運算子,並不支援其它的關係運算子,每一個case條件就是一個「==」運算子。 在同一個switch條件敘述中,每一個case條件的常數值不能相同。
30
4-5-2 switch多選一條件敘述-範例 switch ( choice ) {
case 1: printf("往上移動一格!\n"); break; case 2: printf("往下移動一格!\n"); case 3: printf("往左移動一格!\n"); case 4: printf("往右移動一格!\n"); default: printf("留在原地!\n"); }
31
4-5-2 switch多選一條件敘述-UML活動圖
32
4-6 for計數迴圈-語法 C語言的for迴圈是簡化的while迴圈,稱為「計數迴圈」(Counting Loop),可以重複執行程式區塊固定次數,迴圈擁有預設計數器,計數器每次增加或減少一個值,直到迴圈的結束條件,其語法格式如下所示: for ( 初始值 ; 結束條件 ; 變數更新 ) { 程式敘述; ………… }
33
4-6 for計數迴圈-遞增迴圈 for迴圈使用變數控制迴圈執行,從一個值執行到另一個範圍值,例如:計算1加到變數max的總和,每次增加1,如下所示: for ( i = 1; i <= max; i++ ) { printf(" %d ", i); total += i; }
34
4-6 for計數迴圈-遞增迴圈(圖例)
35
4-6 for計數迴圈-遞減迴圈 相反的情況,如果是從max到1,計數器使用i--表示每次遞減1,如下所示:
for ( i = max; i >= 1; i-- ) { ………. }
36
4-6 for計數迴圈-for計數迴圈的應用 for計數迴圈的用途很多,屬於定量遞增或遞減的重複計算問題,都可以使用for計數迴圈。例如:使用for計數迴圈遞減溫度,建立華氏-攝氏溫度對照表,如下所示: for ( f = 200; f >= 100; f = f-20 ) printf("%d %.2f\n", f, (5.0/9.0)*(f-32)); 上述迴圈顯示溫度對照表,從華氏溫度200到100,每次減少20度。
37
4-7 條件迴圈 4-7-1 前測式while迴圈敘述 4-7-2 後測式do/while迴圈敘述
38
4-7-1 前測式while迴圈敘述-語法 while迴圈敘述不同於for迴圈,需要在程式區塊自行處理計數器的增減,while迴圈是在程式區塊的開頭檢查結束條件,如果條件為true(不等於0)才進入迴圈執行,其語法格式如下所示: while ( 結束條件 ) { 程式敘述; ………… } 上述迴圈的執行次數是直到結束條件為false(等於0)為止。
39
4-7-1 前測式while迴圈敘述-範例1 使用while迴圈從1計算到輸入變數max的總和,如下所示:
while ( c <= max ) { total += c; c++; } 上述while迴圈計算從1加到max的總和,變數c是計數器變數,如果符合c <= max條件,就進入迴圈執行程式區塊,迴圈的結束條件為c > max。
40
4-7-1 前測式while迴圈敘述-UML活動圖
41
4-7-1 前測式while迴圈敘述-範例2 攝氏-華氏溫度對照表如果改為使用while迴圈來處理,如下所示:
c = lower = 100; upper = 300; step = 20; while ( c <= upper && lower >= 100 ) { f = (9.0 * c) / ; printf("%d %.2f\n", c, f); c += step; }
42
4-7-2 後測式do/while迴圈敘述-語法
do/while和while迴圈敘述的主要差異是在迴圈結尾檢查結束條件,因為先執行程式區塊的程式碼後才測試條件,所以do/while迴圈的程式區塊至少執行一次,其語法格式如下所示: do { 程式敘述; ………… } while ( 結束條件 ) 上述迴圈執行的次數是直到結束條件為false(等於0)為止。
43
4-7-2 後測式do/while迴圈敘述-範例
printf("請輸入猜測的數字(1~500): "); scanf("%d", &guess); if ( guess > target ) printf("數字太大!\n"); if ( guess < target ) printf("數字太小!\n"); } while ( guess != target ); 迴圈的第1次執行需要到迴圈結尾,才會檢查while條件是否為true,如為true就繼續執行迴圈,迴圈結束條件是guess == target。
44
4-7-2 後測式do/while迴圈敘述-UML活動圖
45
4-8 巢狀迴圈-基礎 巢狀迴圈是在迴圈內擁有其它迴圈,例如:在for迴圈擁有for、while和do/while迴圈,同樣的,while迴圈內也可以擁有for、while和do/while迴圈。
46
4-8 巢狀迴圈-範例 C語言的巢狀迴圈可以有二或二層以上,例如:在for迴圈內擁有while迴圈,如下所示:
for ( i = 1; i <= 9; i++ ) { …… j = 1; while ( j <= 9 ) { ….. j++; }
47
4-8 巢狀迴圈-範例說明 第一層的for迴圈執行9次,第二層的while迴圈也是執行9次,兩層迴圈總共執行81次,如下表所示:
48
4-9 跳躍程式敘述 4-9-1 break敘述 4-9-2 continue敘述 4-9-3 goto敘述和標籤
49
4-9-1 break敘述-說明 C語言的break敘述共有兩個用途,一是中止switch條件的case敘述,另一個用途是強迫終止for、while和do/while迴圈的執行。 雖然迴圈敘述可以在開頭或結尾測試結束條件,但是有時我們需要在迴圈中測試結束條件,break敘述可以使用在迴圈中的條件測試,如同switch條件敘述使用break敘述跳出程式區塊一般。
50
4-9-1 break敘述-範例 do/while迴圈是無窮迴圈,在迴圈中使用if條件進行測試,當i > 5時就執行break跳出迴圈,可以顯示數字1到5。 do { printf(" %d ", i); i++; if ( i > 5 ) break; } while ( 1 );
51
4-9-2 continue敘述 在迴圈的執行過程中,continue敘述可以馬上繼續下一次迴圈的執行,而不執行程式區塊位在continue敘述後的程式碼,如果使用在for迴圈,一樣會更新計數器變數,如下所示: for ( i = 1; i <= 10; i++ ) { if ( (i % 2) == 1 ) continue; printf(" %d ", i); }
52
4-9-3 goto敘述和標籤-說明 結構化程式設計強調在程式中避免使用無窮迴圈和goto敘述,因為goto會造成程式碼閱讀和維護上的困難,事實上,任何擁有goto的程式碼一定可以改寫成沒有goto的版本。 換句話說,在撰寫C程式時,我們根本不需要使用goto,不過仍然有一些特殊情況可以使用goto,最常見的應用是跳出多重巢狀迴圈,因為執行break敘述只能跳出一層迴圈,如果需要跳出整個巢狀迴圈,才可以考慮使用goto。
53
4-9-3 goto敘述和標籤-範例 for ( i = 1; i <= 9; i++ ) { j = 1;
while ( j <= 9 ) { printf("%d*%d=%2d ", i, j, i*j); if ( a == i && b == j ) goto found; j++; } printf("\n"); found:
Similar presentations