870 likes | 991 Views
第三章 流程控制. 本章學習目標:. 透過 UML 活動圖來說明流程控制的意義 選擇判斷:從單一條件到多種條件判斷,介紹 if 敘述、 if…else 敘述、 if…else if…else 敘述和 switch…case 敘述 迴圈的處理:介紹 for 迴圈、 while 迴圈和 do…while 迴圈 break 和 continue 敘述. 3-1-1 UML 組成要素. 3-1 UML 概述. 3-1-2 使用 UML 活動圖. 3-2 流程控制的基礎. 3-3-1 單一選擇判斷. 3-3-2 雙重選擇判斷. 3-3 選擇結構.
E N D
本章學習目標: • 透過UML活動圖來說明流程控制的意義 • 選擇判斷:從單一條件到多種條件判斷,介紹if敘述、if…else敘述、if…else if…else敘述和switch…case敘述 • 迴圈的處理:介紹for迴圈、while迴圈和do…while迴圈 • break和continue敘述
3-1-1 UML組成要素 3-1 UML概述 3-1-2 使用UML活動圖 3-2 流程控制的基礎 3-3-1 單一選擇判斷 3-3-2 雙重選擇判斷 3-3 選擇結構 3-3-3 巢狀選擇 3-3-4 適時過濾條件 3-3-5 多重條件選擇 3-4-1 已知重複次數--for 3-4-2 巢狀for迴圈 3-4 重複結構 3-4-3 未知迴圈次數--while 3-4-4 後置處理—do…while迴圈 3-4-5 使用break和continue敘述 章節目錄
3-1-1 UML組成要素 3-1-2 使用UML活動圖 3-2 流程控制的基礎 3-3-1 單一選擇判斷 3-3-2 雙重選擇判斷 3-3 選擇結構 3-3-3 巢狀選擇 3-3-4 適時過濾條件 3-3-5 多重條件選擇 3-4-1 已知重複次數--for 3-4-2 巢狀for迴圈 3-4 重複結構 3-4-3 未知迴圈次數--while 3-4-4 後置處理—do…while迴圈 3-4-5 使用break和continue敘述 章節目錄 3-1 UML概述
3-1 UML概說 • 在此章節中我們並沒有打算要探討「統一塑模語言」(UML, Unified Modeling Language)的理論基礎 • 只是讓大家在學習過程中,利用UML的觀點來瞭解物件導向的世界 • UML並不是程式語言,而是一種圖形化的物件導向軟體架構工具語言 • 使用UML的最大好處是可以利用圖形來描述真實世界中各個物件,透過標準化動作來看待程式語言的開發
3-1-1 UML組成要素 章節目錄 3-1 UML概述
3-1-1 UML組成要素 • UML由事物(Things)、關係(Relations)及圖表(Diagrams)三大基本要素組成
使用案例觀點(Use Case View) 建置系統功能的需求 邏輯觀點(Logical View) 透過物件導向的觀念來設計軟體 4 + 1觀點 實作觀點(Implementation View) 在軟體中實作物件 部署觀點(Deployment View) 瞭解行程或執行緒在網路環境中實際運作的情形 4 + 1 觀點: 這對UML的解釋還是很難懂,所以原設計公司Rational Software(目前已被IBM併購)針對UML提出一個全新的「4+1」觀點,這種架構已成為開發軟體不可缺少的觀念。
3-1-1 UML組成要素 3-1-2 使用UML活動圖 章節目錄 3-1 UML概述
3-1-2 使用UML活動圖 UML共有九種標準圖形: 類別圖(Class Diagram) 佈署圖(Deployment Diagram) 物件圖(Object Diagram) 合作圖(Collaboration Diagram) 順序圖(Sequence Diagram) 使用案例圖(Use Case Diagram) 狀態圖(State Diagram) 元件圖(Component Diagram) 活動圖(Activity Diagram)
使用UML活動圖 • 我們就其中的活動圖來做概略性介紹。活動圖就是UML的流程圖,主要用途: • 工作流程 • 作業活動 • 用來控制活動和活動之間的流程 章節中會以活動圖來表示流程控制的各種結構
活動圖標示用法: 動作狀態(Activity state): 以橢圓來表示,裡面可以文字來標示各種情形 初始狀態(Initial state): 以實心圓來表示開始狀態 最終狀態(Final State): 以實心圓外加圓框來表示最終狀態 轉變(Transition): 當動作狀態完成時就會發生轉換,以線條加箭號來表示 分歧/合併(Branch/Join): 所謂的「分併」是指流程控制需要以布林值來表示,以空心菱形表示
3-1-1 UML組成要素 3-1-2 使用UML活動圖 章節目錄 3-1 UML概述 3-2 流程控制的基礎
3-2 流程控制的基礎 C++語言在執行時,流程控制可分為以下三種架構,分別為 循序(sequence) 選擇(selection) 重覆(repetition) 指的就是一行一行的敘述。這也是前面章節撰寫程式碼的基本結構,無論是變數的宣告或是將結果顯示於螢幕上。 選擇結構是以條件判斷為基礎,讓執行的程式依據選擇條件來產生執行結果。 設定的條件成立時,重複執行某些敘述,如此週而復始直到條件不成立才會結束。不過在進行重複結構時,需要避免陷入「無窮迴圈」的窘境。
3-1-1 UML組成要素 3-1-2 使用UML活動圖 章節目錄 3-1 UML概述 3-2 流程控制的基礎 3-3 選擇結構
3-3 選擇結構 • C++語言提供的選擇控制指令,分別為 • 「if...」 • 「if...else」 • 「? :」 • 選擇控制指令主要是處理程式中,當某個條件成立時就執行某段程式敘述。
3-1-1 UML組成要素 3-1-2 使用UML活動圖 3-3-1 單一選擇判斷 章節目錄 3-1 UML概述 3-2 流程控制的基礎 3-3 選擇結構
3-3-1 單一選擇判斷 • 如同我們口語中的「假如...就...」的情形 • 流程如下圖所示:
if敘述的語法如下: • 符合條件判斷(true)時,則執行區塊(大括號{})中的敘述 • 語法中,假如條件成立所執行的敘述只有一行,則大括號{}可以省略
執行程式(grade.cpp) • 利用if條件判斷來判斷成績是否有及格,所以分別在程式碼第10、15及20行來判斷國文、數學和英文分數,如果有大於或等於60分,輸出「及格」字串。 • 國文成績沒有及格,所以輸出時就只能顯示分數,而沒有及格的文字出現。
3-1-1 UML組成要素 3-1-2 使用UML活動圖 3-3-1 單一選擇判斷 3-3-2 雙重選擇判斷 章節目錄 3-1 UML概述 3-2 流程控制的基礎 3-3 選擇結構
3-3-2 雙重選擇判斷 • 雙重選擇判斷就如同口語中「假如...就...否則就...」的情形 • 「if…else」敘述流程如下圖所示:
「if…else」敘述的語法如下: • 當選擇條件為真(true)時,則執行敘述一 • 當選擇條件結果為假(false)時,則執行程式敘述二 • 「if…else」敘述與「if...」敘述相似,差異點在於「if…else」敘述多了條件不成立的處理程序 • 同樣地,當if…else敘述只有一行的處理敘述時,可將形成區塊的大括號{}省略。
執行程式(InputNumber.cpp) • 利用if…else…敘述來判斷使用者輸入的是否是0~9的數字,如果「是」顯示輸入正確;如果不是,就顯示輸入不正確。 • 第10行讀取使用者輸入的字元,然後透過第12~15行進行雙重選擇判斷。
wmain()主函式 • 範例InputNumber使用了wmain()主函式,為Visual C++ 2005所定義,其用法和main()主函式相同 • 如果應用程式中的字元是以Unicode方式來處理,必須藉助wmain()主函式傳遞引數 • 語法如下:
使用條件運算式? : • 「?:」條件運算式是一個三元運算子,用來簡化if…else…的敘述,語法如下: • 當條件值符合(true)時,就執行敘述一 • 當條件值不符合(false)時,則執行敘述二
部份範例:InputNumber2.cpp • 將InputNumber.cpp範例修改,以條件運算子來表示:
程式執行(InputNumber2.cpp) • 們將原有範例修改後 • 第7行是條件運算子的「條件值」 • 第8行是符合條件的「敘述一」 • 第9行則是不符合條件的「敘述二」
3-1-1 UML組成要素 3-1-2 使用UML活動圖 3-3-1 單一選擇判斷 3-3-2 雙重選擇判斷 3-3-3 巢狀選擇 章節目錄 3-1 UML概述 3-2 流程控制的基礎 3-3 選擇結構
3-3-3 巢狀選擇 • 巢狀選擇基本上是「if…else…」敘述的變形, • 換句話說就是「if…else…」敘述中還含有「if…else…」 • 好像洋蔥一般,一層一層由外向內裹成條件。 • 執行時,符合了第一個條件,才會進入第二個條件 • 一層層進入到最後一個條件 • 所以利用巢狀選擇可以製作出多演算結果的程式流程
使用巢狀if敘述時 • 必須是條件一的區塊涵蓋了條件二的區塊 • 條件二的區塊也會涵蓋條件三的區塊 • 區塊之間若產生交錯情形,會造成程式撰寫的紊亂,這是初學者必須要注意的地方。
程式解說 • 輸入年齡來判斷可以觀賞的電腦等級,從第9行至27行為巢狀if敘述。 • 第9~27行為條件一處理區塊,判斷輸入的年齡是否有大於0,如果有才會進入第11行的條件2。 • 第11~24行為條件二的處理區塊,進一步判斷年齡是否大於或等於6歲。如果有,表示會進行條件三的判斷;如果沒有,第23行else敘述表示年齡在6歲以下,就只能看普通級的電影。 • 第13~21行為條件三處理區塊,判斷年齡是否大於或等於12歲。如果有,會進行條件四判斷;如果沒有,第21行else敘述表示12歲以下只能觀看普通和保護級的電影。 • 第15~18行則是最後一個條件的處理區塊,用來判斷是否大於或等於18歲,如果符合條件就能欣賞所有等級的電影,而小於18歲就無法觀賞限制級的電影。
3-1-1 UML組成要素 3-1-2 使用UML活動圖 3-3-1 單一選擇判斷 3-3-2 雙重選擇判斷 3-3-3 巢狀選擇 3-3-4 適時過濾條件 章節目錄 3-1 UML概述 3-2 流程控制的基礎 3-3 選擇結構
3-3-4 適時過濾條件 • 前面所談的選擇條件都是在單一條件下。如果面臨的狀況是多個條件來進行選擇,「if…else if…else…」敘述是最佳處理方式之一。 • 在多重條件下,逐一過濾來選擇最適合的條件(true)來執行某段敘述 • 「if…else if…else…」敘述就如同生活中「假如…就…,要不然…就…,否則…」
If…else if…else…語法如下: • 程式執行時會由上而下逐一過濾條件,假如某個條件成立時,即執行區塊內的敘述,完成後即跳離此流程結構 • 假如所有條件皆未符合(false)時,最後則執行else之後區塊內的敘述
程式解說 • 輸入三科成績計算其平均分數後,再利用「if…else if…else」敘述判斷分數等級。 • 第10行:利用變數來讀取各科成績。第11行計算平均分數並儲存於avg變數。 • 第12行以cout.setf(ios::fixed, ios::floatfield)來設定欲輸出的小數位數,預設值是6位小數。然後透過第13行的precision()函數來設定實際輸出小數位數。 • 第16~26行:以「if…else if…else…」敘述來進行多種條件選擇。如果分數高於90分,則顯示「成績優良」的字串。第18行則是分數在80~89之間,表示「成績不錯」。分數介於70~79分者,以第20行來處理。第22行用來處理60~69分的成績,最後一個條件就是分數低於60分者。
3-1-1 UML組成要素 3-1-2 使用UML活動圖 3-3-1 單一選擇判斷 3-3-2 雙重選擇判斷 3-3-3 巢狀選擇 3-3-4 適時過濾條件 3-3-5 多重條件選擇 章節目錄 3-1 UML概述 3-2 流程控制的基礎 3-3 選擇結構
3-3-5 多重條件選擇 • 要處理多重條件選擇,另一個好方法就是「switch…case…」敘述。 • 它的處理結構與「if…else if…else…」敘述有異曲同工之妙,語法如下:
使用switch…case • 程式由上而下執行,switch後的運算式必須是整數值。 • 當運算式的值符合某一個case關鍵字之後的條件值時,會執行冒號(:)後所有敘述 • 因此必須在條件敘述後加上break指令來中斷或是跳離此流程控制 • 當所有條件都不符合時,則會執行default後的程式區段敘述,它的作用就如同「if…else if…else…」敘述中的else • 這裡為什麼要在條件敘述之後加上break? • 如果沒有加上break敘述,表示程式就會繼續執行下一個條件敘述,有可能形成條件都符合而輸出錯誤結果!
執行程式 • 此範例是利用輸入月份來判斷天數。因此第12~31行是一個「if…else…」敘述,判斷輸入的數值是否在1~12之間 • 第13~27行則是多重條件選擇,第14行是2月的天數,第18~23行用來判斷天數有30天的月份;第25行的default則是天數有31天的月份