C及Windows可視化程序設(shè)計(jì)_第1頁
C及Windows可視化程序設(shè)計(jì)_第2頁
C及Windows可視化程序設(shè)計(jì)_第3頁
C及Windows可視化程序設(shè)計(jì)_第4頁
C及Windows可視化程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩108頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

會計(jì)學(xué)1C及Windows可視化程序設(shè)計(jì)無論采用何種編程技術(shù),總離不開最基本的結(jié)構(gòu)化程序設(shè)計(jì)思想。本章將首先結(jié)合實(shí)例簡要介紹C++語言的對象在基于過程設(shè)計(jì)中的使用方法,然后結(jié)合使用對象簡要介紹結(jié)構(gòu)化程序的基本設(shè)計(jì)原理,既為基于過程的編程打下基礎(chǔ),也加深使用對象的概念。第1頁/共113頁本節(jié)將通過求圓面積的程序,介紹典型的C++程序結(jié)構(gòu),目的是結(jié)合例題復(fù)習(xí)上一章的內(nèi)容,并為通過編程學(xué)習(xí)和掌握程序控制結(jié)構(gòu)打下基礎(chǔ)。【例2.1】編寫一個程序,在主函數(shù)中輸入圓的半徑,調(diào)用函數(shù)求圓的面積。為了便于介紹,在注釋中給程序語句編上號,空行是為了說明程序風(fēng)格而設(shè)的。#include<iostream>//1標(biāo)準(zhǔn)庫頭文件#include<math.h>//2數(shù)學(xué)運(yùn)算函數(shù)pow的頭文件usingnamespacestd;//3使用命名空間constdoublePI=3.14159;//4定義常量PI2.1典型C++程序結(jié)構(gòu)第2頁/共113頁doublearea(double);//5函數(shù)area的原型聲明voidmain()//6無返回值的主程序{//7主函數(shù)開始 doubler(0),s=0;//8演示兩種初始化方法 cout<<″請輸入半徑:″;//9輸出提示信息 cin>>r;//10將輸入值賦給r s=area(r);//11調(diào)用area函數(shù) cout<<″圓的面積是:<<″<<s<<endl;//12輸出結(jié)果}//13主函數(shù)結(jié)束//本函數(shù)計(jì)算圓的面積14doublearea(doubler)//15定義area函數(shù){returnPI*pow(r,2);}//16函數(shù)體,調(diào)用pow求r的平方程序運(yùn)行結(jié)果如下:請輸入半徑:10圓的面積是:314.159第3頁/共113頁C++函數(shù)有庫函數(shù)(標(biāo)準(zhǔn)函數(shù))和自定義函數(shù)兩類,本例求圓面積的函數(shù)area就是自定義函數(shù)。C++程序使用變量的基本規(guī)則是先聲明,后使用;對函數(shù)調(diào)用也是如此。如果沒有語句5,當(dāng)編譯主函數(shù)main掃描到語句s=area(r);時,尚沒有見到area函數(shù),這時就會報錯。所以在主函數(shù)之前使用語句5對area函數(shù)進(jìn)行原型聲明,即

doublearea(double);//函數(shù)area的原型聲明2.1.1函數(shù)和函數(shù)原型第4頁/共113頁上面的語句聲明了area的函數(shù)原型,即只列出參數(shù)的數(shù)據(jù)類型。它向編譯系統(tǒng)聲明,后面有一個area函數(shù),該函數(shù)有一個double類型的參數(shù),函數(shù)返回值類型也是double。編譯系統(tǒng)記錄下調(diào)用這個函數(shù)所需要的信息,然后根據(jù)函數(shù)原型對程序中調(diào)用函數(shù)的合法性進(jìn)行全面的檢查。因?yàn)槭菣z查調(diào)用函數(shù)的類型是否和聲明的一致,所以聲明時不需要給出參數(shù)的變量名稱。如果使用下述方式聲明:doublearea(doubler);因?yàn)榫幾g系統(tǒng)不檢查參數(shù)名,所以效果一樣。為了全面嚴(yán)格檢查調(diào)用函數(shù)是否匹配,應(yīng)該養(yǎng)成使用函數(shù)原型聲明的好習(xí)慣。第5頁/共113頁在C++中,每一個函數(shù)都有基本相同的形式:

函數(shù)類型聲明函數(shù)名(形式參數(shù)列表){變量聲明語句部分}函數(shù)可按任何順序出現(xiàn),且可出現(xiàn)在一個源程序文件或多個源程序文件中。函數(shù)定義中不可缺少的部分是:

函數(shù)類型聲明函數(shù)名(){}其他部分根據(jù)需要來確定有無。分析函數(shù)的定義形式,可以把定義分為兩部分:函數(shù)聲明部分和函數(shù)體。第6頁/共113頁1.函數(shù)聲明部分函數(shù)類型聲明用來定義函數(shù)返回值的數(shù)據(jù)類型,可使用基本數(shù)據(jù)類型和自定義類型。C++編譯系統(tǒng)要求必須指定類型,無返回值函數(shù)的類型為void。在C++程序里,子程序和函數(shù)是一個意思,都稱為函數(shù)。函數(shù)名是識別函數(shù)的名字,可用英文字母(a~z,A~Z)、數(shù)字及下劃線(_)組成的字符序列構(gòu)成,可使用長名字,而且下劃線可作為名字的開始,例如_func()。在編寫程序時,這些書寫方法都會碰到,應(yīng)該熟練地掌握它們。第7頁/共113頁形式參數(shù)列表在函數(shù)名后的圓括號“()”內(nèi),這里聲明的參數(shù)是形式參數(shù)(例abs函數(shù)的inta),簡稱形參(亦稱啞元)。當(dāng)調(diào)用該函數(shù)時,形參將被實(shí)際參數(shù)(亦稱實(shí)元)所替換,這種替換常叫做啞實(shí)結(jié)合。函數(shù)也可沒有參數(shù),但函數(shù)名后的圓括號“()”不能省略。2.函數(shù)體函數(shù)體是處理需要完成功能的部分,它從花括號“{”

開始,直到與此對應(yīng)的花括號“}”為止。變量說明通常接在“{”的后面,接在變量說明后的是語句部分。函數(shù)體的最后是“}”,表示該函數(shù)到此結(jié)束。C++中也常使用空的函數(shù)體函數(shù)。例如:voidtmpc(){}第8頁/共113頁這里tmpc是函數(shù)名。因?yàn)椤皗}”

內(nèi)沒有任何可供執(zhí)行的語句,所以該函數(shù)一旦被調(diào)用,就什么也不做而立即返回到調(diào)用它的函數(shù)里去,這就是C++程序的最小函數(shù)形式。這種函數(shù)有兩種用途:第1種是用在程序開發(fā)時,為給將來要設(shè)置的函數(shù)事先安排一個位置,往往給函數(shù)起個暫時的名字,待以后再設(shè)計(jì)這個函數(shù)。當(dāng)設(shè)計(jì)正確之后,再將它改為合適的名字。第2種是用在繼承中,基類聲明一個函數(shù)作為接口,由派生類根據(jù)需要去定義它的功能。第9頁/共113頁C++語言仍然可以使用宏定義。無參數(shù)的宏作為常量,而帶參數(shù)的宏則可以提供比函數(shù)調(diào)用更高的效率。預(yù)處理只是進(jìn)行簡單的文本代替而不進(jìn)行語法檢查,所以會存在一些問題。例如:#defineBUFSIZE100這里的BUFSIZE只是一個名字,不占用存儲空間并且能被放在一個頭文件中。在編譯期間編譯器將用“100”來代替所有的BUFSIZE。這種簡單的置換常常會隱藏一些很難發(fā)現(xiàn)的錯誤,并且這種方法還存在類型問題。比如這個BUFSIZE究竟是整數(shù)還是浮點(diǎn)數(shù)?而使用const,則把值代入編譯過程即可2.1.2const修飾符和預(yù)處理程序第10頁/共113頁解決這些問題。和上面宏定義等效的語句如下:constintBUFSIZE=100;這樣就可以在任何編譯器需要知道這個值的地方使用BUFSIZE,并且編譯器在編譯過程中可以通過必要的計(jì)算,把一個復(fù)雜的常量表達(dá)式縮減成簡單的。對于某些更復(fù)雜的情況,宏定義往往不如常量來得簡潔清楚,用const完全可以代替無參數(shù)的宏。用關(guān)鍵字const修飾的標(biāo)識符是一類特殊的常量,稱為符號常量,或稱之為const變量。第11頁/共113頁const修飾符的使用也很簡單。事實(shí)上,對基本數(shù)據(jù)類型的變量,一旦加上const修飾符,編譯器就將其視為一個常量,不再為它分配內(nèi)存,并且每當(dāng)在程序中遇到它時,都用在說明時所給出的初始值取代它。使用const可以使編譯器對處理內(nèi)容有更多的了解,從而對其進(jìn)行類型檢查,同時還能避免對常量的不必要的內(nèi)存分配并可改善程序的可讀性。因?yàn)楸籧onst修飾的變量的值在程序中不能被改變,所以在聲明符號常量時,必須對符號常量進(jìn)行初始化,除非這個變量是用extern修飾的外部變量。例如:第12頁/共113頁constinti=8;constintd;//錯誤!externconstintd;//可以const的用處不僅僅是在常量表達(dá)式中代替宏定義。如果一個變量在生存期中的值不會改變,就應(yīng)該用const來修飾這個變量,以提高程序的安全性。第13頁/共113頁C++語言預(yù)處理程序不是C++編譯程序的一部分,它負(fù)責(zé)分析處理幾種特殊的語句,這些語句稱為預(yù)處理語句。預(yù)處理程序?qū)@幾種特殊語句的分析處理是在編譯程序的其他部分之前進(jìn)行的。為了與一般的C++程序語句相區(qū)別,所有預(yù)處理語句都以位于行首的符號“?!遍_始。預(yù)處理語句有3種,它們分別是宏定義、文件包含和條件編譯。C++預(yù)處理程序和有關(guān)語句能夠幫助程序員編寫易讀、易改、易移植并便于調(diào)試的程序,對于模塊化程序設(shè)計(jì)也提供了很大的幫助。例如語句#definePI3.14159第14頁/共113頁是用名字PI來代替數(shù)字3.14159,又例如:#defineYES1#defineNO0則定義YES和NO分別是1和0。當(dāng)然,在這些場合下,最好是使用const語句。預(yù)處理程序把所有出現(xiàn)的、被定義的名字全部替換成對應(yīng)的“字符序列”。#define中的名字與C++中標(biāo)識符有相同的形式,為了區(qū)別,往往用大寫字母來表示(標(biāo)識符用小寫字母)。這也適合const語句?!纠?.1】中的語句1是文件包含語句,它指的是一個程序把另一個指定文件的內(nèi)容包含進(jìn)來。書寫時,可以使用引號也可以用尖括號。例如:#include″filename″或者#include<filename>

第15頁/共113頁都是在程序中把文件filename的內(nèi)容(引號或尖括號是一定要的)包含進(jìn)來。另外還要注意,文件名是用雙引號還是尖括號括起來,其含義并不一樣。使用尖括號時,C++編譯系統(tǒng)將首先在C++語言系統(tǒng)設(shè)定的目錄中尋找包含文件,如果沒有找到,就到指定的目錄中去尋找,這是引用系統(tǒng)提供的包含文件所采用的方法。自己定義的包含文件一般都放在自己指定的目錄中,所以在引用它們時,就采用雙引號,以通知C++編譯器在用戶當(dāng)前目錄下或指定目錄下尋找包含文件。指定的目錄不必在同一個邏輯盤中。例如自己定義的包含文件myfile.h在E盤的prog目錄中,則引用形式為#include″e:\prog\myfile.h″第16頁/共113頁在程序設(shè)計(jì)中,文件包含語句是非常有用的。一般C++系統(tǒng)中帶有大量的.h文件,用戶可根據(jù)不同的需要將相應(yīng)的.h文件包含起來。在【例2.1】中,因?yàn)橐玫紺++語言提供的冪運(yùn)算函數(shù)pow,pow聲明在數(shù)學(xué)運(yùn)算庫頭文件math.h中,所以要用#include<math.h>語句。標(biāo)準(zhǔn)輸入輸出是定義在標(biāo)準(zhǔn)庫iostream.h中的,所以要同時用到如下兩條語句:#include<iostream>usingnamespacestd;一般的C++程序都離不開這兩條語句,初學(xué)C++語言的讀者也最容易遺漏這兩條語句。第17頁/共113頁一個好的程序設(shè)計(jì)者應(yīng)該在程序中正確使用注釋來說明整個程序的功能、注意事項(xiàng)及有關(guān)算法等。有人認(rèn)為,注釋愈多,程序的可讀性和可維護(hù)性愈好,其實(shí)不然,僅需在必要的地方進(jìn)行注釋即可。也就是說,應(yīng)該加的是程序的注釋,不是對程序的說明。行的注釋形式是“//”,也可使用C語言的注釋方式“/*…*/”,但一定要配對使用。2.1.3程序注釋第18頁/共113頁C++語言的語句是用來向計(jì)算機(jī)系統(tǒng)發(fā)出操作指令的。一條語句經(jīng)過編譯后生成若干條機(jī)器指令。一個為實(shí)現(xiàn)特定目的的程序應(yīng)包含若干條語句,即一個C++程序可以由若干個源程序文件(分別編譯的文件模塊)組成,一個源文件可以由若干個函數(shù)和預(yù)編譯命令組成,一個函數(shù)又由數(shù)據(jù)定義和執(zhí)行語句兩部分組成。一條完整的語句必須以分號“;”結(jié)束??梢园殉绦蛘Z句分成如下幾類。2.1.4程序語句第19頁/共113頁1.聲明語句用來聲明對象的類型和初值。【例2.1】中的第8條語句是把對象r和s聲明為雙精度的浮點(diǎn)對象,并賦初值為零。最好養(yǎng)成在聲明對象的同時進(jìn)行初始化。人們已經(jīng)習(xí)慣于稱這些對象為變量,所以在面向?qū)ο笤O(shè)計(jì)時,仍然喜歡稱其為變量。從現(xiàn)實(shí)世界來看,它們確實(shí)映射著一個確定的對象。對這些簡單而基本的對象,雖然習(xí)慣地稱其為“變量”,但為了盡快養(yǎng)成使用對象思考問題的習(xí)慣,建議改稱對象。第20頁/共113頁2.表達(dá)式語句由一個表達(dá)式構(gòu)成一個語句,用以描述算術(shù)運(yùn)算、邏輯運(yùn)算或產(chǎn)生某種特定動作。最典型的用法是由賦值表達(dá)式構(gòu)成一個賦值語句。例如:“a=3”是一個賦值表達(dá)式,而“a=3;”就是一條賦值語句。從中可以看到,在一個表達(dá)式的最后加一個分號就構(gòu)成了一條語句。一條語句最后必須出現(xiàn)分號,分號是語句中不可缺少的一部分。例如:i=i+1//是表達(dá)式,不是語句i=i+1;//是語句,作用是使i的值加1由此可見,任何表達(dá)式都可以加上分號而成為語句。第21頁/共113頁例如:x+y;也是一條語句,作用是完成x+y的操作,它是合法的,但沒有實(shí)際意義?!纠?.1】中的語句

s=area(r);也是表達(dá)式語句。第22頁/共113頁3.程序控制語句程序控制語句是用來描述語句的執(zhí)行條件與執(zhí)行順序的語句。C++語言的控制語句有if()~else~條件語句for()~循環(huán)語句while()~循環(huán)語句do~while()循環(huán)語句Continue結(jié)束本次循環(huán)語句break中止循環(huán)或switch語句Switch多分支選擇語句

goto轉(zhuǎn)移語句Return從函數(shù)返回語句第23頁/共113頁以上9種語句中的括號()表示其中是一個條件,~表示內(nèi)嵌的語句。例如一條if()~else~的具體語句可寫成:if(x>y)z=x;elsez=y;詳細(xì)的使用方法在后續(xù)章節(jié)敘述。4.復(fù)合語句C++語句又可分為簡單語句和復(fù)合語句兩種。在C++語言中,諸如表達(dá)式x=1和cout<<x等,其后加上分號,即變成x=1;和cout<<x;這就構(gòu)成了簡單語句,分號是語句的終結(jié)符。第24頁/共113頁花括號“{”和“}”把一些語句組合在一起,使它們在語法上等價于一條簡單語句,稱其為復(fù)合語句(或稱分程序)。例如,在下面的語句中if(a>=0) //1 { //2 Cout<<″輸入為:″<<a<<endl; //3 returna; //4 } //5else //6 { //7 cout″輸入為:″aendl; //8 return(-a); //9 } //10第25頁/共113頁當(dāng)a>=0的條件成立時,執(zhí)行if后的復(fù)合語句,否則執(zhí)行else之后的復(fù)合語句。結(jié)束一個復(fù)合語句的右花括號之后不能帶分號(語句5和10),否則有時可能會導(dǎo)致錯誤;不能遺漏在復(fù)合語句的最后一條語句與右花括號之間的分號(語句4和9)。復(fù)合語句可由若干語句組成,這些語句可以是簡單語句,還可以是復(fù)合語句,這樣C++語言的語句就形成了一種層次結(jié)構(gòu),原則上可以不斷地?cái)U(kuò)大這種層次。復(fù)合語句在程序中是一種十分重要的結(jié)構(gòu)。第26頁/共113頁5.函數(shù)調(diào)用語句這是由一次函數(shù)調(diào)用加一個分號而構(gòu)成的一條語句。例如:area(r);6.空語句“;”是一條空語句。它只有一個分號,所以什么也不做。第27頁/共113頁C++語言中嚴(yán)格區(qū)分大小寫字母,如變量B和b是完全不同的兩個變量。C++語言慣用小寫字母,而且以下劃線“_”字符開頭的標(biāo)識符一般由系統(tǒng)內(nèi)部使用,最好不要用它作為標(biāo)識符的第1個字符。習(xí)慣上把使用宏定義的標(biāo)識符用大寫字母表示,例如將圓周率定義為PI。2.1.5大小寫字母的使用第28頁/共113頁C++語言的格式很自由,一行可以寫幾條語句。不過,使用適當(dāng)?shù)母袷綄τ诔浞掷斫膺@種語言非常重要。一個適當(dāng)格式的程序和一個不適當(dāng)格式的程序就像一封打得很漂亮的信和一封寫得非常凌亂的信,給人的印象是大不一樣的。應(yīng)該使源代碼易于理解,特別是容易被輸入這些程序的程序員所理解,這有助于復(fù)雜程序的調(diào)試及修改以前輸入的代碼。上面的程序就是按此原則書寫的。由此可見,應(yīng)使用縮進(jìn)格式和必要的空行的書寫風(fēng)格,并使源代碼具有層次性和邏輯性,以增加程序的可讀性和可操作性。2.1.6程序的書寫格式第29頁/共113頁一般來講,每次縮進(jìn)5個字符的位置,按程序特性設(shè)置空行。在本書中,為了節(jié)省篇幅,有意識地減少空行。讀者在輸入程序時,不要模仿,應(yīng)注意養(yǎng)成良好的書寫風(fēng)格。在書寫程序語句時,一般應(yīng)注意如下規(guī)則:①括號緊跟在函數(shù)名的后面,但在for和while后面,應(yīng)用一個空格與左括號隔開以增加可讀性。②數(shù)學(xué)運(yùn)算符的左右各留一個空格,以與表達(dá)式區(qū)別。③在表示參數(shù)時,逗號后面留一個空格。④在for、do…while和while語句中,合理使用縮進(jìn)、一對花括號和空行。第30頁/共113頁C++的cout和cin流能自動識別數(shù)據(jù)類型,根據(jù)數(shù)據(jù)類型進(jìn)行讀寫操作,完全不需要用戶設(shè)置,使用非常方便。不過,有時對輸入輸出仍有一定的要求,尤其是輸出格式。C++提供了兩種格式控制方式,一種是使用iso

