?? 02章 控制結構.txt
字號:
第2章 控制結構
教學目標
●了解基本問題的解決方法
●通過自上而下、逐步完善的過程開發算法
●用if、if/else和switch選擇結構選擇操作
●用while、do/while和for重復結構重復執行程序語句
●了解計數器控制重復與標記控制重復
●使用自增、自減、賦值和邏輯運算符
●使用break和continue此程序控制語句
2.1 簡介
編寫解決特定問題的程序之前,首先要徹底了解問題并認真計劃解決問題的方法。編寫程序時,還要了解可用的基本組件和采用實踐證明的程序結構原則。本章將討論結構化編程的理論和原理的所有問題。這里介紹的技術適用于大多數高級語言.包括C++。第6章在介紹C++面向對象編程時,將會介紹如何用第2章介紹的控制結構幫助建立和操作對象。
2.2 算法
任何計算問題都可以通過按特定順序執行一系列操作而完成。解決問題的過程(procedure)稱為算法(algorithm),包括:
1.執行的操作(action)
2.執行操作的順序(order)
下例演示正確指定執行操作的順序是多么重要:
考慮每個人早晨起床到上班的“朝陽算法”:(1)起床,(2)脫睡衣,(3)洗澡,(4)穿衣,(5)吃早飯,(6)搭車上班。
總裁可以按這個順序,從容不迫地來到辦公室。假設把順序稍作調換:(1)起床,(2)脫睡衣,(3)穿衣,(4)洗澡,(5)吃早飯.(6)搭車上班。
如果這樣,總裁就得帶著肥皂水來上班。指定計算機程序執行語句的順序稱為程序控制(program control),本章介紹C++程序的控制功能。
2.3 偽代碼
偽代碼(pseudocode)是人為的非正式語言,幫助程序員開發算法。這里介紹的偽代碼在開發的算法轉換為結構化C++程序時特別有用。偽代碼類似于日常英語,方便而且容易掌握,但不是實際計算機編程語言。偽代碼程序并不在計算機上實際執行,而是幫助程序員先“構思”程序.再用C++之類的實際計算機編程語言編寫。本章介紹幾個如何在開發結構化C++程序時有效利用偽代碼的例子。
我們介紹的偽代碼完全由字符構成,程序員可以用一個編輯器程序方便地輸入偽代碼程序,計算機可以在需要時顯示偽代碼程序。認真構思的偽代碼程序可以方便地變為對應的C++程序。很多情況下,只要將偽代碼語句轉換成對應的C++語句即可。
偽代碼只包含執行語句,將偽代碼程序變為對應的C++程序時,這些語句可以運行。聲明語句不是執行語句。例如,下列聲明:
int i;
只是告訴編譯器,變量i的類型是整型,指示編譯器在內存中為這個變量保留內存空間。但這個聲明并在執行程序時不做任何操作(如輸入、輸出或計算)。有些程序員在偽代碼程序開頭列出變量及其簡要說明。
2.4 控制結構
通常,程序中的語句按編寫的順序一條一條地執行,稱為順序執行(sequential execution)。程序員可以用稍后要介紹的不同C++語句指定下一個執行的語句不是緊鄰其后的語句,這種技術稱為控制轉移(transfer of control)。
20世紀60年代,人們發現,軟件開發小組遇到的許多困難都是由于控制轉移造成的。goto語句使程序員可以在程序中任意指定控制轉移目標,因此人們提出結構化編程就是為了清除goto語句。
Bohm和JMoP5n1的研究表明,不用goto語句也能編寫程序。困難在于程序員要養成不用goto語句的習慣。直到20世紀70年代,程序員才開始認真考慮結構化編程,結果使軟件開發小組的開發時間縮短、系統能夠及時交付運行并在顱算之內完成軟件項目。這些成功的關鍵是.結構化編程更清晰、更易調試與修改并且不容易出錯。
BohM和J“jecopini的研究表明,所有程序都可以只用三種控制結構(control structure)即順序結構(sequence structure)、選擇結構(selection structure)和重復結構(repetition structure)。順序結構是C++內置的,除非另外指定,計算機總是按編寫的順序一條一條地執行。圖2.1的流程圖(flowchart)演示了典型的順序結構.按順序進行兩次計算。
流程圖是算法或部分算法的圖形表示。流程圖用一些專用符號繪制,如長方形、菱形、橢圓和小圓,這些符號用箭頭連接,稱為流程。
和偽代碼一樣,流程圖也用于開發和表示算法,但偽代碼更受歡迎。流程圖能清楚地表示控制結構如何操作.本書用流程圖表示控制結構如何操作。
考慮圖2.1所示的流程圖。我們用矩形框(或稱為執行框)表示各種操作,包括計算、輸入和輸出操作。圖中的流程表示進行操作的順序,首先將grade加進total,然后將counter加1。C++允許順序結構中有多個操作,稍后可以看出,可以放一個操作的地方,也就可以放幾個順序操作。
繪制表示完整算法的流程圖時,橢圓框加上其中的“Begin”(開始)字樣表示流程圖開始,橢圓框加上其中的“End”(結束)字樣表示流程圖結束。只畫部分算法時(如圖2.1),省略橢圓框,只用小圓框,也稱接頭框。
最重要的流程圖符號是菱形框,也稱為判斷框,表示要進行判斷。下一節將介紹菱形框。
C++提供三種選擇結構,本章將介紹這三種選擇結構。if選擇結構在條件為true時執行一個操作,在條件為false時跳過這個操作。if/else選擇結構在條件為true時執行一個操作,在條件為false時執行另一個操作。swutch選擇結構根據表達式取值不同而選擇不同操作。
if選擇結構稱為單項選擇結構(single—selection,structure),選擇或忽略一個操作。if/else選擇結構稱為雙項選擇結構(double-selection structure),在兩個不同操作中選擇。switch選擇結構稱為多項選擇結構(multiple-selection structure),在多個不同操作中選擇。
C++提供三種重復結構while、do/while和for。if、else、switch、while、do和for等都是C++關鍵字(keyword)。這些關鍵字是該語言保留的,用于實現如C++控制結構等不同特性。關鍵字不能作為變量名等一些標識符。圖2.2顯示了完整的C++關鍵字列表。
-----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
常見編程錯誤 2.1
用關鍵字作為標識符屬于語法錯誤。
C++只有七種控制結構:順序結構、三種選擇結構和三種重復結構。每個C++程序都是根據程序所需的算法組合這七種控制結構。從圖2.1中的順序結構可以看出,每個控制結構的流程圖使用兩個小圓框,一個在控制結構入口點,一個在控制結構出口點。這種單入/單出控制結構(single-entry/single-exit control structure)使程序容易建立,只要將一個控制結構的出口與另一個控制結構的入口連接,即可組成程序。這點很像小孩子堆積木,因此稱為控制結構堆棧(control-structure stacking),還有另一種控制結構連接方法,稱為控制結構嵌套(control-structure nesing)。
軟件工程視點 2.1
任何C++程序可以用這七種控制結構(順序、if、if/else、switch、while、do/while和for并用兩種方式(控制結構堆棧和控制結構嵌套)組合而成。
2.5 if選擇結構
選擇結構在不同操作之間選擇。例如,假設考試成績60分算及格,則下列偽代碼:
if student's grade is greater than or equal to 60
print "Passed"
確定“學生成績大于或等于60分”是true或false,如果是true,則該生及格,打印“Passed”字樣,并順序“執行”下一個偽代碼語句(記住,偽代碼不是真正的編程語言)。如果條件為false,則忽略打印語句,并順序“執行”下一個偽代碼語句。注意這個選擇結構第二行的縮排,這種縮排是可選的,但值得提倡,因為它能體現結構化程序的內部結構。將偽代碼變成C++代碼時,C++編譯器忽略空格、制表符、換行符等用于縮排和垂直分隔的空白字符。
編程技巧 2.1
在整個程序中堅持用合理縮排規則能大大提高程序可讀性。建議用固定制表長度即1/4英寸或三個空格的縮排量。
上述偽代碼的if語句可以寫成如下C++語句:
if(grade>=60)
cout<<"Passed";
cout<<"Passed";
注意C++代碼與偽代碼密切對應,這是偽代碼的一個屬性,使得其成為有用的程序開發工具。
編程技巧 2.2
偽代碼常用于程存設計期間“構思”程序,然后再將偽代碼程序轉換為C++程序。
圖2.3的流程圖演示了單項選擇if結構。這個流程圖包含流程圖中最重要的菱形框、也稱判斷框,表示要進行判斷。判斷框包含一個表達式(如條件),可取true或false值。判斷框產生兩條流程,一條指向表達式為true時的走向,一條指向表達式為false時的走向。第1章曾介紹過,可以根據包含關系或相等運算待的條件作出判斷。實際上,可以針對任何表達式作出判斷,如果表達式求值為0,則當作false,如果表達式求值非0,則當作true。C++草案標準提供bool數據類型,表示true和false。關鍵字true和false表示bool數據類型的值。
注意,if結構也是單入/單出結構。稍后將會介紹,其余控制結構的流程圖(除了小圓框和流程之外)也只能包含表示所要操作的矩形框和表示所要判斷的菱形框。這是我們強調的操作/判斷編程模型(action/decision model of progamming)。
可以想像有七個框,各包含七種控制結構中的一種控制結構,這些控制結構是空的,矩形框和菱形框中什么也沒有。程序員的任務就是根據算法需要用堆棧和嵌套兩種方法組合這幾種控制結構,然后在這些框中填入算法所要的操作和判斷,從而生成程序。下面介紹編寫操作和判斷的各種方式。
2.6 if/else選擇結構
if選擇結構只在條件為true時采取操作,條件為false時則忽略這個操作。利用if/else選擇結構則可以在條件為true時和條件為false時采取不同操作。例如,下列偽代碼:
if student's grade is greater than or equal to 60
print "Passed"
else
print "Failed"
在學生成績大于或等于60時打印“Passed”,否則打印"Failed"。打印之后,都“執行”下一條偽代碼語句。注意else的語句體也縮排。
編程技巧 2.3
if/eIse選擇結構的兩個語句體都縮排。
選擇的縮徘規則應當在整個程序中認真貫徹執行。不按統一縮排規則編寫的程序很難閱讀。
編程技巧 2.4
如果有多層縮排,則每一層應縮排相同的空間量。
上述偽代碼if/else結構可以寫成如下的C++代碼:
if(grade>=60)
cout<<"Passed";
else
cout<<"Failed";
圖2.4的流程圖很好地演示了if/else結構的控制流程。注意,這個流程圖(除了小圓框和流程之外)也只能包含表示所要操作的矩形框和表示所要判斷的菱形框。這里我們繼續強調操作/判斷模型計算,假設框中包含建立C++程序所需的空白雙項選擇結構。程序員的任務就是根據算法需要用堆棧和嵌套兩種方法組合各種控制結構,然后在這些框中填人算法所要的操作和判斷,從而生成程序。
C++提供條件運算符(?:),與if/else結構密切相關。條件運算符是C++中惟一的三元運算符(thrnary operator),即取三個操作數的運算符。操作數和條件運算符一起形成條件表達式(conditional expression)。第一個操作數是條件,第二個操作數是條件為true時整個條件表達式的值.第三個操作數是條件為false時整個條件表達式的值。例如,下列輸出語句:
cout<<(grade>=60? "Passed":"Failed");
包含的條件表達式在grade=60取值為true時,求值為字符串“Passed”;在grade>=60取值為false時,求值為字符串"Failed"。這樣,帶條件表達式的語句實際上與上述if/else語句相同。可以看出,條件運算符的優先級較低,因此上述表達式中的話號是必需的。
條件表達式酌值也可以是要執行的操作。例如.下列條件表達式:
grade >=60? cout<<"Passed": cout<<"Failed";
表示如果grade大于或等于60,則執行cout<<"Passed",否則執行cout<<"Failed"。這與前面的if/else結構也是相似的。條件運算符可以在一些無法使用if/else語句的情況中使用。
嵌套if/else結構(nested if/else structure)測試多個選擇,將一個if/else選擇放在另一個if/else選擇中。例如,下列偽代碼語句在考試成績大于或等于90分時打印A.在80到89分之間時打印B,在70到79分之間時打印C,在60到69分之間時打印D,否則打印F。
if studen's grade is greater than or equal to 90
print "A"
else
If student's grade is greater than or equal to 80
print "B"
else
If student's grade is greater than or equal to 70
print "C"
else
If student's grade is greater than or equal to 60
print "D"
else
print "F"
這個偽代碼對應下列C++代碼:
if(grade>=90)
cout<<"A";
else
if(grade>=80)
cout<<"B";
else
if(grade>=70)
cout<<"C";
else
if(grade>=60)
cout<<"D";
else
cout<<"F";
如果考試成績大于或等于90分,則前4個條件都為true,但只執行第一個測試之后的cout語句。執行這個cout語句之后,跳過外層if/else語句的else部分。許多C++程序員喜歡將上述if結構寫成:
if(grade>=90)
cout<<"A";
else if(grade>=80)
cout<<"B";
else if(grade>=70)
cout<<"C";
else if(grade>=60)
cout<<"D";
else
cout<<"F";
兩者形式是等價的。后者更常用,可以避免深層縮排便代碼移到右端。深層縮排會使一行的空間太小,不長的行也要斷行,從而影響可讀性。
編程提示2.1
嵌套if/else結構比一系列單項選擇if結構運行速度快得多,因為它能在滿足其中一個條件之后即退出。
性能提示2.2
在嵌套if/else結構中,測試條件中true可能性較大的應放在嵌套if/else結構開頭.從而使嵌套if/else結構運行更快,比測試不常發生的情況能更早退出。
if選擇結構體中只能有一條語句。要在if選擇結構體中包括多條語句,就要把這些語句放在花括號({ })中。放在花括號中的一組語句稱為復合語句(compund statement)。
軟件工程視點2.2
復合語句可以放在程序中出現單句語句的任何地方。
下例在if/else結構的else部分包括復合語句:
if(grade>=60)
cout<<"Passed.\n";
else{
cout<<"Failed.\n";
cout<<"You must take this course again.\n";
}
如果grade小于60,則程序執行else程序體中的兩條語句并打印:
Failed.
You must take this course again.
注意else從句中的兩條語句放在花括號中。這些花括號很重要,如果沒有這些花括號,則下列語句:
cout<<"You must take this cours again.\n";
在if語句else部分之外,不管成績是否小于60都執行。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -