版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第三章 程序的流程控制 —— 語句,,本章內容,流程控制概述順序控制選擇控制循環(huán)控制無條件轉移控制程序設計風格,流程控制概述,表達式構成了數(shù)據(jù)處理的基本單位。當程序中有多個表達式時,就會面臨: 先計算哪一個表達式根據(jù)不同的情況計算不同的表達式一個或幾個表達式需要重復計算多次語句實現(xiàn)對程序執(zhí)行流程的控制,包括:順序控制:按書寫次序執(zhí)行。選擇控制:根據(jù)條件選擇執(zhí)行。循環(huán)控制:重復執(zhí)行。,
2、C++語句的分類,,,順序控制,按書寫次序,從左到右、從上到下順序執(zhí)行。實現(xiàn)順序控制的C++語句有: 表達式語句復合語句空語句,表達式語句,在C++表達式的后面加上一個分號“;”就可以構成表達式語句,其格式為:;例如:a + b * c;a > b ? a: b;a++;x = a | b & c; 連續(xù)的多個表達式語句按它們的書寫次序依次執(zhí)行。,較常使用的表達式語句,賦值自增/自減無返回值的函數(shù)
3、調用,等輸入/輸出例如x = a+b; //賦值x++; //自增f(a); //函數(shù)調用cin >> a; //輸入cout << b; //輸出,復合語句,復合語句是由一對花括號括起來的一條或多條語句,又稱為塊(block)。語法上,復合語句可看作是一個語句。其格式為: { }中的語句可以是任何的C++語句,其中包括數(shù)據(jù)定義和聲明語句。復合語句中的語句序列一般按照書寫次序
4、執(zhí)行。 復合語句一般作為函數(shù)體和結構語句的成分語句。,復合語句舉例,{int a,b;cin >> a >> b;int max;if (a >= b) //選擇語句max = a; else max = b;cout << max << endl;},空語句,根據(jù)程序設計的需要,在程序中的某些地方有時需要加上一些空操作,以方便其它流程控制的實
5、現(xiàn)??照Z句的格式為:;空語句不做任何事情,其作用是用于語法上需要一條語句的地方,而該地方又不需做任何事情??照Z句常常作為結構語句的子句。,例如:{......... goto end; //轉向下面由語句標號end標識的空語句......end: ; //空語句}其中,在“end: ;”中,end是一個語句標號,“;”是一個空語句。再例如:int i,sum;for (sum=0, i=1; i&l
6、t;=100; sum+=i,i++) ; 其中,循環(huán)體為一條空語句,選擇控制,在程序中,常常需要根據(jù)不同的情況來從一組語句中選擇一個來執(zhí)行(分支),這是通過選擇語句來完成的。選擇語句包括:if語句switch語句,if 語句,if語句(又稱條件語句)是根據(jù)一個條件滿足與否來決定是否執(zhí)行某個語句或從兩個語句中選擇一個語句執(zhí)行。 if語句有兩種格式:if () if () else 其中的、、必須是一個語句?。◤秃险Z
7、句算一個語句。),if語句的含義,第一種格式,第二種格式,例子:從鍵盤輸入三個整數(shù),計算其中的最大值并將其輸出,#include using namespace std;int main(){int a,b,c,max;cout > a >> b >> c;if (a > b)max = a;elsemax = b;if (c > max) max = c;
8、cout << "最大者為:" << max << endl;return 0;},if語句的鋸齒格式,為了提高程序的易讀性,在寫if語句時,最好采用“鋸齒”格式,即把成分語句往后縮進幾列。當if語句的成分語句也是if語句時,如果嵌套層次很深,“鋸齒”格式將會使得程序正文嚴重偏向右邊,從而帶來對程序編輯、查看帶來困難。為了減少文本的縮進量,可以把這樣的if語句按下面的格式
9、書寫:,if (...) ...else if (...) ...else if (...) ...else if (...) ...else ...,if (...) ...else if (...) ... else if (...) ... else if (...)
10、 ... else ...,等價于:,例子:從鍵盤輸入一個三角形的三條邊,判斷其為何種三角形,#include using namespace std;int main(){int a,b,c;cin >> a >> b >> c;if (a+b <= c || b+c <= a || c+a <= b)cout
11、<< "不是三角形";else if (a == b && b == c)cout << "等邊三角形";else if (a == b || b == c || c == a)cout << "等腰三角形";else if (a*a+b*b == c*c || b*b+c*c == a*a || c*
12、c+a*a == b*b)cout << "直角三角形(非等腰)";elsecout << "其它三角形";cout << endl;return 0;},避免不必要的測試,if (score >= 90)cout = 80 && score = 70 && score = 60 &&
13、amp; score < 70)cout << "及格"; if (score < 60)cout << "不及格";,if 語句的歧義問題,下面的if語句的含義是什么?if () if () else if () if () else if () if () else C++規(guī)定:else子句與它前面最近的、沒有else子句的if
14、配對。因此,上面的if語句解釋為: if () if () else 若要按2來解釋,則需要加上花括號(復合語句):if () { if () } else ,switch 語句,程序中有時需要從兩個(組)以上的語句中選擇一個(組)來執(zhí)行。C++提供了一條多路選擇語句:switch語句(又稱開關語句),它能根據(jù)某個表達式的值在多組語句中選擇一組語句來執(zhí)行。 每一組語句的最后一個語句往往是break語句。,switc
15、h語句的格式,switch (){case : case : :case : [default: ]},例子、從鍵盤輸入一個星期的某一天(0:星期天;1:星期一;...),然后輸出其對應的英語單詞,#include using namespace std;int main(){ int day;cin >> day;switch (day){ case 0: cout
16、 << "Sunday"; break;case 1: cout << "Monday"; break;case 2: cout << "Tuesday"; break;case 3: cout << "Wednesday"; break;case 4: cout << &q
17、uot;Thursday"; break;case 5: cout << "Friday"; break;case 6: cout << "Saturday"; break;default: cout << "Input error";}cout << endl;return 0;},sw
18、itch語句中使用break語句,在執(zhí)行switch語句的某個分支時,需要用break語句結束該分支的執(zhí)行。在switch語句的一個分支的執(zhí)行中,如果沒有break語句(最后一個分支除外),則該分支執(zhí)行完后,將繼續(xù)執(zhí)行緊接著的下一個分支中的語句序列。在其它一些語言(如:Pascal)的多路選擇語句中,一個分支執(zhí)行完后將自動結束多路選擇語句的執(zhí)行。C++中的switch語句比其它一些語言中的多路選擇語句更具有靈活性。當若干個分支具有
19、部分重復功能時,C++的switch語句可以節(jié)省代碼量。,switch (...){...case :Acase :Bcase :Cbreak;...} 上面的語句中,分支1執(zhí)行A、B和C;分支2執(zhí)行B和C;分支3執(zhí)行C。(假設A、B中沒有break語句),循環(huán)控制,如何編程計算n!(n是變量)?n!=n*(n-1)*(n-2)*...*2*1表達式中不允許有“...”上面的問題需要
20、用重復操作控制來解決:對相同的操作重復執(zhí)行多次,每一次操作的數(shù)據(jù)有所不同。f=1,對i=2~n,重復執(zhí)行:f=f*i;循環(huán)語句為解決重復操作提供了一種途徑。循環(huán)一般由四個部分組成:循環(huán)初始化循環(huán)條件循環(huán)體下一次循環(huán)準備。,,C++提供了三種實現(xiàn)重復操作的循環(huán)語句:while語句do-while語句for語句,while 語句,while語句具有如下的格式:while () ,用while語句求n!,#incl
21、ude using namespace std;int main(){int n;cin >> n;int i=2,f=1; //循環(huán)初始化while (i <= n) //循環(huán)條件{f *= i;i++; //下一次循環(huán)準備} //循環(huán)體cout << "factorial of " << n << " = &q
22、uot; << f << endl;return 0;},do-while 語句,do-while語句的格式如下:do while ();,用do-while語句求n!,#include using namespace std;int main(){int n;cin >> n;int i=1,f=1; //循環(huán)初始化do //循環(huán)體{f *= i;i++
23、; //下一次循環(huán)的準備} while (i <= n); //循環(huán)條件cout << "factorial of " << n << " = " << f << endl;return 0;},for 語句,for語句的格式如下: for (;;) ,#include using namespace std;
24、int main(){int n,i,f;cin >> n;for (i=2,f=1 //循環(huán)初始化; i<=n //循環(huán)條件;i++) //下一次循環(huán)準備 f *= i; //循環(huán)體cout << "factorial of " << n << " = " << f
25、<< endl;return 0;},用for語句求n!,循環(huán)的種類,計數(shù)控制的循環(huán)循環(huán)前就知道循環(huán)的次數(shù),循環(huán)時重復執(zhí)行循環(huán)體直到指定的次數(shù) 事件控制的循環(huán)循環(huán)前不知道循環(huán)的次數(shù),循環(huán)的終止是由循環(huán)體的某次執(zhí)行導致循環(huán)的結束條件得到滿足而引起的,三種循環(huán)語句的使用原則,三種循環(huán)語句在表達能力上是等價的,在解決某個具體問題時,用其中的一種可能會比其它兩種更加自然。 一般來說,計數(shù)控制的循環(huán)一般用for語句;
26、事件控制的循環(huán)一般用while或do-while語句,其中,如果循環(huán)體至少要執(zhí)行一次,則用do-while語句。由于for語句能清晰地表示“循環(huán)初始化”、“循環(huán)條件”以及“下一次循環(huán)準備”,因此,一些非計數(shù)控制的循環(huán)也用for語句實現(xiàn)。,例 :計算從鍵盤輸入的一系列整數(shù)的和,要求首先輸入整數(shù)的個數(shù)。(計數(shù)控制的循環(huán)),#include using namespace std;int main(){int n;cout &g
27、t; n;cout > a;sum += a; }cout << "輸入的" << n << "個整數(shù)的和是:" << sum << endl;return 0;},例:計算從鍵盤輸入的一系列整數(shù)的和,要求輸入以-1結束。(事件控制的循環(huán) ),#include using namespace std;in
28、t main(){int a,sum=0;cout > a;while (a != -1){sum += a; cin >> a;}cout << "輸入的整數(shù)的和是:" << sum << endl;return 0;},例:從鍵盤接收字符,一直到輸入了字符y(Y)或n(N)為止。 (事件控制的循環(huán) ),#include #
29、include using namespace std;int main(){char ch;do{cout > ch;ch = tolower(ch);} while (ch != 'y' && ch != 'n');if (ch == 'y')......else......return 0;},例:求第n個費
30、波那契(Fibonacci)數(shù),//1,1,2,3,5,8,13,...#include using namespace std;int main(){int n;cin >> n;int fib_1=1; //第一個Fibonacci數(shù)int fib_2=1; //第二個Fibonacci數(shù)for (int i=3; i<=n; i++){int temp=fib_1+fib_2; /
31、/計算新的Fibonacci數(shù)fib_1 = fib_2; //記住新的前一個Fibonacci數(shù)fib_2 = temp; //記住新的Fibonacci數(shù)}cout << "第" << n << "個費波那契數(shù)是:" << fib_2 << endl;return 0;},fib_2 = fib_1 +
32、fib_2; //計算和記住新的Fibonacci數(shù)fib_1 = fib_2 - fib_1; //記住前一個Fibonacci數(shù),循環(huán)優(yōu)化問題,算法的優(yōu)化:減少循環(huán)次數(shù)避免在循環(huán)中重復計算不變的表達式,#include using namespace std;int main(){int n;cout > n; //從鍵盤輸入一個正整數(shù)for (int i=2; i<n; i++) //循環(huán):分別
33、判斷2、3、...、n-1是否為素數(shù){int j=2;while (j < i && i%j != 0) //循環(huán):分別判斷i是否能被2 ~ i-1整除 j++;if (j == i) //i是素數(shù) cout << i << " ";}cout << endl;return 0;}注意:1、上面的for循環(huán)中,
34、偶數(shù)沒有必要再判斷它們是否為素數(shù); 2、上面的while循環(huán)沒有必要到i-1,只需要到:sqrt(i),例:編程求出小于n的所有素數(shù)(質數(shù)),#include #include using namespace std;int main(){int n;cin >> n; //從鍵盤輸入一個數(shù)if (n sqrt(i)) //i是素數(shù) cout << i <<
35、 ",";}cout << endl;return 0;}注意:上面程序中的sqrt(i)被重復計算!,,......int j = 2,k=sqrt(i);while ( j k) //i是素數(shù)。......注意:對有些循環(huán)優(yōu)化,編譯器能實現(xiàn)!,無條件轉移控制,除了有條件的選擇語句(if和switch)外,C++還提供了無條件的轉移語句:gotobreakcontin
36、uereturn,goto語句,goto語句的格式如下:goto ;為標識符,其定義格式為::goto的含義是:程序轉移到帶有的語句,用goto語句求n!,#include using namespace std;int main(){int n;cin >> n;int i=1,f=1;loop: f *= i;i++;if (i <= n) goto loop;cou
37、t << "factorial of " << n << "=" << f << endl;return 0;},,在使用goto語句時,應該注意:不能用goto語句從一個函數(shù)外部轉入該函數(shù)的內部(函數(shù)體),也不能用goto語句從一個函數(shù)的內部轉到該函數(shù)的外部。允許用goto語句從內層復合語句轉到外層復合語句或從外層復合語句轉入
38、內層復合語句。goto語句不能掠過帶有初始化的變量定義。,void f(){......goto L1; //Error......while (...){ int x=0;L1: .........goto L2; //Error......}.....int y=10;L2: ............},break語句,break語句的格式:break;
39、break語句的含義有兩個:結束switch語句的某個分支的執(zhí)行退出包含它的最內層循環(huán)語句(由于循環(huán)可以嵌套) 在循環(huán)體中只要執(zhí)行了break語句,就立即跳出(結束)循環(huán),循環(huán)體中跟在break語句后面的語句將不再執(zhí)行,程序繼續(xù)執(zhí)行循環(huán)之后的語句。在循環(huán)體中,break語句一般作為某個if語句的子句,用于實現(xiàn)進一步的循環(huán)控制。,用goto語句實現(xiàn)break語句的功能,while (...){......... b
40、reak; ......}上述程序等價于:while (...){......... goto L; ......}L: ...,例如,判斷i是否為素數(shù)的循環(huán)也可寫成:j = 2;k = sqrt(i);while (j <= k) {if (i%j == 0) break; //退出循環(huán)j++;}或for (j=2,k=sqrt(i); j<=k; j++)if (i%j
41、 == 0) break;,continue語句,continue語句的格式如下: continue;continue語句只能用在循環(huán)語句的循環(huán)體中,其含義是:立即結束當前循環(huán),準備進入下一次循環(huán)。對于while和do-while語句,continue語句將使控制轉到循環(huán)條件的判斷;對于for語句,continue語句將使控制轉到:先計算,然后計算,并根據(jù)的計算結果來決定是進入下一次循環(huán)還是結束循環(huán)。,用空語句和got
42、o語句實現(xiàn)continue語句的功能,while (...){......... continue; ......}上述程序等價于:while (...){......... goto end; ......end:;},例:從鍵盤輸入一些非零整數(shù),然后輸出其中所有正數(shù)的平方根。,#include #include using namespace std;int main(){int n;
43、double square_root;cout >n; n!=0; cin>>n){if (n < 0) continue; //準備進入下一次循環(huán)square_root = sqrt(n);cout << n << "的平方根是:" << square_root << endl;}return 0;},程序設計
44、風格,程序設計風格通常是指對程序進行靜態(tài)分析所能確認的程序特性,它涉及程序的易讀性。 采用一致/有意義的標識符為程序實體(如:變量、函數(shù)等)命名。使用符號常量為程序書寫注釋采用代碼的縮進格式,等除此之外,結構化程序設計就是一種良好程序設計風格的典范。,結構化程序設計,結構化程序設計(Structured Programming,簡稱SP)是指“按照一組能夠提高程序易讀性與易維護性的規(guī)則進行程序設計的方法”SP不僅要求所編出的
45、程序結構良好,而且還要求程序設計過程也是結構良好的,后者是前者的基礎。對程序設計過程而言,“結構良好”是指采用分解和抽象的方法來完成程序設計任務,具體體現(xiàn)為:“自頂向下、逐步精化”的程序設計過程。 對程序而言,“結構良好”是指:每個程序單位應具有單入口、單出口的性質。不包含不會停止執(zhí)行的語句,程序在有限時間內結束。程序中沒有無用語句,程序中所有語句都有被執(zhí)行的機會。,結構化程序設計(續(xù)),結構化程序設計通??捎萌N基本結構
46、來實現(xiàn),,,,,,,,,,,,,,,,,,,,,,,,,,,(順序),(選擇),(循環(huán)),上面三種結構都具有單入口、單出口的性質。,關于goto語句,goto語句會使得程序的靜態(tài)結構和動態(tài)結構不一致,導致程序難以理解、可靠性下降和不容易維護。有時會導致程序效率的下降。 從結構化程序設計的角度講, goto語句會破壞程序中的每一個結構所具有的單入口/單出口的性質。實際上,goto語句的使用可以分成兩類:向下的轉移(forward)(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論