類提供的接口,另一種是使用操縱符的特殊函數(shù),它的特點(diǎn)是可以直接包含在輸入和輸出表達(dá)式中,因此更為方便。注意,不帶形式參數(shù)的操縱符定義在iostream.h中,帶形式參數(shù)的操縱符定義在iomanip.h中。使用它們時,一是要正確包含相應(yīng)的頭部文件,二是只有與符號“<<”或“>>”連接時才起作用,三是無參數(shù)的操縱符函數(shù)不能帶有“()”號。2.1.7數(shù)據(jù)的簡單輸入輸出格式第31頁/共113頁這些操縱符的含義如下:名稱含義輸入/輸出Dec設(shè)置轉(zhuǎn)換基數(shù)為十進(jìn)制輸入/輸出Oct設(shè)置轉(zhuǎn)換基數(shù)為八進(jìn)制輸入/輸出hex設(shè)置轉(zhuǎn)換基數(shù)為十六進(jìn)制輸入/輸出showbase(intbase)輸出設(shè)置base為數(shù)制的基(0,8,10,16),默認(rèn)為0ws設(shè)置跳過輸入中的前導(dǎo)空白字符輸入ends插入一個空字符′\0′以結(jié)束字符串輸出endl輸出一個換行符并刷新流輸出flush強(qiáng)制刷新流輸出第32頁/共113頁名稱含義輸入/輸出resetiosflags(longflag)清除flag指定的標(biāo)志位輸出setiosflags(longflag)設(shè)置flag指定的標(biāo)志位輸出setfill(charch)設(shè)置ch為填充字符輸出setprecision(intn)設(shè)置浮點(diǎn)數(shù)輸出精度n輸出setw(intwidth)設(shè)置輸出數(shù)據(jù)字段寬度width輸出需要說明的是resetiosflags和setiosflags操縱符,它們的參數(shù)flag是引用C++的類ios里定義的枚舉常量,所以要使用限定符∷。第33頁/共113頁下面是幾個常用常量的含義:常量名含義ios∷left輸出數(shù)據(jù)按輸出域左邊對齊輸出ios∷right輸出數(shù)據(jù)按輸出域右邊對齊輸出ios∷showbase輸出帶有一個表示制式的字符ios∷showpoint浮點(diǎn)輸出時必須帶有一個小數(shù)點(diǎn)ios∷showpos在正數(shù)前添加一個″+″號ios∷scientific使用科學(xué)計(jì)數(shù)法表示浮點(diǎn)數(shù)ios∷fixed使用定點(diǎn)形式表示浮點(diǎn)數(shù)注意:flag可以是多個常量相“與”,例如setiosflags(ios∷showpoint|ios∷fixed)。第34頁/共113頁【例2.2】使用setw設(shè)置輸出寬度的例子。#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){inta=29,b=1001;cout<<a<<setw(6)<<b<<endl;cout<<a<<b<<endl;}程序的輸出為:291001291001setw(6)使b按域?qū)挒?輸出,即相當(dāng)于在a和b之間加入了2個空格。setw(6)只對緊接著的那個元素有效。第35頁/共113頁【例2.3】在下面的程序中,當(dāng)要求輸入時,均輸入100,給出程序的輸出結(jié)果。#include<iostream>#include<iomanip>usingnamespacestd;constdoublePI=3.141592;voidmain(){cout<<PI<<endl<<setprecision(0)<<PI<<endl<<setprecision(1)<<PI<<endl<<setprecision(2)<<PI<<endl<<setprecision(3)<<PI<<endl<<setprecision(7)<<PI<<endl;第36頁/共113頁intb=100;cout<<″Dec:″<<dec<<b<<endl<<″Hex:″<<hex<<b<<endl<<″Oct:″<<oct<<b<<endl;cout<<b<<endl <<100<<endl <<″Inputb=″;cin>>b; cout<<b<<endl; cout<<dec<<setiosflags(ios∷showpos)<<b<<endl; cout<<″Inputb=″; cin>>b; cout<<b<<endl; cout<<resetiosflags(ios∷showpos); cout<<b<<endl;}第37頁/共113頁輸出結(jié)果如下:3.141593.1415933.13.143.141592Dec:100Hex:64Oct:144144144Inputb=100144第38頁/共113頁+100Inputb=100+100100setprecision(intn)是設(shè)定顯示小數(shù)位數(shù)(小數(shù)點(diǎn)也占1位),1代表顯示整數(shù)數(shù)字,2才顯示小數(shù)點(diǎn)后面的一位數(shù)。0等于不設(shè),由系統(tǒng)決定。系統(tǒng)只輸出5位小數(shù),為了將它全部輸出,必須設(shè)置7位。由此可寫出前5行輸出。程序執(zhí)行cout<<oct命令后,將保持八進(jìn)制格式輸出,輸入100,但輸出仍然按八進(jìn)制,使用cout<<dec命令將它恢復(fù)為十進(jìn)制方式。下面語句第39頁/共113頁cout<<dec<<setiosflags(ios∷showpos)<<b<<endl;還將輸出設(shè)置為在正的數(shù)字前面顯示“+”號。這個設(shè)置保持到使用語句cout<<resetiosflags(ios∷showpos);清除該設(shè)置標(biāo)志為止。如果單獨(dú)使用語句resetiosflags(ios∷showpos);則不起作用。第40頁/共113頁【例2.4】分析下面程序的輸出。#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){ cout<<setfill(′*′)<<setw(0)<<15<<endl<<setw(1)<<15<<endl<<setw(2)<<15<<endl<<setw(3)<<15<<endl<<setw(4)<<15<<endl;

cout<<setw(16)<<setfill(′*′)<<″″<<endl;

cout<<setiosflags(ios∷right)第41頁/共113頁<<setw(5)<<1<<setw(5)<<2<<setw(5)<<3<<endl;

cout<<resetiosflags(ios∷right);

