C程序設(shè)計(jì)基礎(chǔ)_第1頁
C程序設(shè)計(jì)基礎(chǔ)_第2頁
C程序設(shè)計(jì)基礎(chǔ)_第3頁
C程序設(shè)計(jì)基礎(chǔ)_第4頁
C程序設(shè)計(jì)基礎(chǔ)_第5頁
已閱讀5頁,還剩118頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章C++程序設(shè)計(jì)根底【學(xué)習(xí)內(nèi)容與要點(diǎn)】本章介紹VC++語言的特點(diǎn)、語法和使用方法,使讀者能夠迅速掌握C++編程方法。重點(diǎn)掌握:

C++語言的特性

C++語言數(shù)據(jù)類型和運(yùn)算符

C++語言語句

C++函數(shù)1/11/202412.1C++語言概述C++語言是上世紀(jì)80年代,AT&T貝爾實(shí)驗(yàn)室的BjarneStroustrup博士開發(fā)的一種程序設(shè)計(jì)語言,是一種面向?qū)ο笤O(shè)計(jì)(Object-0rientedProgramming,OOP)的程序語言,具有封裝性、繼承性和多態(tài)性等特點(diǎn)。1/11/202422.1.1C++語言的特性C++語言是上世紀(jì)80年代,AT&T貝爾實(shí)驗(yàn)室的BjarneStroustrup博士開發(fā)的一種程序設(shè)計(jì)語言,是一種面向?qū)ο笤O(shè)計(jì)(Object-0rientedProgramming,OOP)的程序語言,具有封裝性、繼承性和多態(tài)性等特點(diǎn)。1.面向?qū)ο笸ㄟ^為數(shù)據(jù)和代碼建立分塊的內(nèi)存區(qū)域,面向?qū)ο蟮某绦蛟O(shè)計(jì)提供了對(duì)程序進(jìn)行模塊化的一種程序設(shè)計(jì)方法。這時(shí),對(duì)象可以看成計(jì)算機(jī)內(nèi)存中的一塊區(qū)域。通過將內(nèi)存分塊,每個(gè)對(duì)象在功能上相互之間保持相對(duì)獨(dú)立。這些內(nèi)存塊不但存儲(chǔ)數(shù)據(jù),而且也存儲(chǔ)代碼,這可保證對(duì)象是受保護(hù)的,即只有處于對(duì)象中的代碼才可以訪問存儲(chǔ)于這個(gè)對(duì)象中的數(shù)據(jù),使對(duì)象免于受外部未知事件的影響。1/11/20243在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,內(nèi)存塊的結(jié)構(gòu)可被用作樣板產(chǎn)生許多同樣的對(duì)象,但對(duì)象之間只能通過函數(shù)調(diào)用相互通信。正因?qū)ο蟮倪@一特點(diǎn),面向?qū)ο罂梢员豢闯砂咽澜绶纸獬上嗷ネㄐ诺膶?duì)象的方法,程序中的對(duì)象映射了現(xiàn)實(shí)世界中的對(duì)象。面向?qū)ο蟮母拙幊谭椒ň褪菑脑S多具有共性的一般事物中尋找規(guī)律,即抽象。C++要求程序員集中于事物的本質(zhì)特征,而不是具體細(xì)節(jié)和實(shí)現(xiàn)。從一組一般事物中,抽取公共的行為將其放入類中,這就是抽象分類的方法。不同類的對(duì)象具有不同的公共行為。面向?qū)ο蟮某绦蛟O(shè)計(jì)具有封裝性、多態(tài)性和繼承性等特點(diǎn)。1/11/202442.封裝性所謂封裝(Encapsulation)就是將數(shù)據(jù)和操作數(shù)據(jù)的方法及函數(shù)組合在一起構(gòu)成類(Class),從而實(shí)現(xiàn)數(shù)據(jù)抽象和數(shù)據(jù)隱藏。封裝意味著對(duì)象應(yīng)具有明確的功能,并有能和其他對(duì)象相互作用的接口,也意味著對(duì)象內(nèi)部代碼受到保護(hù),只有處于對(duì)象中的代碼才可以訪問該對(duì)象的內(nèi)部數(shù)據(jù),這就是數(shù)據(jù)的隱藏。封裝使一個(gè)對(duì)象可以像一個(gè)可拆卸的部件,在各種程序中調(diào)用,同時(shí)使對(duì)象功能不受影響。封裝可以減少程序的復(fù)雜性,它的完成主要是通過類內(nèi)部的各種機(jī)制來完成的,因此,類具有一套隱藏復(fù)雜性的機(jī)制,以使封裝可以具有平安且易于移植的特性。同一個(gè)類的所有對(duì)象使用相同的數(shù)據(jù)結(jié)構(gòu)和方法,但每個(gè)對(duì)象都擁有各自的數(shù)據(jù)。定義一個(gè)類即為在程序中參加了新的數(shù)據(jù)類型,并要求編譯程序?qū)⑺暈槌绦蛘Z言的內(nèi)建數(shù)據(jù)類型。C++將程序代碼和數(shù)據(jù)結(jié)合成一個(gè)單獨(dú)的類別形態(tài),定義方法如下:1/11/20245classfunc{…//定義類的成員數(shù)據(jù)和成員函數(shù));funcfuncl;//說明變量funcl的類型為類func封裝具有很大的優(yōu)越性,例如傳統(tǒng)的C語言將數(shù)據(jù)與程序分別處理,程序員可以直接讀取數(shù)據(jù),但以后如果發(fā)現(xiàn)這樣的處理結(jié)構(gòu)不太好需要修改時(shí),就需要修改這個(gè)程序,而對(duì)于C++就簡(jiǎn)單的多,只需對(duì)類進(jìn)行重新定義,這樣就不需要對(duì)源程序進(jìn)行修改。1/11/202463.繼承性繼承(Inheritance)的概念是從人工智能工程衍生而來的,利用繼承可以防止相同的內(nèi)容重復(fù)出現(xiàn),能夠節(jié)省大量的時(shí)間以及存儲(chǔ)空間。在c++語言中,可以從一個(gè)類派生出另一個(gè)類。派生類(也稱之為子類)繼承了其父類和祖先類的數(shù)據(jù)成員和成員函數(shù),并通過聲明新的數(shù)據(jù)成員和成員函數(shù)來增加新的功能。1/11/202474.多態(tài)性多態(tài)性(Polymorphism)意味著同樣的表示法可以處理多種不同類型的數(shù)據(jù),以便同一符號(hào)的名稱可以在類層中共用。也就是說,不同對(duì)象接受相同函數(shù)調(diào)用時(shí),可以導(dǎo)致完全不同的行為。多態(tài)性可以分為靜態(tài)多態(tài)性(StaticPolymorphise)和動(dòng)態(tài)多態(tài)性(DynamicPolymorphise)兩種。靜態(tài)多態(tài)性是在編譯階段由編譯程序根據(jù)操作數(shù)從多個(gè)同名函數(shù)中選擇相應(yīng)的調(diào)用。而動(dòng)態(tài)多態(tài)性是指在執(zhí)行階段才處理目標(biāo)的實(shí)際差異,而調(diào)用不同的對(duì)象執(zhí)行不同的處理方式。VisualStudio支持C++,這是通過功能齊全的代碼編輯器、工程模板、設(shè)計(jì)器、代碼向?qū)?、功能?qiáng)大且易于使用的調(diào)試器以及其他工具實(shí)現(xiàn)的。通過.NETFramework類庫,可以訪問多種操作系統(tǒng)效勞和其他有用的精心設(shè)計(jì)的類,這些類可顯著加快開發(fā)周期。1/11/202482.1.2VC++程序的結(jié)構(gòu)1.VC++控制臺(tái)應(yīng)用程序VC++控制臺(tái)應(yīng)用程序的根本結(jié)構(gòu)如下:#include"stdafx.h"usingnamespaceSystem;intmain(array<System::String^>^args){語句;}說明如下:using,namespace關(guān)鍵字:用于引用.NET框架類庫中的現(xiàn)有資源,可屢次使用。System、System.Text等:命名空間,提供構(gòu)建應(yīng)用程序所需系統(tǒng)功能的訪問。1/11/20249類:編寫類并用類創(chuàng)立對(duì)象Main方法:描述類的行為。語句:程序中執(zhí)行操作的指令。大括號(hào)“{〞和“}〞:標(biāo)識(shí)某個(gè)代碼塊的開始和結(jié)束。2.Windows窗體應(yīng)用程序Windows窗體應(yīng)用程序中隱藏代碼.h文件的一般形式如下。#pragmaoncenamespace工程名{ usingnamespaceSystem; usingnamespaceSystem::ComponentModel; usingnamespaceSystem::Collections; usingnamespaceSystem::Windows::Forms; usingnamespaceSystem::Data; usingnamespaceSystem::Drawing;1/11/202410 ///<summary> ///Form1摘要 /// ///警告:如果更改此類的名稱,那么需要更改 ///與此類所依賴的所有.resx文件關(guān)聯(lián)的托管資源編譯器工具的 ///“資源文件名〞屬性。否那么, ///設(shè)計(jì)器將不能與此窗體的關(guān)聯(lián) ///本地化資源正確交互。 ///</summary> privaterefclassForm1sealed:publicSystem::Windows::Forms::Form { public: Form1(void) { InitializeComponent();1/11/202411

// //TODO:在此處添加構(gòu)造函數(shù)代碼 // } protected: ///<summary> ///清理所有正在使用的資源。 ///</summary> ~Form1() { if(components) { deletecomponents; } }1/11/202412private:System::Windows::Forms::Button^button1; protected: private:System::Windows::Forms::PictureBox^pictureBox1; private:System::Windows::Forms::PictureBox^pictureBox2; private:System::Windows::Forms::PictureBox^pictureBox3; private:System::Windows::Forms::PictureBox^pictureBox4; private:System::Windows::Forms::PictureBox^pictureBox5; private:System::ComponentModel::IContainer^components;1/11/202413private: ///<summary> ///必需的設(shè)計(jì)器變量。 ///</summary>private:System::Voidbutton1_Click(System::Object^sender,System::EventArgs^e){語句;}};}1/11/2024143.代碼格式設(shè)置〔1〕縮進(jìn):VC++語言同樣使用縮進(jìn),以增加可讀性?!?〕區(qū)分大小寫:VC++編譯器區(qū)分大寫字符和小寫字符?!?〕注釋:使用雙斜杠〔//〕進(jìn)行單行注釋。使用符號(hào)“/*〞和“*/〞可注釋多行。1/11/2024152.2數(shù)據(jù)類型和運(yùn)算符程序是由數(shù)據(jù)和處理數(shù)據(jù)的操作組成的。因此學(xué)習(xí)C++編程之前,必須首先了解c++語言的根本數(shù)據(jù)類型和運(yùn)算符,以及兩者結(jié)合后對(duì)數(shù)據(jù)的簡(jiǎn)單處理方式——運(yùn)算和表達(dá)式。1/11/202416根本數(shù)據(jù)類型1.根本數(shù)據(jù)類型C++語言所處理的數(shù)據(jù)都具有特定的類型。數(shù)據(jù)類型規(guī)定了數(shù)據(jù)的存儲(chǔ)方式以及可以對(duì)它們進(jìn)行的操作。類型名可以是一個(gè)標(biāo)識(shí)符、一個(gè)關(guān)鍵字或者是一個(gè)表達(dá)式。根本數(shù)據(jù)類型是c++類型系統(tǒng)的根本組成局部。這些根本數(shù)據(jù)類型包括字符類型、整數(shù)類型、浮點(diǎn)類型、雙精度類型和無值類型,相應(yīng)的關(guān)鍵字是char,int,float和void。這些數(shù)據(jù)類型的位數(shù)和相應(yīng)的取值范圍如表2-1所示。1/11/202417表2-1根本數(shù)據(jù)類型的位數(shù)與取值范圍類型名位數(shù)取值范圍char8-128~127int16-32,768~32,767float32-3.4E-38~3.4E+38double64-1.7E-308~1.7E+308voidO無值1/11/202418字符類型的變量用于保存8位ASCII字符,整型變量用于保存整數(shù),浮點(diǎn)類型和雙精度類型的變量用于保存帶小數(shù)點(diǎn)的數(shù),但雙精度類型比浮點(diǎn)類型有更大的值域。除void類型外,其他類型前面可以加類型修飾符用于改變根本類型的含義,以適用于各種情況下的需要。C++的類型修飾符包括:signed(有符號(hào))、unsigned(無符號(hào))、short(短型)和long(長(zhǎng)型)。修飾符signed和unsigned可以用于字符類型和整型,而short和long可以用于整型,long還可以用于雙精度類型。表2-2給出了根本數(shù)據(jù)類型和類型修飾符的組合情況。1/11/202419表2-2組合類型的位數(shù)與取值范圍類型名位數(shù)取值范圍char8-128~127signedchar8-128~127unsignedchar80~255shortint16-32,768~32,767signedshortint16-32,768~32,767unsignedshortint160~65,535int16-32,768~32,767signedint16-32,768~32,7671/11/202420unsignedint16O~65,535longint32-2,147,483,648~2,147,483,647signedlongint32-2,147,483,648~2,147,483,647unsignedlongint320~4,294,967,295float32-3.4E-38~3.4E+38double64-1.7E-308~1.7E+308longdouble803.4E~1.1E+49321/11/202421C++語言在對(duì)變量使用之前,必須對(duì)此變量進(jìn)行說明。以下是一些合法的變量聲明:shorti,j=8;inta,b=200;longK,i=200000;floatPC,PI=3.14;doubleb,a=0.01118;charstringl,string2="\n",string3="a";除了這些根本數(shù)據(jù)類型以外,C++的數(shù)據(jù)類型還包括常量(整常量、浮點(diǎn)常量和字符串常量)、類、結(jié)構(gòu)、數(shù)組和指針等,其他數(shù)據(jù)類型將在以后進(jìn)行討論。1/11/2024222.變量的類型和初值就像常量具有各種類型一樣,變量也具有相應(yīng)的類型。變量在使用之前需要首先聲明其類型和名稱。變量聲明語句的形式如下:數(shù)據(jù)類型變量名1,變量名2,…,變量名n;例如:chara,b;//說明a,b為字符型變量intx,y;//說明x,y為整型變量longints1;//說明s1為長(zhǎng)整型變量floatd,f;//說明d,f為浮點(diǎn)型變量doublex1,x2;//說明x1,x2為雙浮點(diǎn)型變量unsignedintm;//說明m為無符號(hào)整型變量C++中沒有字符串類型變量,字符串要用數(shù)組或指針處理。變量的類型被說明后,計(jì)算機(jī)就給其分配相應(yīng)類型的存儲(chǔ)單元,在程序中可以給該變量賦相應(yīng)類型允許的值。變量在說明的同時(shí),也可以給它賦以初值,稱為變量的初始化。例如:chara='*';//說明字符型變量a同時(shí)給a賦*值floatd=3.14159e-5;//說明d為浮點(diǎn)型變量。1/11/202423數(shù)組數(shù)組是一種構(gòu)造類型,它是由根本數(shù)據(jù)類型按一定的規(guī)那么組合而成的,是一組具有相同名字和不同下標(biāo)的變量。數(shù)組中的每個(gè)變量稱為數(shù)組元素,在一個(gè)數(shù)組中,每個(gè)元素的類型都相同。例如:a[5]中的a為數(shù)組名字,方括號(hào)中的5為下標(biāo)。在C++中根據(jù)方括號(hào)的個(gè)數(shù)分為一維數(shù)組、二維數(shù)組、……n維數(shù)組等。常用的是一維和二維數(shù)組。例如:a[5],b[4][5],c[2][3][4]。其中,a為一維數(shù)組;b為二維數(shù)組;c為三維數(shù)組。數(shù)組名由用戶定義。數(shù)組與其他變量一樣,使用之前必須先說明(或定義)。1.一維數(shù)組的定義和引用’定義數(shù)組的格式如下:類型說明數(shù)組名[常量表達(dá)式]其中,常量表達(dá)式的值為數(shù)組元素的個(gè)數(shù)。例如:inta[5];charc[8];1/11/202424其中,inta[5]定義了數(shù)組名為a的數(shù)組,數(shù)組a中共有5個(gè)元素,每個(gè)元素可以存放一個(gè)整型數(shù);數(shù)組c中有8個(gè)元素,每個(gè)元素中存放一個(gè)字符型數(shù)據(jù)。數(shù)組定義后,機(jī)器就為其分配一塊連續(xù)的存儲(chǔ)單元。在內(nèi)存中的存放順序?yàn)閍[O],a[l],a[2],A[3],a[4]。數(shù)組定義后,在程序中就可以使用了。在程序中使用的是數(shù)組的元素,不能對(duì)整個(gè)數(shù)組進(jìn)行引用。一維數(shù)組元素的引用形式為:數(shù)組名[下標(biāo)]C++的數(shù)組下標(biāo)從O開始,最后一個(gè)元素的下標(biāo)是數(shù)組定義中常量表達(dá)式的值減1。例如inta[5];中5個(gè)元素分別是:a[0]a[1]a[2]a[3]a[4]數(shù)組的下標(biāo)必須是整型常數(shù)或整型變量。一般在程序中常用一個(gè)變量來控制數(shù)組元素的下標(biāo)。當(dāng)變量變化時(shí),表示不同的數(shù)組元素。1/11/2024252.二維數(shù)組的定義和引用二維以上的數(shù)組稱為多維數(shù)組,其中常用的是二維數(shù)組。二維數(shù)組的定義形式為:類型說明數(shù)組名[常量1][常量2]例如:intb[3][4];定義了一個(gè)二維數(shù)組,數(shù)組名為b,[3]為第l維,[4[為第2維。可以將二維數(shù)組視為一矩陣,[常量1]表示矩陣的行,[常量2]表示矩陣的列。因此,該數(shù)組是一個(gè)3行4列的矩陣。行和列下標(biāo)元素的取值也由0開始,因此上述b數(shù)組元素形成的矩陣為:b[O][O]b[O][1]b[O][2]b[O][3]——0行b[1][O]b[l][l]b[1][2]b[1][3]——1行b[2][0]b[2][l]b[2][2]b[21[3]——2行1/11/202426與一維數(shù)組相同,二維數(shù)組定義后,在程序中使用的是數(shù)組中的元素。二維數(shù)組元素的引用形式為:數(shù)組名[行下標(biāo)][列下標(biāo)]例如:b[0][O],b[0][1]等。3.?dāng)?shù)組元素的賦初值在定義數(shù)組時(shí),可以給數(shù)組的各元素賦初值,稱為數(shù)組元素的初始化?!?〕一維數(shù)組的初始化例如:inta[5]={1,2,3,4,5)};初始化后,數(shù)組a的5個(gè)元素將獲取數(shù)值,其中a[0]的值為l,a[1]的值為2,a[2]的值為3,a[3]的值為4,a[4]的值為5。一維數(shù)組初始化時(shí),數(shù)組名后[]中的常量可以省略。例如:inta[]={l,2,3,4,5);編譯系統(tǒng)根據(jù){}中所賦初值的個(gè)數(shù)自動(dòng)定義數(shù)組的大小。1/11/202427賦初值時(shí),假設(shè)所賦常量的個(gè)數(shù)少于定義數(shù)組元素的個(gè)數(shù)時(shí),少的元素值按0處理。例如:inta[5]=[1,2};初始化后a數(shù)組中5個(gè)元素的值為:a[0]=1,a[1]=2,a[2]=0,a[3]=0,a[4]=0。〔2〕二維數(shù)組的初始化二維數(shù)組初始化有以下幾種形式。例如:intb[2][3]={{l,2,3},{4,5,6}};或者intb[2][3]={1,2,3,4,5,6};上述兩種初始化是等價(jià)的,其結(jié)果使b[0][0]=1,b[0][1]=2,b[0][2]=3,b[l][0]=4,b[1][1]=5,b[1][2]=6。又如intb[2][3]={{1,2},{3}};初始化后,b[0][0]=1,b[0][1]=2,b[1][0]=3,而其余各元素為默認(rèn)值0。1/11/202428〔3〕字符數(shù)組的初始化字符數(shù)組是指數(shù)組元素是char型的一種數(shù)組。字符數(shù)組也分為一維的、二維的、.三維的和多維的。字符數(shù)組通常用來處理字符串,因此字符數(shù)組賦初值時(shí)既可以賦字符,也可以賦字符串。給字符型數(shù)組賦字符串時(shí),每個(gè)數(shù)組元素存放一個(gè)字符,字符串定義時(shí)的長(zhǎng)度要比實(shí)際字符個(gè)數(shù)多1,以存放字符串結(jié)束標(biāo)志‘\0’。以下幾種賦初值是等效的。charch[5]={'m','a','n','y','\0'};charch[5]="many";charch[]="many";一般一維字符數(shù)組賦初值時(shí)常省略[]中表示數(shù)組大小的常量,編譯系統(tǒng)根據(jù)字符串的長(zhǎng)度自動(dòng)定義數(shù)組的大小。1/11/202429二維字符型數(shù)組賦初值時(shí),可以使用以下幾種相同的賦值形式:chars[3][4]={{'a','b','c','\0'},{'d','e','f','\0'},{'g','h','i','\0'}};chars[3][4]={"abc","def","ghi"};chars[][4]={"abc","def","ghi");1/11/202430【例2-1】數(shù)組舉例代碼例子如下。#include"stdafx.h"#include<iostream.h>intmain(array<System::String^>^args){ inta[]={1,2,3,4,5};for(inti=0;i<5;i++){Console::WriteLine("a[{0}]={1}",i,a[i]);}

Console::Read();}1/11/202431程序運(yùn)行結(jié)果如圖2-1所示。圖2-1例2-1運(yùn)行結(jié)果1/11/202432結(jié)構(gòu)結(jié)構(gòu)使用戶能夠定義一個(gè)新的數(shù)據(jù)類型,這種類型在邏輯上把幾個(gè)域或成員組合在一起。也就是說,它是由不同類型的數(shù)據(jù)組合而成的一個(gè)有機(jī)的整體。結(jié)構(gòu)變量是由名字相同的引用變量構(gòu)成的集合,集合中的每一個(gè)元素都稱為數(shù)據(jù)成員,每個(gè)元素使用名字來引用。結(jié)構(gòu)變量提供了將相關(guān)的數(shù)據(jù)聚集在一起的方法,使程序可以方便地處理復(fù)雜數(shù)據(jù)。結(jié)構(gòu)變量在使用前,必須先進(jìn)行說明。這種說明用來定義結(jié)構(gòu)變量,其一般形式為:Struct結(jié)構(gòu)名{數(shù)據(jù)成員說明列表};1/11/202433struct是結(jié)構(gòu)說明的關(guān)鍵字,“結(jié)構(gòu)名〞是一個(gè)有效的C++標(biāo)識(shí)符,“數(shù)據(jù)成員說明列表〞是由變量說明語句構(gòu)成的一個(gè)語句序列,但不能在該列表中對(duì)變量進(jìn)行初始化。下面的例子描述了某點(diǎn)坐標(biāo)的結(jié)構(gòu):stuctpoint{doubledouble};結(jié)構(gòu)說明只給出了構(gòu)成相同的一類變量的描述,僅對(duì)編譯器有意義。結(jié)構(gòu)說明為編譯器建立一個(gè)樣板,使編譯器可以知道如何為該結(jié)構(gòu)的變量分配內(nèi)存。還可以用沒有名稱的結(jié)構(gòu)來聲明變量,這稱為無標(biāo)記結(jié)構(gòu),例如:stuct{doubledouble}s1,s2,s31/11/202434C++允許在聲明結(jié)構(gòu)變量的同時(shí)進(jìn)行初始化,例如:points1={1,2,3,0}使用結(jié)構(gòu)時(shí),必須先把“結(jié)構(gòu)名〞作為類型名在程序中說明變量,下面的例子聲明了兩個(gè)結(jié)構(gòu)變量:pointstart,end;對(duì)結(jié)構(gòu)的數(shù)據(jù)成員進(jìn)行處理時(shí),必須用成員運(yùn)算符“.〞來引用一個(gè)結(jié)構(gòu)變量中的某個(gè)數(shù)據(jù)成員,其一般形式為:變量名.?dāng)?shù)據(jù)成員名對(duì)結(jié)構(gòu)變量中的數(shù)據(jù)成員進(jìn)行初始化賦值和處理都可以采用這種方式,下面是計(jì)算兩點(diǎn)之間距離的示范代碼:floatdistance;start.x=100;start.y=l00;end.x=0;end.y=0;,2));通過這樣的定義和使用可以看出,結(jié)構(gòu)的用法和其他變量沒有太大區(qū)別。同時(shí),結(jié)構(gòu)還可以聲明為數(shù)組,或通過聲明結(jié)構(gòu)指針方便地進(jìn)行訪問。1/11/202435枚舉和聯(lián)合1.枚舉枚舉數(shù)據(jù)類型就是將變量的值都列出來的一種數(shù)據(jù)類型。它所定義的變量的值只能是列出值之一。C++用關(guān)鍵字enum來定義枚舉類型,其語法如下:Enum枚舉類型名{<枚舉標(biāo)識(shí)符表>};例如:enumweek{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};通過上面這個(gè)定義以后,C++編譯器按定義時(shí)的順序給枚舉類型的每個(gè)標(biāo)識(shí)符分配一個(gè)整數(shù)值,Sunday=O,Monday=l,Tuesday=2,…。注意,每個(gè)標(biāo)識(shí)符必須唯一,而它們的值可以不唯一。例如:enumCPU{i286=2,i386DX=3,i386SX=3,i486DX=4,i486SX=4,i586=5);還可以對(duì)每個(gè)標(biāo)識(shí)符顯式地賦值和間斷地賦值,例如:enumcolor{red=1,yellow,blue=5,green=7,black,white};其中,因?yàn)閞ed=1,那么計(jì)算機(jī)就自動(dòng)給ydlow賦值為2。1/11/2024362.聯(lián)合聯(lián)合是一種特殊的結(jié)構(gòu),它的各個(gè)成員共享一個(gè)存儲(chǔ)區(qū)。聯(lián)合的長(zhǎng)度等于它的最大成員的長(zhǎng)度。c++用union來定義聯(lián)合,其語法如下:union聯(lián)合名{成員列表};例如:unionmark{charname;intpage;}聯(lián)合提供了快速數(shù)據(jù)轉(zhuǎn)換的方法,使用聯(lián)合可使幾個(gè)變量共用一個(gè)存儲(chǔ)區(qū),這樣可以節(jié)省系統(tǒng)的開銷。枚舉和聯(lián)合對(duì)其數(shù)據(jù)成員的訪問也都是使用操作符"."來進(jìn)行的。1/11/202437指針計(jì)算機(jī)中的信息,如程序和數(shù)據(jù)等,都是存放在內(nèi)存中的一定存儲(chǔ)單元中的。這個(gè)存儲(chǔ)單元實(shí)際上就是存儲(chǔ)器中的一個(gè)地址,地址中的內(nèi)容就是存儲(chǔ)的數(shù)據(jù)或其他信息。在使用C++語言編程的時(shí)候,不必關(guān)心變量存放的具體地址,這些是由編譯器去管理的。實(shí)際上,程序中的每一個(gè)變量都是內(nèi)存地址的標(biāo)識(shí)符,使用這些標(biāo)識(shí)符管理數(shù)據(jù)比用實(shí)際地址管理數(shù)據(jù)要容易的多。但是,在系統(tǒng)程序設(shè)計(jì)時(shí),通常要頻繁地使用實(shí)際地址來工作,這就需要數(shù)據(jù)的地址以設(shè)置和訪問其中的值,此時(shí)就可以使用指針。指針是c++語言中一種強(qiáng)大而有力的工具。在大多數(shù)情況下,指針變量是一種存放內(nèi)存地址的變量,而該地址是內(nèi)存中另一個(gè)變量的首地址。但是在使用時(shí),一定要格外小心,因?yàn)榧僭O(shè)使用不當(dāng),可能造成系統(tǒng)異常。1/11/202438如果一個(gè)變量包含的是另一個(gè)變量的地址,可以稱第一個(gè)變量指向第二變量。如果一個(gè)變量要存放另一個(gè)變量的地址,這個(gè)變量必須聲明為指針類型的變量。說明指針變量的一般形式為:類型*指針名:或類型*指針名=&變量;符號(hào)“*’’在說明語句中是個(gè)指針類型的說明符,&加在變量的前面表示取這個(gè)變量的地址,例如:int*pointer;char*Str;float*px=&x;其中pointer是指向整型變量的指針;str是指向字符變量的指針;px是指向float變量x的指針。指針變量可以和非指針變量一起聲明,例如:int*pointer,not_pointer;1/11/202439在這里,*pointer是指針變量,not_pointer是非指針變量,而不要誤以為所定義的都是指針變量。在使用指針時(shí),必須對(duì)它進(jìn)行初始化,就像初始化普通變量一樣,否那么,可能產(chǎn)生不可預(yù)測(cè)的錯(cuò)誤。一旦聲明了指針變量后,就可以使用“∥加指針名來訪問變量的值。例如,px是指向變量x的指針,可用*px訪問變量x的值。關(guān)于指針的運(yùn)算符有3種:取數(shù)值運(yùn)算符*、取地址運(yùn)算符&和下標(biāo)運(yùn)算符[]。下標(biāo)運(yùn)算符已經(jīng)在數(shù)組中用過,下面只介紹取數(shù)值運(yùn)算符*和去抵抗運(yùn)算符&。數(shù)據(jù)運(yùn)算符*表示取變量中的內(nèi)容,取抵抗運(yùn)算符表示取變量所在的地址。下面是一些指針運(yùn)算符的例子:1/11/202440【例2-2】指針的使用代碼例子如下。intmain(array<System::String^>^args){intnum=10;//聲明一個(gè)整型變量numint*pointer=#//聲明一個(gè)指針變量并把num所在的地址賦給pointerConsole::WriteLine(num);//輸出num的值Console::WriteLine(*pointer);//輸出*pointer的值Console::Read();}1/11/202441程序運(yùn)行結(jié)果如圖2-2所示。圖2-2例2-2運(yùn)行結(jié)果1/11/202442由此可見,*pointer代表了num的內(nèi)容。指針變量與其他變量一樣,可進(jìn)行運(yùn)算,并可用new與delete在程序中進(jìn)行動(dòng)態(tài)分配。它可以指向變量,也可以指向數(shù)組或數(shù)組元素。C++規(guī)定數(shù)組名為數(shù)組的首地址,根據(jù)指針的概念,可以把數(shù)組名賦給一個(gè)指針變量,這就是一個(gè)指向數(shù)組的指針。C++允許使用指針訪問數(shù)組中的不同元素,在訪問數(shù)組x的元素x[i]時(shí),編譯后的代碼執(zhí)行兩個(gè)步驟,先獲得數(shù)組x的基地址,即第一個(gè)元素的所在的位置,再計(jì)算下標(biāo)i相對(duì)于數(shù)組基地址的偏移量,從而得到元素X[i]的地址,例如:intx[6];int*px;px=&x[0];//等價(jià)于px=x;px為指向X[]數(shù)組的指針,表示第一個(gè)數(shù)組元素的地址。根據(jù)規(guī)那么,x[i]=s(px+i)或者(x+i)px[i]。1/11/202443VisualC++支持指向結(jié)構(gòu)的指針的聲明和使用。指針變量存儲(chǔ)結(jié)構(gòu)變量的地址。一旦指針擁有結(jié)構(gòu)變量的地址,就可以用操作符“->〞來訪問結(jié)構(gòu)的成員,例如:structpoint{doublex;doubley;};pointstad;pointend=&start;end->x=30;end->y=end->x+14;1/11/202444類型定義C++提供關(guān)鍵字typedef來給已存在的數(shù)據(jù)類型命名一個(gè)新的名稱,作為它的別名,其語法如下:typedef類型名新類型名;例如:typedefintinteger;typeedfunsingnedword;typedefdoublevector[10];由于vector為數(shù)組名,而int為數(shù)據(jù)類型,因此typedef’將vector定義為數(shù)組類型名,亦即vectora等價(jià)于inta[10]。關(guān)鍵字typedef為一個(gè)已經(jīng)存在的數(shù)據(jù)類型取一個(gè)別名,以便更好的說明該數(shù)據(jù)類型的用途。讀者可以取一個(gè)名字更短或者更熟悉和便于理解的名字,在程序編寫和閱讀時(shí)能提高效率。經(jīng)過類型定義后,新的類型名就可以在程序中使用了。例如,經(jīng)過上面的類型定義,就可以使用下面的語句來定義整型變量了,C++編譯器將數(shù)據(jù)類型integer識(shí)別為int數(shù)據(jù)類型。Integerx,y;1/11/202445運(yùn)算符和表達(dá)式C++中提供了豐富的運(yùn)算符。這些運(yùn)算符的應(yīng)用范圍很廣,幾乎所有的根本操作都可以用運(yùn)算符來處理。運(yùn)算符包括算術(shù)運(yùn)算符,位操作運(yùn)算符,賦值運(yùn)算符,關(guān)系和等值運(yùn)算符,邏輯運(yùn)算符,條件運(yùn)算符,逗號(hào)運(yùn)算符,求字節(jié)運(yùn)算符,指針運(yùn)算符,強(qiáng)制類型轉(zhuǎn)換運(yùn)算符等。有些運(yùn)算符需要兩個(gè)操作數(shù),這樣的運(yùn)算符稱為二元運(yùn)算符(也稱為雙目運(yùn)算符),另一些運(yùn)算符只需要一個(gè)操作數(shù),稱為一元運(yùn)算符(也稱為單目運(yùn)算符)。C++中惟一的一個(gè)三元運(yùn)算符是條件運(yùn)算符“?〞,它能實(shí)現(xiàn)簡(jiǎn)單的選擇功能。運(yùn)算符還具有較多的優(yōu)先級(jí),還有結(jié)合性等。程序中大局部的語句是由表達(dá)式構(gòu)成的,其作用是計(jì)算求值。表達(dá)式是由運(yùn)算符、常量、變量及函數(shù)組成的。C++的表達(dá)式既可以單獨(dú)作為語句,也可以在其他語句中作為測(cè)試的條件以及調(diào)用函數(shù)的參數(shù)使用1/11/2024461.算術(shù)運(yùn)算符我們知道,編譯器是根據(jù)操作符的類型執(zhí)行各種類型的操作,如果兩個(gè)操作數(shù)都是整型表達(dá)式,編譯器就產(chǎn)生整數(shù)操作的代碼;如果操作數(shù)有一個(gè)或兩個(gè)是浮點(diǎn)表達(dá)式,編譯器產(chǎn)生浮點(diǎn)操作的代碼。表5-3列出了C++的算術(shù)運(yùn)算符。表5-3算術(shù)運(yùn)算符運(yùn)算符功能數(shù)據(jù)類型實(shí)例+單目加數(shù)值A(chǔ)=+B-單目減數(shù)值A(chǔ)=-B+加數(shù)值C=A+B-減數(shù)值C=A-B*乘數(shù)值C=A*B/除數(shù)值C=A/B%模數(shù)值C=A%B1/11/202447下面是一些使用算術(shù)運(yùn)算符的合法表達(dá)式:x=3*y;y=10-3;256/128;-s+5;3*d/4;(((6*x-2)*y-3)*x)+8;(1+x)/(2*x);算術(shù)表達(dá)式是一個(gè)語句中的一局部,代表的是一個(gè)數(shù)值,一般可以分為3類:直接常量是最簡(jiǎn)單的算術(shù)表達(dá)式,這種只包含單一變量或常量的表達(dá)式是第一類算術(shù)表達(dá)式。例如:I;34;Month;1/11/202448第二類算術(shù)表達(dá)式包含操作數(shù)和一個(gè)運(yùn)算符,操作數(shù)可以是變量也可以是常量,例如:4*x;123/213;PI+3.14;更復(fù)雜的算術(shù)表達(dá)式包括多個(gè)運(yùn)算符甚至函數(shù),例如:log(var)*56;(3+y)*(8*x)-4*y;【例2-3】算術(shù)運(yùn)算符和增量、減量運(yùn)算符的使用。代碼例子如下。intmain(array<System::String^>^args){inta,b;a=10,b=20;Console::WriteLine(a);Console::WriteLine(b);Console::WriteLine(a+b);Console::WriteLine(++a);Console::WriteLine(a--);Console::Read();}1/11/202449程序運(yùn)行結(jié)果如圖2-3所示。圖2-3例2-3運(yùn)行結(jié)果1/11/2024502.賦值操作符賦值的作用是將某個(gè)值賦予一個(gè)變量,或者說該變量保存這個(gè)值。通常把“=〞稱為賦值號(hào),也叫賦值運(yùn)算符。它是一個(gè)二元運(yùn)算符,需要連接兩個(gè)運(yùn)算量。其一般形式如下:變量=表達(dá)式;其中,表達(dá)式的值被賦給了變量。例如:inta,b;a=15;b=15-12;這段代碼將15賦給變量a'將15—12的結(jié)果3賦給變量b。c++允許在一條語句中使用多重賦值操作給多個(gè)變量賦一個(gè)值,如:a=b=c=123;C++還支持其他類型的操作符,如表2-4所示。1/11/202451表2-4算術(shù)賦值操作符賦值操作符等價(jià)的形式實(shí)例x+=yx=x+yx+=5x-=yx=x-yx-=10-ax*=yx=x*yx*=12x/=yx=x/yx/=5*ax%=yx=x%yx%=O.41/11/2024523.增量和減量運(yùn)算符增量(++)和減量(--)運(yùn)算符是將變量中的值分別加1和減1,一般語法為:變量++//使用該變量后其值加1++變量//使用該變量前其值加1變量--//使用該變量后其值減1--變量//使用該變量前其值減1例如:num++;+=num;num—;--num;當(dāng)操作符放在操作數(shù)的左邊,那么操作數(shù)的值在其被傳送給表達(dá)式之前增加或減少l;當(dāng)操作符放在操作數(shù)的右邊,那么操作數(shù)的值在其被傳送給表達(dá)式之后增加或減少1。1/11/202453代碼如下:inta=b=4,d;d=a++;//d=4,a=5d=--b;//d=3,b=3d=2*--a;//d=8,a=4d=2*b++;//d=6,b=44.sizeof操作符編程時(shí),經(jīng)常需要知道一種數(shù)據(jù)類型或一個(gè)變量的字節(jié)數(shù),為此C++提供了sizeof操作符。sizeof操作符要帶一個(gè)參數(shù),該參數(shù)可以是一個(gè)數(shù)據(jù)類型,也可以是一個(gè)變量名。其語法如下:sizeof({變量名/數(shù)據(jù)類型))sizeof{變量名/數(shù)據(jù)類型)5.關(guān)系和邏輯運(yùn)算符關(guān)系運(yùn)算符指的是一個(gè)值與另一個(gè)值之間的關(guān)系,邏輯運(yùn)算符指的是連接關(guān)系的方式。vC++中定義的關(guān)系和邏輯運(yùn)算符如表2-5所列。1/11/202454表2-5關(guān)系和邏輯操作符操作符功能實(shí)例&&邏輯與if(i>1&&i<6)||邏輯或if(i==1||i==6)!邏輯非if(!(i>1&&i<6))<小于if(i<1)>大于if(i>1)<=小于等于if(i<=1)>=大于等于if(i>=1)==等于if(i==1)!=不等于if(i!=1)1/11/202455關(guān)系和邏輯運(yùn)算符的優(yōu)先級(jí)比算術(shù)運(yùn)算符的低。例如,6>4+3等價(jià)于6>(4+3),其結(jié)果為假。c++不支持預(yù)先定義的布爾標(biāo)識(shí)符,而是把0當(dāng)作假,把非0當(dāng)作真。在VC中可以用系統(tǒng)預(yù)定義的布爾標(biāo)識(shí)符TRUE和FALSE分別代表1和0。【例2-4】關(guān)系運(yùn)算符的使用。代碼例子如下。intmain(array<System::String^>^args){inta,b;a=10,b=20;Console::WriteLine(a>b);Console::WriteLine(b>a);Console::WriteLine(a==b);Console::Read();}程序運(yùn)行結(jié)果如圖2-4所示。1/11/202456【例2-5】邏輯運(yùn)算符使用。代碼例子如下。#include<iostream.h>intmain(array<System::String^>^args){inta,b,c;a=3,b=5;c=a>1&&a<10;Console::WriteLine(c);c=a>0||b>0;Console::WriteLine(c);Console::WriteLine(!a);Console::Read();}1/11/2024571/11/2024586.位處理運(yùn)算符位處理操作符用來對(duì)一個(gè)字節(jié)或字的位進(jìn)行開關(guān)、設(shè)置、查詢和移位,具體如表2—6所列。表5-6位處理運(yùn)算符位處理操作符功能實(shí)例&逐位與i&12|逐位或i|58^逐位異或i^13~逐位非~i<<逐位左移i<<2>>逐位右移i>>31/11/202459【例2-6】位及賦值運(yùn)算符的使用。代碼例子如下。#include<iostream.h>intmain(array<System::String^>^args){inta=36,b=54;unsignedintx=0xF0,y=0x7F;Console::WriteLine(a|b);Console::WriteLine(a^b);Console::WriteLine(x<<2);Console::WriteLine(y>>2);Console::Read();}1/11/2024602.3程序流程控制語句是C++語言中最小的可執(zhí)行單位,程序流程的控制是通過控制語句來完成的,主要的流程有分支和循環(huán)。c++的流程控制語句決定程序執(zhí)行時(shí)的結(jié)構(gòu)。這些流程控制語句主要包括:表達(dá)式語句、選擇語句、循環(huán)語句和輔助流程控制的轉(zhuǎn)移語句。1/11/202461表達(dá)式語句和塊語句大多數(shù)的C++語句是表達(dá)式語句。一個(gè)簡(jiǎn)單的表達(dá)式語句由表達(dá)式后加上分號(hào)組成。例如:a=b+c塊語句是以{開始,以}結(jié)尾的語句。在{和}之間封裝著一系列的語句。這些語句可以是C++中的任何一種句子。塊語句在語法上等價(jià)于一個(gè)單語句,可以用于任何單語句允許使用的地方。它與單句的主要區(qū)別在于其后不加分號(hào)。下面是一個(gè)塊語句的例子:{intsl=22,s2=23,sum;sum=s1+S2;}1/11/202462【例2-7】分析以下程序結(jié)果。代碼例子如下。intmain(array<System::String^>^args){inta=3;intb=4;Console::Write(a);Console::Write(b);Console::Write("\n");{inta=10;Console::Write(a);Console::Write(b);}Console::Read();}1/11/202463程序運(yùn)行結(jié)果如圖2-7所示。以上程序中{inta=10;Console::Write(a);Console::Write(b);}是一個(gè)復(fù)合語句。復(fù)合語句內(nèi)可以有自己的變量。當(dāng)復(fù)合語句的變量與復(fù)合語句外的變量同名時(shí),在復(fù)合語句內(nèi)復(fù)合語句定義的變量有效,出了復(fù)合語句后,復(fù)合語句內(nèi)定義的變量不起作用。1/11/202464選擇語句C++中提供了if選擇語句,用于在條件滿足時(shí)決定執(zhí)行某些操作。if語句包括以下兩種形式:1.if語句這是一個(gè)單項(xiàng)選擇擇的條件判別語句,其語法為:if(條件表達(dá)式)塊語句;如果if后面的條件表達(dá)式的邏輯值為真,那么執(zhí)行后面的塊語句,否那么不執(zhí)行,例如:if(i>0)i=j;注意:如果需要處理的塊語句只有一條語句的話,那么可以不加大括號(hào)。1/11/202465【例2-8】輸入一個(gè)數(shù),假設(shè)為正數(shù)那么原樣輸出,假設(shè)為負(fù)數(shù),求平方后輸出代碼例子如下。#include<iostream.h>intmain(array<System::String^>^args){inta,c;a=6;if(a<0)c=a*a;Console::Write(c);Console::Read();}此程序中,當(dāng)a<O時(shí)執(zhí)行c=a*a后輸出c的值:當(dāng)a>10時(shí)不執(zhí)行c=a*a;而直接執(zhí)行后邊的輸出操作。1/11/2024662.if~else語句這是一個(gè)雙選擇的條件判別語句,其語法為:if(條件表達(dá)式)塊語句1;else塊語句2:如果if后面的條件表達(dá)式的邏輯值為真,那么執(zhí)行塊語句1,否那么執(zhí)行塊語句2,例if(i>0){i=j;j++;}elsei=0;1/11/202467C++還允許用條件判別語句的嵌套來產(chǎn)生一個(gè)多項(xiàng)選擇擇的判別語句,其語法是:if(條件表達(dá)式1)塊語句1;elseif(條件表達(dá)式2)塊語句2;elseif(條件表達(dá)式3)塊語句3;elseif(條件表達(dá)式n)塊語句n;else塊語句n+1;測(cè)試每一個(gè)條件表達(dá)式,哪一個(gè)的邏輯值為真,輯值都為假,那么執(zhí)行最后一個(gè)else下的塊語句。1/11/202468【例2-9】輸入一個(gè)年份,判斷是否是閏年。閏年的年份可以被4整除而不能被100整除,或者能被400整除。因此,首先輸入年份存放到變量year中,如果表達(dá)式(year%4==0&&year%100!=0)||(year%400==0)的值為true,那么為閏年;否那么就不是閏年。代碼例子如下。#include"stdafx.h"usingnamespaceSystem::Collections::Generic;usingnamespaceSystem::Text;usingnamespaceSystem;intmain(array<System::String^>^args){intyear;year=2005;boolIsLeapYear;Console::Write("Entertheyear:");Console::WriteLine(year);1/11/202469IsLeapYear=((year%4==0&&year%100!=0)||(year%400==0)); if(IsLeapYear){Console::Write(year);//Console::Write(""); Console::Write("isaleapyear"); }else{Console::Write(year); Console::Write("isnotaleapyear");}Console::Read();}程序運(yùn)行結(jié)果如圖2-8所示。1/11/202470【例2-10】判斷字符的種類。代碼例子如下。#include"stdafx.h"usingnamespaceSystem::Collections::Generic;usingnamespaceSystem::Text;usingnamespaceSystem;intmain(array<System::String^>^args){charch;ch='a';

if(ch>='0'&&ch<='9')Console::WriteLine("Thisisdigitalcharacter");elseif(ch>='A'&&ch<='Z')Console::WriteLine("Thisiscapitalletter");elseif(ch>='a'&&ch<='z')1/11/202471Console::WriteLine("Thisislowerletter");else Console::WriteLine("Thisisothercharacter");Console::Read();}程序運(yùn)行結(jié)果如圖2-9所示。1/11/202472分支語句switch語句可以根據(jù)當(dāng)前的條件進(jìn)行分支處理。Switch語句的一般形式是:switch(表達(dá)式){case常量l:語句列表break;case常量2:語句列表break;default:語句列表break;}1/11/202473就執(zhí)行哪一條塊語句,假設(shè)所有的邏它將一個(gè)表達(dá)式的值與某些常量進(jìn)其中語句列表稱為switch語句的子語句。在switch語句中,表達(dá)式的值類型和常量的類型必須一致。當(dāng)表達(dá)式的值與case中指定的常量相等時(shí),執(zhí)行相應(yīng)于該case后的語句,直到遇到break語句或到達(dá)switch語句末尾。如果出現(xiàn)相等匹配失敗的情況,那么執(zhí)行default后的語句。無default時(shí),如果所有匹配都失敗,程序直接執(zhí)行switch語句之后的語句?!纠?-11】從鍵盤輸入不同的字母,顯示不同的國家名稱。代碼例子如下。#include"stdafx.h"usingnamespaceSystem::Collections::Generic;usingnamespaceSystem::Text;usingnamespaceSystem;1/11/202474intmain(array<System::String^>^args){charch;ch='a';switch(ch){case'a':Console::WriteLine("America");case'b':Console::WriteLine("Britain");case'c':Console::WriteLine("China");case'd':Console::WriteLine("Demark");