cout<<setiosflags(ios∷left)<<setw(5)<<1<<setw(5)<<2<<setw(5)<<3<<endl;}域?qū)抧比顯示位數(shù)少時,則不起作用,即不影響顯示。使用填充字符時,n比顯示位數(shù)大1,才發(fā)生填充作用。第42頁/共113頁如程序所示,要顯示15個“*”號,必須取n=16。setfill后面使用“″″”才能全部填充為設(shè)定字符“*”,否則將全部填充為空格。程序中使用15個“*”填充,就是用這種方法實(shí)現(xiàn)的。清除設(shè)置標(biāo)志之后,才能進(jìn)行新的設(shè)置。程序輸出如下。151515*15**15*******************1****2****31****2****3****第43頁/共113頁【例2.5】演示使用轉(zhuǎn)義字符的例子。#include<iostream>usingnamespacestd;voidmain(){cout<<″a\tb\n″;}假定系統(tǒng)設(shè)置制表符的一個“輸出區(qū)”占8列,用□代表空格,則輸出為a□□□□□□□b第44頁/共113頁程序一般是按語句的編寫順序依次執(zhí)行的。但是,如果用程序來模擬現(xiàn)實(shí)世界,則必須控制程序執(zhí)行的走向。例如問一個人吃飯沒有,如果沒吃飯,就給他飯吃,否則給他一杯茶水。這就是根據(jù)是否吃飯的條件決定的。為了方便理解,可以把控制流程的運(yùn)算方法分為兩類,即關(guān)系運(yùn)算和邏輯運(yùn)算。其實(shí),關(guān)系運(yùn)算是邏輯運(yùn)算的簡單形式。2.2關(guān)系運(yùn)算與邏輯運(yùn)算第45頁/共113頁1.關(guān)系運(yùn)算符及其優(yōu)先順序關(guān)系運(yùn)算又稱做“比較運(yùn)算”。將兩個值進(jìn)行比較,判斷比較的結(jié)果是否符合給定的條件。條件滿足為真,否則為假。例如x>5.0是一個關(guān)系運(yùn)算式,即關(guān)系表達(dá)式。若x的值是6,那么此表達(dá)式的值為真。表2.1是C++語言提供的6種關(guān)系運(yùn)算符及其含義。(見書59頁)4種關(guān)系運(yùn)算符(<,<=,>,>=)的優(yōu)先級別相同,后2種的級別也相同。但前4種的級別高于后2種。另外,算術(shù)運(yùn)算符的優(yōu)先級高于關(guān)系運(yùn)算符,關(guān)系運(yùn)算符的優(yōu)先級高于賦值運(yùn)算符。第46頁/共113頁表2.1C++語言提供6種關(guān)系運(yùn)算符及其含義關(guān)系運(yùn)算符含義實(shí)例<小于x<y<=小于等于x<=y>大于x>y>=大于等于x>=y==等于x==y!=不等于x!=y第47頁/共113頁2.關(guān)系表達(dá)式用關(guān)系運(yùn)算符將兩個表達(dá)式(可以是算術(shù)表達(dá)式或關(guān)系表達(dá)式、邏輯表達(dá)式、賦值表達(dá)式、字符表達(dá)式)連接起來的式子,稱為關(guān)系表達(dá)式。例如:a>ba+b<=d-c(x=5)>=(y=7)′d′!=′c′(a>b)>(b>c)都是關(guān)系表達(dá)式。關(guān)系表達(dá)式的值是個邏輯值,即“true”和“fasle”。C++語言有邏輯(bool)型數(shù)據(jù)類型,即ture為1,false為0。為兼容C,1代表“真”,0代表“假”。語句“boolstop=false;”的含義是“stop的邏輯值為0”。第48頁/共113頁假設(shè)a=4,b=3,c=2,對于如下的表達(dá)式,則有a>b的值為“true”,表達(dá)式的值為1。(a>b)==c-1的值為“true”(因?yàn)閍>b值為1,等于c-1的值),表達(dá)式的值為1。a-b<c的值為“true”,表達(dá)式的值為1。d=b>c,d的值為1。e=a>b>c,e的值為0,因?yàn)椤?gt;”運(yùn)算符是自左至右運(yùn)算,所以先算“a>b”的值為1,再執(zhí)行關(guān)系運(yùn)算:“1>c”,得值0賦給e。第49頁/共113頁3.邏輯運(yùn)算符及其優(yōu)先順序用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量(即“true”或“false”)連接起來的式子就是邏輯表達(dá)式。C++語言提供如下3種邏輯運(yùn)算符:&&邏輯與(相當(dāng)于其他語言中的AND)||邏輯或(相當(dāng)于其他語言中的OR)!邏輯非(相當(dāng)于其他語言中的NOT)&&和||是雙目運(yùn)算符;!是單目運(yùn)算符。符號“|”就是鍵盤第1排右邊的“|”號,它是上檔鍵,而“\”號是下檔鍵。書上因?yàn)榕虐娴淖煮w問題,變成了一條線“|”,編程時請注意。第50頁/共113頁例如,對于a和b而言,在下面的表達(dá)式中:a&&b若a、b都為真(即a、b值均不為0),則a&&b為真,否則為假。a||b如a、b都為假,則a||b為假,否則為真。!a若a為真,則!a為假;若a為假,則!a為真。在一個邏輯表達(dá)式中如果包含多個邏輯運(yùn)算符,應(yīng)按以下的優(yōu)先次序進(jìn)行運(yùn)算:①!(非)→&&(與)→||(或),!級別為最高;②綜合運(yùn)算時為!(非)→算術(shù)運(yùn)算符→關(guān)系運(yùn)算符→&&和||→賦值運(yùn)算符。第51頁/共113頁4.邏輯表達(dá)式如前所述,邏輯表達(dá)式的值應(yīng)該是一個邏輯量“true”或“false”。以數(shù)值1代表“true”,以0代表“false”,但判斷一個量是否為“true”時,以0代表“false”,以非零代表“true”。即把一個非0數(shù)值認(rèn)為“true”。例如:若a=2,則!a的值為0。a為非0被認(rèn)為“true”,對它進(jìn)行非運(yùn)算,得“false”,以0代表。若a=3,b=5,則a&&b的值為1。a、b為非0(即“true”),因此a&&b為true。若a=3,b=5,則a||b的值為1。第52頁/共113頁事實(shí)上,邏輯運(yùn)算符兩側(cè)的運(yùn)算對象不但可以是數(shù)值0和1,或者是0和非0的整數(shù),也可以是任何類型的數(shù)據(jù),可以是字符型、實(shí)型或?qū)ο蟮取2贿^要牢記,系統(tǒng)最終以0和非0來判定它們是屬于“true”還是“false”。例如:′a′&&′b′的值為1(因?yàn)樽帜竌和字母b的ASCⅡ碼值都不為0,都按“true”處理)。在邏輯表達(dá)式的求解中,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必須執(zhí)行下一個邏輯運(yùn)算符才能求出表達(dá)式的解時,才執(zhí)行該運(yùn)算符。第53頁/共113頁1966年,Bohm和Jacopini首次證明了只要3種控制結(jié)構(gòu)就能表達(dá)用一個入口和一個出口的框圖(流程圖)所能表達(dá)的任何程序邏輯。這3種控制結(jié)構(gòu)是順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。1968年Dijkstra建議:GOTO語句太容易把程序弄亂,應(yīng)從一切高級語言中去掉;只用3種基本控制結(jié)構(gòu)就可以寫各種程序,而這樣的程序可以自頂向下閱讀而不會返回。這促進(jìn)一種新的程序設(shè)計(jì)思想、方法和風(fēng)格的形成,以期顯著提高軟件生產(chǎn)效率和降低軟件維護(hù)的代價。2.3結(jié)構(gòu)化程序設(shè)計(jì)概述第54頁/共113頁1972年,Mills進(jìn)一步提出程序只應(yīng)有一個入口和出口,進(jìn)而填補(bǔ)了結(jié)構(gòu)化程序設(shè)計(jì)的原則。結(jié)構(gòu)化程序設(shè)計(jì)的概念和方法,以及支持這些方法的一整套軟件工具,就構(gòu)成了所謂的“結(jié)構(gòu)化革命”。這是存儲程序計(jì)算機(jī)問世以來對計(jì)算機(jī)界影響最大的一個軟件概念。順序結(jié)構(gòu)是最簡單而基本的結(jié)構(gòu),它是順序執(zhí)行各個語句,所以不再贅述。C++語言的結(jié)構(gòu)化程序設(shè)計(jì)的語句稱為程序控制結(jié)構(gòu),又可分為控制循環(huán)和控制選擇(選擇結(jié)構(gòu))。第55頁/共113頁1.if語句if語句在C++語言里的基本形式有兩種,即①if(表達(dá)式)語句1;②if(表達(dá)式)語句1;else語句2;這兩種語句形式均可用來設(shè)計(jì)選擇結(jié)構(gòu)程序。圖2.1是if語句流程圖,圖2.2是if~else語句流程圖。2.4控制選擇結(jié)構(gòu)

2.4.1用if語句實(shí)現(xiàn)選擇結(jié)構(gòu)設(shè)計(jì)第56頁/共113頁圖2.1if語句流程圖第57頁/共113頁圖2.2if~else語句流程圖第58頁/共113頁無論哪種形式的if語句,都需要首先判斷括號“()”內(nèi)的表達(dá)式的值。對第1種形式而言,若該值不為0,條件判斷的值為true,則執(zhí)行“()”后的語句1;若為0,條件判斷的值為false,if語句執(zhí)行終止。它的目的是根據(jù)需要執(zhí)行語句1,然后繼續(xù)執(zhí)行其他語句。對第2種形式而言,根據(jù)條件判斷的值執(zhí)行不同的語句。條件為true,執(zhí)行語句1,否則執(zhí)行語句2。在所有控制語句中,人們習(xí)慣把“()”內(nèi)的表達(dá)式叫做條件表達(dá)式。if語句就是根據(jù)條件表達(dá)式是否為0,來選擇執(zhí)行相應(yīng)語句的。在C++語言里,凡是能用簡單語句的地方都可以使用復(fù)合語句。因此,if語句(其他控制語句也如此)中的語句1和語句2都可以是復(fù)合語句。第59頁/共113頁【例2.6】使用if~else語句,編寫比較a、b兩個數(shù)的大小,且把大者賦給變量x,小者賦給y的程序。#include<iostream>usingnamespacestd;voidmain(){ inta=2,b=3,x=0,y=0; if(a>b){x=a;y=b;}//使用復(fù)合語句 else{x=b;y=a;}//使用復(fù)合語句 cout<<″x=″<<x<<″,y=″<<y<<endl;}該例中,因?yàn)閍的值為2,b的值為3,關(guān)系式a>b不成立,其值為0,于是執(zhí)行else后的復(fù)合語句{x=b;y=a;}。if語句執(zhí)行完畢后,x里存有b的值,y里存有a的值。第60頁/共113頁2.if語句的嵌套可以在第1個if語句中的else后,放上第2個if語句;在第2個if語句的else后又放上第3個if語句;以此類推,構(gòu)成如圖2.3的嵌套形式,即if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;

…elseif(表達(dá)式n)語句n;else語句n+1;第61頁/共113頁這是經(jīng)常使用的一種形式。在這種嵌套形式里,若表達(dá)式1的值不為0,則執(zhí)行語句1;若為0,則判斷表達(dá)式2,其結(jié)果不為0,執(zhí)行語句2;若為0,則判斷下一個if語句。若任何一個表達(dá)式都為0,則執(zhí)行語句n+1,即if語句里的第n個else部分。第62頁/共113頁圖2.3if語句嵌套形式流程圖第63頁/共113頁【例2.7】使用if語句嵌套形式的例子。這個程序使用嵌套形式的if語句,該程序根據(jù)學(xué)生的考分,來劃分成績的優(yōu)、良、及格、不及格?,F(xiàn)在分別用5、4、3、2來表示,且按如下規(guī)定劃分,即分?jǐn)?shù)等級100~95594~80479~60359~02假定考分變量為score,則其程序如下所示:第64頁/共113頁#include<iostream>usingnamespacestd;voidmain(){ intscore=0;chargrade; cout<<″score=″;cin<<score; if(score>94)grade=′5′; elseif(score>79)grade=′4′; elseif(score>59)grade=′3′; elsegrade=′2′; cout<<″grade=″<<grade<<endl;}假定學(xué)生考分為81分,待程序執(zhí)行后,從鍵盤上敲入“81”并按“Enter”鍵,則屏幕上就會顯示出該程序的運(yùn)行結(jié)果為4,表示該學(xué)生的成績?yōu)榱肌5?5頁/共113頁注意如下兩種嵌套形式的if語句是不同的。①if(a>b){if(b<c)c=a;}elsec=b;②if(a>b){if(b<c)c=a;elsec=b;}如果a=5,b=4,c=3,則①的c=3,而②的c=4。第66頁/共113頁3.條件運(yùn)算符對于下面形式的if語句if(a>b)max=a;elsemax=b;可以用條件運(yùn)算符來實(shí)現(xiàn)。即max=(a>b)?a:b;其中“(a>b)?a:b”是一個“條件表達(dá)式”,它的執(zhí)行過程如下:如果(a>b)條件為true,則條件表達(dá)式取a值,否則取b值。第67頁/共113頁條件運(yùn)算符要求有3個操作對象,稱做三目運(yùn)算符。條件表達(dá)式一般形式為

表達(dá)式1?表達(dá)式2:表達(dá)式3它們的流程圖如圖2.4所示。第68頁/共113頁圖2.4三目條件運(yùn)算符執(zhí)行示意圖第69頁/共113頁條件運(yùn)算符的使用說明如下:①條件運(yùn)算符的執(zhí)行順序。先求解表達(dá)式1,若值為非0(真)則求解表達(dá)式2,表達(dá)式2的值就作為整個條件表達(dá)式的值。若表達(dá)式1的值為0(假),則求解表達(dá)式3,此時表達(dá)式3的值就是整個表達(dá)式的值。②條件運(yùn)算符優(yōu)先于賦值運(yùn)算符。例如,max=(a>b)?a:b,就是先求解條件表達(dá)式,再將它的值賦給max。條件運(yùn)算符的優(yōu)先級別比關(guān)系運(yùn)算符和算術(shù)運(yùn)算符都低。第70頁/共113頁因此max=(a>b)?a:b中的括號可以不要,即可以寫成:max=a>b?a:b如果有a>b?a:b+1,就相當(dāng)于a>b?a:(b+1),而不相當(dāng)于(a>b?a:b)+1。③條件運(yùn)算符的結(jié)合方向?yàn)椤白杂蚁蜃蟆薄H绻幸韵聴l件表達(dá)式:a>b?a:c>d?c:d它相當(dāng)于a>b?a:(c>d)?c:d如果a=1,b=2,c=3,d=4,則條件表達(dá)式的值等于4。第71頁/共113頁④條件表達(dá)式中,表達(dá)式1的類型可以與表達(dá)式2和表達(dá)式3的類型不同。如