1/11/202475default:Console::WriteLine("Russian");}//Console::WriteLine(i);Console::Read();}程序運(yùn)行結(jié)果如圖2-10所示。1/11/202476程序運(yùn)行時(shí),如果從鍵盤輸入字母a,屏幕順序顯示五個(gè)國家名稱;如果輸入字母b,屏幕順序顯示四個(gè)國家的名稱;如果輸入字母“d〞,屏幕順序顯示兩個(gè)國家的名稱;如果入其他字符,屏幕僅顯示“Russian〞。一般情況下,每個(gè)switch語句中的語句序列都以break結(jié)束,而最后一個(gè)語句可省略break語句,因?yàn)閟witch語句的右花括號(hào)也有退出switch語句的功能。1/11/202477循環(huán)語句循環(huán)語句在給定條件成立的情況下,重復(fù)執(zhí)行某個(gè)程序段,重復(fù)執(zhí)行的程序段稱為循環(huán)體,循環(huán)體可以是單語句或塊語句。C++中的循環(huán)語句包括while語句、do—while語句和for語句。1.while語句while語句的語法定義如下:while(條件表達(dá)式){語句列表;}while語句首先計(jì)算表達(dá)式的值,在其值為真時(shí),執(zhí)行循環(huán)體中的語句,而在其值為假時(shí),終止循環(huán)的執(zhí)行,程序接著執(zhí)行循環(huán)體后的語句。1/11/202478【例2-12】將計(jì)算并顯示1~9的平方值。代碼例子如下。intmain(array<System::String^>^args){ inti=0; ints=0;while(i<10){s=i*i;++i;Console::WriteLine(s);} Console::Read();}1/11/2024792.do~while語句Do~while語句的語法定義如下:do{語句列表;}while(條件表達(dá)式);do~while語句和while語句類似,只是對(duì)循環(huán)條件的檢查是在循環(huán)的尾部進(jìn)行。do~while語句先執(zhí)行循環(huán)體中的語句,然后對(duì)表達(dá)式求值,在表達(dá)式為真的情況下重復(fù)執(zhí)行循環(huán)體中的語句?!纠?-13】用do~while循環(huán)編程求1+2+3+…+50之和。代碼例子如下。intmain(array<System::String^>^args){ inti=0; ints=0;do{s+=i;i++;}while(i<=50);Console::WriteLine(s); Console::Read();}1/11/2024803.for語句for循環(huán)語句的語法定義如下:for(el;e2;e3)圓括號(hào)內(nèi)由分號(hào)隔成3個(gè)局部,每局部是一個(gè)表達(dá)式。其中e2用于控制循環(huán)執(zhí)行,當(dāng)e2為真時(shí),不斷重復(fù)執(zhí)行循環(huán)體,而在e2為假時(shí),終止循環(huán)語句的執(zhí)行,程序轉(zhuǎn)去執(zhí)行該語句之后的語句。for循環(huán)的3個(gè)局部之間無形式上的關(guān)系。但在使用中,e1常用于設(shè)置進(jìn)入循環(huán)時(shí)的初始狀態(tài),e3常用于改變某些變量的值,以使e2的值最終為假,使for循環(huán)終止。在for循環(huán)的圓括號(hào)內(nèi)可以進(jìn)行變量說明,例如:for(inti=0;i<100;i++)cout<<i;實(shí)際使用中for循環(huán)中的表達(dá)式el,e2,e3可以全部或局部省略。同時(shí),for語句還支持嵌套循環(huán)。1/11/202481【例2-14】用for語句編程求1+2+3+……+10之和。代碼例子如下。intmain(array<System::String^>^args){ inti=0; ints=0;for(i=1;i<=10;i++) s+=i;Console::WriteLine(s); Console::Read();}1/11/202482跳轉(zhuǎn)語句C++語言中時(shí)常需要對(duì)程序的流程進(jìn)行控制轉(zhuǎn)移,轉(zhuǎn)移語句的存在滿足了程序員在這方面的需要。轉(zhuǎn)移語句包括break語句、continue語句和goto語句。1.break語句break可以用于switch語句中,還可以用于循環(huán)語句的循環(huán)體中,以終止、跳出循環(huán)體。break作用于循環(huán)體中的例子如下。intmain(){inti;for(i=10;i<100;i++){Console::WriteLine(i);break;}Console::Read();}1/11/202483執(zhí)行此程序代碼以后,可看到此循環(huán)體只執(zhí)行了1次,break語句就終止了循環(huán)體,跳出執(zhí)行下面的語句。break語句的這種作用同樣適用于while與do~while語句。2.continue語句continue語句語法形式:continue;continue語句只用于循環(huán)語句中。當(dāng)在循環(huán)體內(nèi)遇到continue語句時(shí),它中斷本次循環(huán)體的執(zhí)行,立即執(zhí)行下一次循環(huán)。continue語句和break語句的區(qū)別是:break語句是終止執(zhí)行循環(huán)語句,退出循環(huán);而continue語句是終止本次循環(huán),不再執(zhí)行循環(huán)體內(nèi)continue語句后面的語句,而繼續(xù)下一次循環(huán)?!纠?-15】把100以內(nèi)所有能被3整除的整數(shù)輸出。代碼例子如下。#include"stdafx.h"1/11/202484usingnamespaceSystem::Collections::Generic;usingnamespaceSystem::Text;usingnamespaceSystem;intmain(array<System::String^>^args){inti=1;while(i<=100) { if(i%3!=0){i++;continue; }Console::WriteLine(i);i++; }Console::Read();}1/11/202485當(dāng)i不能被3整除時(shí),i值增1,執(zhí)行continue語句,結(jié)束本次循環(huán)(即跳過continue后面的語句),提前進(jìn)入下一輪循環(huán);否那么,先打印i的值,再使i增1,繼續(xù)下一輪循環(huán)。1/11/2024863.goto語句goto語句語法形式為:goto標(biāo)號(hào);其中,標(biāo)號(hào)是指語句標(biāo)號(hào),它不是數(shù)字,而是和標(biāo)識(shí)符一樣并以冒號(hào)結(jié)尾。例如:bh:語句;其中,bh為一標(biāo)號(hào)。goto語句的作用是使程序的執(zhí)行流程跳轉(zhuǎn)到語句標(biāo)號(hào)所指定的語句。goto語句的使用會(huì)破壞程序的結(jié)構(gòu),在結(jié)構(gòu)化程序設(shè)計(jì)中不提倡使用。goto語句的使用只限制在一個(gè)函數(shù)體內(nèi)進(jìn)行轉(zhuǎn)向。這樣就保證了函數(shù)是結(jié)構(gòu)化的最小單元。在一個(gè)函數(shù)中,語句標(biāo)號(hào)是惟一的。1/11/202487【例2-16】求1到100之內(nèi)偶數(shù)之和。分析:求1~100內(nèi)所有偶數(shù)之和可以采用窮舉法,對(duì)3~100的數(shù)i進(jìn)行判斷,用(i%2)判斷是否為偶數(shù)。當(dāng)(i%2)為true時(shí),說明i是奇數(shù),當(dāng)(i%2)為false時(shí),說明i是偶數(shù)。代碼例子如下。#include"stdafx.h"usingnamespaceSystem::Collections::Generic;usingnamespaceSystem::Text;usingnamespaceSystem;intmain(array<System::String^>^args){intsum=2; inti;for(i=3;i<=100;){if(i%2)gotobh;sum=sum+i;1/11/202488bh:i++;}Console::Write(sum);Console::Read();}程序運(yùn)行結(jié)果如圖2-15所示。本例中,當(dāng)i是奇數(shù)時(shí),轉(zhuǎn)到bh語句,i增l后繼續(xù)判斷,當(dāng)i是偶數(shù)時(shí),根據(jù)if語句的功能,不執(zhí)行g(shù)ot0語句,執(zhí)行if語句的下一條語句,即s1蛐+=i求和,然后執(zhí)行i++得到下一個(gè)數(shù)繼續(xù)判斷。1/11/2024892.4函數(shù)函數(shù)是一個(gè)命名的代碼塊,是程序完成其操作的場(chǎng)所。一個(gè)函數(shù)是為完成一定的任務(wù)而設(shè)計(jì)的。描述一個(gè)函數(shù)所執(zhí)行的算法的過程被稱為函數(shù)定義,而使用一個(gè)函數(shù)的過程那么被稱為函數(shù)調(diào)用。函數(shù)調(diào)用完成后,一般情況下要向它的使用者返回一個(gè)值,這個(gè)值稱為函數(shù)的返回值。本節(jié)將介紹在C++程序中進(jìn)行函數(shù)定義和調(diào)用的方法。1/11/202490函數(shù)定義和調(diào)用1.函數(shù)的定義在程序中使用函數(shù)必須先做說明。函數(shù)說明分為定義性說明(簡(jiǎn)稱函數(shù)定義)和引用性說明(簡(jiǎn)稱函數(shù)說明)。定義性說明指定了一個(gè)函數(shù)名及其所代表的代碼(函數(shù)體)。引用性說明只說明了函數(shù)名而沒有指定函數(shù)體,主要用在程序的其他地方定義的函數(shù),通常是出現(xiàn)在函數(shù)的定義之前,或引用在其他模塊中定義的函數(shù)。下面是函數(shù)定義的一般形式:返回值類型函數(shù)名(聲明類型的參數(shù)表){函數(shù)體;}1/11/202491函數(shù)定義指定了一個(gè)函數(shù)名和函數(shù)的類型,函數(shù)名是一個(gè)有效的C++標(biāo)識(shí)符,函數(shù)的類型規(guī)定為該函數(shù)所返回值的類型。函數(shù)定義也指定了一個(gè)參數(shù)表,這是用逗號(hào)隔開的一個(gè)變量名說明表,這些量稱為函數(shù)的形參,用于接受調(diào)用參數(shù)時(shí)傳送給這個(gè)函數(shù)的數(shù)據(jù)。參數(shù)表可以為空,但其后的圓括號(hào)不能省略。花括號(hào)內(nèi)的函數(shù)體是一個(gè)語句序列,描述這個(gè)函數(shù)所要進(jìn)行的操作。函數(shù)的類型是表示返回值的類型,如果沒有設(shè)置返回值的類型,系統(tǒng)將自動(dòng)設(shè)置為整型返回值。函數(shù)的返回值是通過retrun語句獲得的,當(dāng)一個(gè)函數(shù)不返回任何值時(shí),應(yīng)將該函數(shù)的類型設(shè)為void型。1/11/2024922.函數(shù)的調(diào)用一個(gè)函數(shù)定義后,可以被其他函數(shù)調(diào)用。調(diào)用函數(shù)可以在主函數(shù)main()中,也可以在另一個(gè)函數(shù)與定義中。一個(gè)函數(shù)定義后可以被其他函數(shù)屢次調(diào)用。函數(shù)調(diào)用的一般形式為函數(shù)名〔實(shí)參列表〕;實(shí)參列表可以由0個(gè)、1個(gè)或多個(gè)實(shí)參組成并用“,〞號(hào)進(jìn)行分割,實(shí)參的個(gè)數(shù)和類型應(yīng)與函數(shù)定義時(shí)的形參一致。函數(shù)調(diào)用可以有多種形式:函數(shù)調(diào)用可以作為一個(gè)變量出現(xiàn)在表達(dá)式中,此時(shí)被調(diào)用函數(shù)必須有一個(gè)明確的返回值;函數(shù)調(diào)用也可以是一條語句,這時(shí)被調(diào)用函數(shù)可以沒有返回值。1/11/202493【例2-17】定義一個(gè)使用WriteLine方法顯示數(shù)組的函數(shù)并調(diào)用之。代碼例子如下。#include"stdafx.h"usingnamespaceSystem::Collections;usingnamespaceSystem;voidPrintIndexAndValues(array<String^>^myArr){for(inti=0;i<myArr->Length;i++){Console::WriteLine("myArr[{0}]:{1}",i,myArr[i]);}Console::WriteLine();}intmain(){array<String^>^myArray=1/11/202494array<String^>^myArray={"The","QUICK","BROWN","FOX","jumps","over","the","lazy","dog"};//DisplaysthevaluesoftheArray.Console::WriteLine("顯示數(shù)組元素:");PrintIndexAndValues(myArray);Console::Read();}運(yùn)行結(jié)果:1/11/202495局部變量和靜態(tài)變量1.函數(shù)的局部變量函數(shù)的局部變量?jī)H當(dāng)函數(shù)被調(diào)用時(shí)才存在,一旦函數(shù)被終止,系統(tǒng)就把局部變量刪除。因此,當(dāng)下一次調(diào)用該函數(shù)時(shí),不能保存上一次的局部變量的值。函數(shù)每次調(diào)用時(shí),系統(tǒng)會(huì)對(duì)局部變量進(jìn)行初始化。例如doubledistance(doublex1,doubley1,doublex2,doubley2){doubledis=0;dis=dis+Math::Sqrt(Math::Pow(x1-x2,2)+Math::Pow(y1-y2,2));returndis;}注意,代碼中dis為局部變量。1/11/2024962.函數(shù)的靜態(tài)變量函數(shù)的靜態(tài)變量是在局部變量的數(shù)據(jù)類型前面加上static關(guān)鍵字。它與局部變量不同,它的初始化僅能執(zhí)行一次。當(dāng)函數(shù)終止時(shí)將靜態(tài)變量保存在獨(dú)立的內(nèi)存單元中,所以下一次調(diào)用該函數(shù)時(shí),靜態(tài)變量能保持它原來的值??梢栽诓煌暮瘮?shù)中使用相同的靜態(tài)變量名,這不會(huì)造成編譯器的混淆,因?yàn)榫幾g器一直跟蹤每個(gè)函數(shù)的靜態(tài)變量,代碼如下。doubledistance(doublex1,doubley1,doublex2,doubley2){staticdoubledis=0;dis=dis+Math::Sqrt(Math::Pow(x1-x2,2)+Math::Pow(y1-y2,2));returndis;}intmain(){1/11/202497doublei,j;i=distance(10,0,0,10);Console::WriteLine(i);j=distance(10,0,0,10);Console::WriteLine(j);Console::Read();}運(yùn)行結(jié)果如圖2-17所示。1/11/202498說明:這個(gè)例子和上一個(gè)例子一樣,只是把dis定義成靜態(tài)變量。如果以這個(gè)例子的形式進(jìn)行函數(shù)的第一次調(diào)用,與上一個(gè)例子結(jié)果是一樣的。此時(shí)兩個(gè)例子的返回結(jié)果一致,都為。但是如果以相同的形式進(jìn)行第二次調(diào)用,那么上一個(gè)例子的返回值為,而本例將返回28.2842712474619。這是因?yàn)樵诒纠?,dis將保存上一次調(diào)用時(shí)的值。由于dis為靜態(tài)變量,因此dis=0的賦值語句并不影響它以后值的變化,也就是說dis=0只在第一次調(diào)用函數(shù)時(shí)才真正執(zhí)行賦值語句的功能。1/11/202499內(nèi)聯(lián)函數(shù)當(dāng)程序調(diào)用內(nèi)聯(lián)函數(shù)時(shí),是將該函數(shù)展開并直接插入到調(diào)用處,而一般函數(shù)的調(diào)用是轉(zhuǎn)到該函數(shù)體中,執(zhí)行完函數(shù)后,退回到調(diào)用函數(shù)語句的下一句。所以,內(nèi)聯(lián)函數(shù)可以加快代碼的運(yùn)行速度,但是以增加程序的代碼為代價(jià)。內(nèi)聯(lián)函數(shù)定義的語法為:inline返回類型函數(shù)名(參數(shù)表){函數(shù)體;}需要注意的是,在使用內(nèi)聯(lián)函數(shù)時(shí),不能使用靜態(tài)變量、循環(huán)語句和switch語句1/11/20241002.4.4函數(shù)重載函數(shù)重載是C++語言特有的,C語言、PASCAL語言和BASIC語言等都沒有這個(gè)特性。這種特性允許聲明多個(gè)名稱相同、而參數(shù)表不同的函數(shù),函數(shù)的返回類型也可以不同,因?yàn)镃++允許忽略函數(shù)的結(jié)果類型。但如果函數(shù)的名稱和參數(shù)表都相同,僅僅返回類型不同,編譯器是不能區(qū)分的。使用函數(shù)的缺省參數(shù)可以減少重載函數(shù)的數(shù)量,不過不要使用重載函數(shù)實(shí)現(xiàn)功能差異太大的操作。1/11/2024101【例2-18】函數(shù)重載示范代碼如下:#include"stdafx.h"usingnamespaceSystem::Collections::Generic;usingnamespaceSystem::Text;usingnamespaceSystem;voidadd(int&i){i=i+1;}voidadd(char&c){c=c+2;}1/11/2024102intmain(array<System::String^>^args){intx=1;chary='A';//顯示初始值Console::WriteLine(x);Console::WriteLine(y);//調(diào)用函數(shù)add(x);add(y);//顯示執(zhí)行函數(shù)后韻值Console::WriteLine(x);Console::WriteLine(y);Console::Read();}程序運(yùn)行結(jié)果如圖2-18所示:1/11/2024103程序中定義了重載函數(shù)add的兩種形式:一種是int型的引用參數(shù),函數(shù)將參數(shù)的值加1;另一種是char型的引用參數(shù),函數(shù)將參數(shù)的值加2。因?yàn)閤是int型的變量,所以調(diào)用的是add(int&i)函數(shù),而y是char型的變量,所以調(diào)用的是add(char&c)函數(shù)。

溫馨提示

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

評(píng)論

0/150

提交評(píng)論