x?′a′:′b′x是整型變量,若x=0,則條件表達(dá)式的值為′b′。表達(dá)式2和表達(dá)式3的類型也可以不同,此時條件表達(dá)式的值的類型為二者中較高的類型。如x>y?1:1.5如果x≤y,則條件表達(dá)式的值為1.5;若x>y,值應(yīng)為1.0。由于1.5是實(shí)型,比整型高,因此將1轉(zhuǎn)換成實(shí)型值1.0。第72頁/共113頁switch語句是多分支選擇語句,稱為開關(guān)語句或者選擇語句。if語句只有兩個分支可供選擇,而實(shí)際上又常常需要用到多分支的選擇。switch語句可用來設(shè)計(jì)多路分支結(jié)構(gòu)程序。例如,學(xué)生成績分類(90分以上為“優(yōu)”,80~89分為“良”,70~79分為“中”等);工資統(tǒng)計(jì)分類;文化程度分類等。這些都可以用嵌套的if語句來處理,但分支較多時容易出錯,可讀性也較差。2.4.2用switch語句實(shí)現(xiàn)選擇結(jié)構(gòu)設(shè)計(jì)第73頁/共113頁switch語句的使用形式為switch(表達(dá)式){case常量表達(dá)式1:語句1;break;

……case常量表達(dá)式n:語句n;break;default:語句n+1;break;}第74頁/共113頁使用switch語句的例子見下一節(jié)的【例2.8】,但必須注意以下幾點(diǎn):①每個case中的break語句使switch語句只執(zhí)行一個case中的語句,執(zhí)行到break語句即從switch語句中跳出。若沒有break語句時,將繼續(xù)執(zhí)行下面各case部分的執(zhí)行語句。②當(dāng)不存在與表達(dá)式的值一致的常量表達(dá)式時,則執(zhí)行default后面的語句;當(dāng)default部分省略時,則什么也不執(zhí)行就跳出switch語句。③表達(dá)式的類型和常量表達(dá)式的類型必須一致。若表達(dá)式的值與某case后的常量表達(dá)式的值相等,則執(zhí)行該case后的語句。第75頁/共113頁④當(dāng)若干個case所執(zhí)行的內(nèi)容可用一條語句(當(dāng)然也可以是復(fù)合語句)表示時,允許這些case共用一條語句。⑤所有常量表達(dá)式的值必須互不相同,而case部分與default部分的順序可以自由書寫。如果default部分位于程序最后,default部分的break語句便可以省略;否則break語句也是必不可少的。第76頁/共113頁在許多實(shí)際問題中,都需要用到循環(huán)控制的方法,應(yīng)該注意比較各種循環(huán)控制結(jié)構(gòu)的用法及其特點(diǎn)。2.5循環(huán)控制結(jié)構(gòu)設(shè)計(jì)第77頁/共113頁while語句可用來設(shè)計(jì)循環(huán)結(jié)構(gòu)程序,它的形式為

while(表達(dá)式)語句;//注意別漏掉分號其功能是首先判斷()內(nèi)最初的表達(dá)式的值,其值不為0,執(zhí)行()后的語句;一旦執(zhí)行,接著再次判斷表達(dá)式的值,進(jìn)行與上述相同的處理,即若不為0時執(zhí)行()后的語句,為0時則跳出while循環(huán)。要特別注意,while后面的()里是表達(dá)式而不是語句,表達(dá)式是沒有分號的(初學(xué)者常多加一個分號,而在括號后面的語句中又漏掉分號)。一般是在while后面使用復(fù)合語句,即把其放入一對花括號{}中,然后在復(fù)合語句內(nèi)使用控制語句,以滿足表達(dá)式的結(jié)束條件。2.5.1while語句第78頁/共113頁【例2.8】從鍵盤接收輸入,用Ctrl+Z鍵結(jié)束循環(huán)。#include<iostream>usingnamespacestd;voidmain(){ charch; while(cin.get(ch))cout<<ch;}這種形式的while語句是由表達(dá)式取值完成結(jié)束條件的。從鍵盤輸入一串字符,cin的get成員函數(shù)可以讀一行(包括空格符),按“Enter”鍵將顯示讀入的內(nèi)容,但并不結(jié)束循環(huán),繼續(xù)等待輸入??捎肅trl+Z鍵使表達(dá)式的值為0,退出循環(huán)。第79頁/共113頁下面是演示輸入的過程。Wearehere!//輸入可以有空格Wearehere!//按“Enter”鍵顯示讀取的內(nèi)容Whereareyou?//繼續(xù)輸入Whereareyou?//輸出第80頁/共113頁【例2.9】演示使用while和switch語句的例子。#include<iostream>usingnamespacestd;voidmain(){inti=0,j=0,k=0;

charc;while(cin.get(c))//ExitwithCtrl+Z{ switch(c){ case′0′:case′1′:case′2′: case′3′:case′4′:case′6′: case′7′:case′8′:case′9′: i++; break;第81頁/共113頁 case′5′: k++; break; default: j++; break; }//結(jié)束switch選擇 }//結(jié)束while循環(huán) cout<<″\n\n數(shù)字出現(xiàn)″<<i+k<<″次\n″;cout<<″數(shù)字5出現(xiàn)″<<k<<″次\n″;cout<<″字母出現(xiàn)″<<j-1<<″次\n″;}本程序假定輸入一串字符,計(jì)算這些輸入中數(shù)字和字符各自出現(xiàn)的次數(shù)以及數(shù)字5單獨(dú)出現(xiàn)的次數(shù)。使用Ctrl+Z退出程序,但不要使用“Enter”鍵,否則字母計(jì)數(shù)將多記一次。使用while(1)或while(true)將造成無限循環(huán)。第82頁/共113頁do~while語句的形式為

do{語句}while(表達(dá)式);在do~while語句里,首先要執(zhí)行一次的是do后面的語句,之后才判斷條件表達(dá)式。其值不為0,則再次執(zhí)行do后的語句;若為0,則do語句執(zhí)行終止。2.5.2do~while語句第83頁/共113頁do~while語句和while語句的惟一區(qū)別就是:do~while語句不管表達(dá)式的值如何,首先執(zhí)行一次要循環(huán)執(zhí)行的語句。就是說,即使第1次判斷表達(dá)式時,其值為0,也要執(zhí)行一次循環(huán)語句。而while語句是首先判斷條件表達(dá)式,如果第1次判斷時,其值為0,則不執(zhí)行循環(huán)語句,而執(zhí)行循環(huán)體下面的語句。有些問題的循環(huán)次數(shù)未知,且又要至少執(zhí)行一次循環(huán)體,這時就適合使用do~while語句。注意不要遺忘do~while語句中表達(dá)式右括號外面的分號。下面兩個例子演示了兩者的區(qū)別。第84頁/共113頁【例2.10】演示使用while語句求兩個非0整數(shù)之和。#include<iostream>usingnamespacestd;voidmain(){ inta,b,x; cin>>a>>b; while(a!=0&&b!=0){ x=a+b; cout<<″x=″<<x<<endl; cin>>a>>b; }}輸入:00第85頁/共113頁【例2.11】演示使用do~while語句求兩個非0整數(shù)之和。#include<iostream>usingnamespacestd;voidmain(){ inta,b,x; do{cin>>a>>b; x=a+b; cout<<″x=″<<x<<endl; }while(a!=0&&b!=0);

}輸入:00輸出:x=0第86頁/共113頁【例2.10】和【例2.11】的區(qū)別是:當(dāng)a和b全部輸入為0時,【例2.11】的程序不執(zhí)行a+b和cout兩個語句就跳出循環(huán);而【例2.11】的程序是執(zhí)行了上述兩個語句后才跳出循環(huán),故它能在屏幕終端上顯示出x=0的結(jié)果之后,再終止程序執(zhí)行。第87頁/共113頁1.for語句的形式for語句的形式為

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句;for語句首先求表達(dá)式1的值,其次判斷表達(dá)式2,不為0則執(zhí)行()后的語句。此后求表達(dá)式3的值,再返回來判斷表達(dá)式2,不為0,則再次執(zhí)行()后的語句。這樣一直重復(fù)執(zhí)行到表達(dá)式2的值為0時為止,不再重復(fù)操作,而去執(zhí)行下面的語句。因此,若第1次所求表達(dá)式2的值就是0,則for語句就結(jié)束循環(huán),即一次也沒有執(zhí)行()后的語句。2.5.3for語句第88頁/共113頁for語句可用來設(shè)計(jì)循環(huán)結(jié)構(gòu),它等價于下列程序:表達(dá)式1;while(表達(dá)式2){ 語句; 表達(dá)式3;

}第89頁/共113頁【例2.12】演示將輸入字符串中的字符位置顛倒過來輸出的例子。#include<iostream>#include<string>usingnamespacestd;voidmain(){ stringstr;

cin>>str; for(intj=str.size();j>=0;j--) cout<<str.substr(j,1);

}運(yùn)行時輸入:abcdefghijklmnopqrstuvwxyz12,5運(yùn)行后輸出:5,21zyxwvutsrqponmlkjihgfedcba第90頁/共113頁表達(dá)式1僅在開始執(zhí)行for語句時執(zhí)行一次,用來求控制循環(huán)的循環(huán)變量初始值,也就是字符串的長度。表達(dá)式2是循環(huán)條件,在執(zhí)行要循環(huán)的語句前求解,如果滿足j>=0時,執(zhí)行輸出語句,將字串里位置為j的字符輸出,j<0時結(jié)束循環(huán)。表達(dá)式3用于更新循環(huán)變量的值,在執(zhí)行循環(huán)語句后執(zhí)行j=j-1操作,以便更新循環(huán)變量j的值,供表達(dá)式2求解。第91頁/共113頁2.表達(dá)式默認(rèn)的for語句for語句的三個表達(dá)式可以省略1個、2個、甚至3個,但無論省略幾項(xiàng),兩個分號不能省略。在表達(dá)式1和表達(dá)式3省略的情況下,與while語句等價。在省略表達(dá)式2或3個表達(dá)式都省略的情況下,即形如:

for(表達(dá)式1;;表達(dá)式3)語句;或

for(;;)語句;的for語句將無限循環(huán)下去。這是因?yàn)樽鳛闂l件的表達(dá)式2不出現(xiàn)時,編譯程序認(rèn)為其值恒為真。故以上兩種形式的for語句是無限循環(huán)語句。for

語句的表達(dá)式可以默認(rèn),這是它同if語句、while語句及do~while語句的區(qū)別之一。第92頁/共113頁3.表達(dá)式含逗號運(yùn)算符的for語句for語句中的表達(dá)式1和表達(dá)式3可以使用逗號運(yùn)算符,如:for(i=0,j=20;i<j;i++,j--)其中i=0,j=20為表達(dá)式1;i++,j--為表達(dá)式3。這兩個表達(dá)式都是從左到右計(jì)算,結(jié)果的類型和值是右操作數(shù)的類型和值。第93頁/共113頁1.break語句break語句的形式為

break;break語句是中止語句,是從循環(huán)語句或switch語句中跳出的一個極其方便的方法。程序一執(zhí)行break語句,立即無條件地從包含break語句的最小while、do~while、for或switch中跳出。2.5.4break語句、countinue語句及goto語句第94頁/共113頁【例2.13】已知產(chǎn)值及產(chǎn)值增長速度,編寫計(jì)算產(chǎn)值增長1倍所需年數(shù)的程序。程序所求年數(shù)存于y中;當(dāng)前產(chǎn)值存于c中;每年產(chǎn)值增長速度存放在a中。#include<iostream>usingnamespacestd;voidmain(){floata,c=100000000.00;

for(;;){//第5行 inty=0; cout<<″a=″;//輸入要求的增長率 cin>>a; if(a<=0.0)break; floatc1=c;第95頁/共113頁 for(;;){//第11行 c1*=(1+a); ++y; if(c1>2*c)break; }cout<<″a=″<<a<<″\tyear=″<<y<<endl;}}運(yùn)行實(shí)例如下:a=0.2a=0.2year=4a=0第96頁/共113頁程序中使用了2個break語句:第1個break語句,表示當(dāng)所輸入的增長速度a≤0時,說明不合題意,需立即退出第5行的for循環(huán)語句;第2個break語句,表示當(dāng)產(chǎn)值已達(dá)到2倍時,y中的數(shù)就是所求的年數(shù),這時無須再執(zhí)行第11行的for語句了,必須從該for語句中退出。第97頁/共113頁2.continue語句continue語句的形式為

continue;continue語句是繼續(xù)語句,用在while、do~while和for等3種語句中,它指出立即進(jìn)行下次表達(dá)式的判斷。具體說就是:(1)在while和do~while語句中,一執(zhí)行continue語句,則立即進(jìn)行while后()內(nèi)的表達(dá)式的判斷。(2)在for語句中,一執(zhí)行continue語句,則在判斷表達(dá)式2之前,先求解表達(dá)式3。continue語句也可作為if的執(zhí)行語句。第98頁/共113頁【例2.14】打印出數(shù)碼1~10中奇數(shù)的程序。#include<iostream>#include<string>usingnamespacestd;voidmain(){ inti=0; while(++i<=10){ if(i%2==0)continue;//偶數(shù)則結(jié)束本次循環(huán) cout<<i″″;//輸出奇數(shù) }}運(yùn)行輸出:13579第99頁/共1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論