全國(guó)計(jì)算機(jī)二級(jí)考試C++教程課件1_第1頁
全國(guó)計(jì)算機(jī)二級(jí)考試C++教程課件1_第2頁
全國(guó)計(jì)算機(jī)二級(jí)考試C++教程課件1_第3頁
全國(guó)計(jì)算機(jī)二級(jí)考試C++教程課件1_第4頁
全國(guó)計(jì)算機(jī)二級(jí)考試C++教程課件1_第5頁
已閱讀5頁,還剩139頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+程序設(shè)計(jì)第一章 面向?qū)ο蟪绦蛟O(shè)計(jì)緒論 1.1 什么是面向?qū)ο蟪绦蛟O(shè)計(jì)1.2 對(duì)象和類 1.3 數(shù)據(jù)的抽象和封裝 1.4 繼承性 1.5 多態(tài)性1.6 面向?qū)ο蟪绦蛟O(shè)計(jì)語言 關(guān)于課程n目標(biāo)n進(jìn)一步學(xué)會(huì)面向過程編程n理解面向?qū)ο笏枷雗以對(duì)象的方式思考n熟悉C+ (P)n利用 C+編程n在本課程中:nC+ 是一個(gè)學(xué)習(xí)面向?qū)ο蟾拍畹墓ぞ遪運(yùn)用面向?qū)ο竽J竭M(jìn)行程序設(shè)計(jì)n采用面向?qū)ο蠓椒ǖ男Ч?(OOA/OOD)n可維護(hù)性n可擴(kuò)展性n可靠性如何實(shí)現(xiàn)課程目標(biāo)n閱讀和記憶n閱讀書籍, 記住語言特點(diǎn)n思考n以對(duì)象和類的方式思考n實(shí)踐n多編程參考課本nC+程序設(shè)計(jì)教程(錢能),清華大學(xué)出版社nC+程序設(shè)計(jì)教程

2、,H.M.Deitel,nP.J.Deitel著,機(jī)械工業(yè)出版社n C+大學(xué)教程(第二版),Harveay M. Deitel著,電子工業(yè)出版社 nC+ Primer(第三版),Stanley B.lippmannJosee Lajoie著,中國(guó)電力出版社nC+編程思想(Thinking in C+),Bruce Eckel著,機(jī)械工業(yè)出版社1 1 從從C C語言到語言到C+C+語言語言C語言以其如下獨(dú)有的特點(diǎn)風(fēng)靡了全世界:(1)語言簡(jiǎn)潔、緊湊,使用方便、靈活。C語言只有32個(gè)關(guān)鍵字,程序書寫形式自由。(2)豐富的運(yùn)算符和數(shù)據(jù)類型。(3)可以直接訪問內(nèi)存地址,能進(jìn)行位操作,使其能夠勝任開發(fā)操作

3、系統(tǒng)的工作。(4)生成的目標(biāo)代碼質(zhì)量高,程序運(yùn)行效率高。(5)可移植性好。n局限性:(1)數(shù)據(jù)類型檢查機(jī)制相對(duì)較弱,這使得程序中的一些錯(cuò)誤不能在編譯階段被發(fā)現(xiàn)。(2)C本身幾乎沒有支持代碼重用的語言結(jié)構(gòu),因此一個(gè)程序員精心設(shè)計(jì)的程序,很難為其它程序所用。(3)當(dāng)程序的規(guī)模達(dá)到一定程度時(shí),程序員很難控制程序的復(fù)雜性。發(fā)展n1980年,貝爾實(shí)驗(yàn)室的Bjarne Stroustrup開始對(duì)C進(jìn)行改進(jìn)和擴(kuò)充。n1983年正式命名為C+。n在經(jīng)歷了3次C+修訂后,1994年制定了ANSI C+ 標(biāo)準(zhǔn)的草案。以后又經(jīng)過不斷完善,成為目前的C+。nC+仍在不斷發(fā)展中。美國(guó)微軟公司現(xiàn)已推出C#(C Sharp

4、)語言,來代替C+語言。C+程序設(shè)計(jì)A Rich HistoryMS-DOSBASICWindowsVisual BASICIE, IISVisual Studio1995Internet1990GUI1981PC2002XMLWeb Services編譯器nVC+6.0n或其它(Turbor C 3.0,Borland C+)有關(guān)面向?qū)ο缶幊痰木W(wǎng)站www.soft- borlandcpp/ 編程簡(jiǎn)介內(nèi)容n方法學(xué)n編程技術(shù)n面向?qū)ο笳Z言1. 方法學(xué)思考問題的方法n歸納n從特殊到一般n從不同的 dogs 到詞匯 “dog”Dog思考問題的方法n演繹n從一般到特殊n從詞匯“dog”,你可以區(qū)別出一

5、個(gè)動(dòng)物是還是不是一條狗DOG面向?qū)ο髇它是一種思考方法n世界上的任何東西都是一個(gè)對(duì)象;n任何系統(tǒng)都是由對(duì)象構(gòu)成的 (當(dāng)然系統(tǒng)也是一個(gè)對(duì)象);n系統(tǒng)的演化和開發(fā)就是通過系統(tǒng)內(nèi)外的對(duì)象進(jìn)行交互完成的。世界上的任何東西都是一個(gè)對(duì)象n花, 樹, 動(dòng)物n學(xué)生, 教授n桌子, 椅子, 教室, 建筑n大學(xué), 城市, 國(guó)家n世界, 宇宙n學(xué)科,如計(jì)算機(jī),信息系統(tǒng),數(shù)學(xué),歷史 任何系統(tǒng)都是由對(duì)象構(gòu)成的n法律系統(tǒng)n文化系統(tǒng)n教育系統(tǒng)n經(jīng)濟(jì)系統(tǒng)n信息系統(tǒng)n計(jì)算機(jī)系統(tǒng)系統(tǒng)開發(fā)就是定義對(duì)象間的交互n揚(yáng)州大學(xué)是由下列對(duì)象的交互構(gòu)成的:n學(xué)生n教授n職員n江蘇省政府n中國(guó)政府n .揚(yáng)大內(nèi)部揚(yáng)大內(nèi)部揚(yáng)大外部揚(yáng)大外部設(shè)計(jì)方法學(xué)

6、n面向?qū)ο笫紫仁且环N設(shè)計(jì)方法學(xué)(OOA/OOD)n對(duì)象是程序的構(gòu)成模塊 (接口對(duì)象 (editor, menu, file, etc), 數(shù)據(jù)管理對(duì)象 (db), etc.).n對(duì)象代表了在應(yīng)用中對(duì)現(xiàn)實(shí)世界的抽象.設(shè)計(jì)方法學(xué)n面向?qū)ο笾С謓歸納: 對(duì)象 - 類n需要OOA/OOD工具.n演繹: 類-對(duì)象n編程者需要學(xué)習(xí)有關(guān)類庫的知識(shí)設(shè)計(jì)方法學(xué)n面向?qū)ο笾С謓Top-down: 從超類到子類nBottom-up: 從子類到超類n面向?qū)ο缶幊痰幕A(chǔ)*對(duì)象*封裝*繼承一般說來,對(duì)象是根據(jù)類來定義的。我們也可以用一個(gè)類來定義另一個(gè)類。例如,山地車、賽車和雙座自行車都是自行車的一種。用面向?qū)ο蟮男g(shù)語來說

7、,它都是自行車類的子類或派生類,而自行車類是它們的超類或父類或基類。它們的關(guān)系如下圖所示: 自行車每一個(gè)子類繼承了超類的數(shù)據(jù)和操作,但是,子類并不是局限于超類的數(shù)據(jù)和操作。例如,雙座自行車有兩個(gè)坐墊,山地車有一個(gè)額外的低速齒輪。繼承的主要益處是可以復(fù)用超類的程序代碼 *多態(tài)賽車三地車雙座自行車面向?qū)ο髇“世界是面向?qū)ο蟮摹眓-Alan Kay said.n如果你對(duì)世界了解,那么你就了解了面向?qū)ο?n所以,面向?qū)ο笫侨菀椎?2.編程n編程就像寫作.n如果你能夠描繪一樣?xùn)|西,你就可以寫一個(gè)程序.n所以,編程也是容易的.n所以,面向?qū)ο蟮木幊痰扔?容易 + 容易, 得到“ too(2) easy”.

8、編程編程n但是,實(shí)際上,編程并不那么容易。因?yàn)榫幰粋€(gè)真正的好的程序是不容易的。它需要編程者的智慧,知識(shí)和經(jīng)驗(yàn).n就象寫作一樣,要成為一個(gè)好的作家,就需要很多的經(jīng)驗(yàn)和對(duì)這個(gè)世界的大量知識(shí)。n學(xué)習(xí)和練習(xí)就必不可少。編程技術(shù)n非結(jié)構(gòu)化編程n過程編程n模塊化 & 結(jié)構(gòu)化編程n抽象數(shù)據(jù)類型n面向?qū)ο缶幊谭墙Y(jié)構(gòu)化編程n我們經(jīng)常將一個(gè)簡(jiǎn)單的程序?qū)懗梢粋€(gè)主程序. 此處,主程序代表了命令和聲明的一個(gè)序列,這個(gè)系列在整個(gè)程序中對(duì)全局?jǐn)?shù)據(jù)進(jìn)行修改. MainProgramData缺點(diǎn)n這種技術(shù)只能用于很小的程序中.n例如,如果相同的聲明序列在不同的地方要多次出現(xiàn)時(shí),我們就不得不拷貝這些序列。如果其中發(fā)生了一

9、個(gè)錯(cuò)誤,我們就需要對(duì)每一個(gè)拷貝進(jìn)行修改.n這就導(dǎo)致了我們將這些序列抽取出來,單獨(dú)命名,并通過調(diào)用和返回值的方法來實(shí)現(xiàn)多處復(fù)用的方法。過程編程 n在過程編程中,你可以將序列歸在一個(gè)地方n過程調(diào)用可以被用于調(diào)用過程。在調(diào)用完成后,控制流繼續(xù)往下。MainProgramProcedure過程n通過參數(shù)和子過程 (過程的過程) , 程序就可以寫得更有結(jié)構(gòu)并且可以減少錯(cuò)誤. n例如,如果過程是正確的,那么每一次使用它必然可以獲得正確的結(jié)果n因而,為了查找錯(cuò)誤,你就可以縮小查找的范圍. 模塊化編程n在模塊化編程中,具有公共功能的過程被集中在不同的模塊中n一個(gè)程序就不再是一個(gè)單一整體構(gòu)成的了,它被分解成多個(gè)

10、小的部分,這些小的部分之間通過調(diào)用相互交互,構(gòu)成了整個(gè)程序. MainProgram(Alsoamodule)DataDataData1Module2+DataData2Module1+DataData1Procedure1Procedure2主程序協(xié)調(diào)多個(gè)模塊之間的調(diào)用,并進(jìn)行數(shù)據(jù)的傳送Procedure3模塊化編程n每一個(gè)模塊都可以有自己的數(shù)據(jù)。這將允許每一個(gè)模塊來管理內(nèi)部狀態(tài),這些狀態(tài)可以在調(diào)用這些模塊中的過程時(shí)得到修改. n因此,每一個(gè)模塊都有一個(gè)狀態(tài),每一個(gè)模塊在整個(gè)程序中通常也最多存在一次結(jié)構(gòu)化編程n結(jié)構(gòu)化程序中的三種結(jié)構(gòu)u順序(s1,s2,sn)u分支(if-then-else)

11、u循環(huán)Loop(for,do, and while loops)程序中有多少結(jié)構(gòu)程序中有多少結(jié)構(gòu)?抽象數(shù)據(jù)類型(ADTs)n抽象n模型n抽象數(shù)據(jù)類型屬性抽象-問題處理手段n為了理解問題,需要將不必要的細(xì)節(jié)分離出去: n你將構(gòu)造你自己針對(duì)問題的抽象視圖,抽象模型n這個(gè)建模過程稱為抽象 abstraction.問題模型抽象模型n模型定義了一個(gè)抽象的視圖,該視圖只關(guān)注于與問題和求解者相關(guān)的部分。你需要定義下列屬性:n影響的數(shù)據(jù);n識(shí)別出來的操作; nADT 就是一種模型.InterfaceOperationsAbstractDataStructureAbstractDataTypeADT定義 (AD

12、T)nADT 有下列一些特性: n1. 它提供了一種類型. n2. 它提供了操作的集合. 該集合被稱為接口. n3. 接口的操作是類型數(shù)據(jù)結(jié)構(gòu)的唯一訪問途徑. n4. 原理和前提定義了類型的應(yīng)用領(lǐng)域. 例子: ADT Listn類型 List. n類型list實(shí)例的接口由接口定義文件定義n操作: insert, get, append, delete,search,面向?qū)ο蟮木幊蘮對(duì)象是由抽象數(shù)據(jù)類型來的n面向?qū)ο缶幊淌菍?duì)象交互的一個(gè)網(wǎng)絡(luò),每一個(gè)對(duì)象保存自己的狀態(tài)n程序中的對(duì)象通過發(fā)送消息進(jìn)行交互Object1Data1+Procedures1DataData1Object3Data3+Pro

13、cedures3Object2Data2+Procedures2Object4Data4+Procedures4面向?qū)ο缶幊蘮在面向?qū)ο缶幊讨?,我們直接發(fā)送一個(gè)消息,而不是去調(diào)用一個(gè)程序來實(shí)現(xiàn)一個(gè)功能. n粗略地說,每一個(gè)對(duì)象實(shí)現(xiàn)了自己的模塊面向?qū)ο缶幊蘮每一個(gè)對(duì)象負(fù)責(zé)正確地初始化和銷毀自身. n相應(yīng)地,對(duì)對(duì)象而言,我們就不需要顯式地創(chuàng)建和生成過程n模塊n信息隱藏n數(shù)據(jù)封裝n抽象數(shù)據(jù)類型n對(duì)象面向?qū)ο蟮难莼嫦驅(qū)ο蟮难莼涀封裝(Data & Operations)- 信息隱藏的技術(shù)對(duì)象的用戶不能看到對(duì)象的數(shù)據(jù)和操作的細(xì)節(jié).n數(shù)據(jù)抽象 - 從對(duì)象中發(fā)現(xiàn)類的過程n抽象數(shù)據(jù)類型- 類3.

14、編碼語言面向?qū)ο笳Z言n面向?qū)ο缶幊陶Z言就是能夠很方便地支持面向?qū)ο蟾拍畹恼Z言nSmalltalk:1972-1980.nC+:1980.nJava:1992 (Smalltalk + C+).n其它:nEffile, Objective-C, Ada, .SmalltalknSmalltalk 是一個(gè)純的面向?qū)ο笳Z言. n多數(shù)人認(rèn)為Smalltalk 程序比 C+ 程序開發(fā)起來更快.Smalltalkn豐富的類庫,通過繼承實(shí)現(xiàn)重用nSmalltalk 擁有動(dòng)態(tài)開發(fā)環(huán)境。它不是編譯的,但是 C+ 是編譯的. n這使得開發(fā)過程更可變,你可以方便地對(duì)類和各種情形進(jìn)行修改Smalltalk 編程者并不

15、能象在C+中那樣立即掌握o-o概念. 正因?yàn)槿绱?,掌握Smalltalk需要更多地時(shí)間. 但是多數(shù)時(shí)間是花在學(xué)習(xí)面向?qū)ο蠓椒▽W(xué)和技術(shù)上,而不是編程語言上的。實(shí)際上,Smalltalk 比C和C+更為簡(jiǎn)單. C+nC+ 是 C的面向?qū)ο蟀姹? 它與 C是一致的 (它實(shí)際上是C的超集), 所以現(xiàn)存的 C 代碼能夠包含在 C+ 程序中.n C+ 程序速度快,效率高. n這些特性已經(jīng)使C+成為很流行的語言. C+n它犧牲了一些靈活性以提高效率. nC+ 采用編譯時(shí)綁定的方法。這使得程序運(yùn)行時(shí)的效率很高,代碼也較小,但是它影響了重用類的某些能力. C+nC+ 已經(jīng)非常流行,絕大多數(shù)新的 C 編譯器實(shí)際上

16、是 C/C+ 編譯器. 但是,如果想進(jìn)行面向?qū)ο缶幊?,你必須用C+編程(思考),而不是C. n這些都將對(duì)有經(jīng)驗(yàn)的C編程者帶來挑戰(zhàn)。他們認(rèn)為他們是在運(yùn)用C+編程,但實(shí)際上只用了很少的面向?qū)ο筇攸c(diǎn)。C+nC+ 是一個(gè)優(yōu)秀的語言.n利用它, 你可以編出世界上最好的程序!nC+ 是一個(gè)差的語言.n使用它,你也可能編出世界上最差的程序n所以,在學(xué)習(xí)和使用它時(shí),注意它的OO特性和非OO特性。Javan它是一個(gè)可移植語言,它可以運(yùn)行在瀏覽器上。因此,它在Internet和Intranet上發(fā)揮出了極大的作用。JavanJava是 C+ 和Smalltalk古怪的混合. n它具有 C+的語法, 使它容易學(xué)習(xí)(

17、也許是難以學(xué)習(xí),這依賴于學(xué)習(xí)者的經(jīng)驗(yàn)). n它具有Smalltalk的結(jié)構(gòu), 如虛擬機(jī)和字節(jié)碼.Java(續(xù))nC+的改進(jìn): n取消指針n垃圾回收n運(yùn)行在類似于 Smalltalk-風(fēng)格的虛擬機(jī)上n只要具有虛擬機(jī),不同的機(jī)器上都可以運(yùn)行JavanJava 開發(fā)工具目前也已經(jīng)有很多種了,如 Sun,Borland,IBM, MicrosoftC+程序設(shè)計(jì) 1.1 比較 p1C+程序設(shè)計(jì)面向?qū)ο笏枷雴栴}域(Domain)以問題域中的事物為中心思考問題Object1Object2Objectn.對(duì)象歸類-抽象化Class1Class2Classn.類實(shí)例化:定義對(duì)象,構(gòu)建系統(tǒng),形成解決方案C+程序設(shè)

18、計(jì)面向過程思想問題域(Domain)以問題域的系統(tǒng)流程為中心分析Sub1Sub2Subn.各子流程實(shí)現(xiàn)-函數(shù)化Func1Func2Funcn.根據(jù)系統(tǒng)的流程組建軟件,通過函數(shù)的調(diào)用實(shí)現(xiàn)C+程序設(shè)計(jì)1.2對(duì)象和類客觀世界-認(rèn)識(shí)世界-計(jì)算機(jī)世界功能模塊設(shè)計(jì)相應(yīng)的數(shù)據(jù)結(jié)構(gòu)具體的函數(shù)和過程面向過程設(shè)計(jì)相應(yīng)的數(shù)據(jù)結(jié)構(gòu)功能模塊面向?qū)ο驝+程序設(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)是在吸取結(jié)構(gòu)化程序設(shè)計(jì)的一切優(yōu)點(diǎn)的基礎(chǔ)上發(fā)展起來的一種新的程序設(shè)計(jì)方法。它的本質(zhì)是把數(shù)據(jù)和處理數(shù)據(jù)的過程當(dāng)成一個(gè)整體類。類是對(duì)一組具有共同的屬性特征和行為特征的對(duì)象的抽象。C+程序設(shè)計(jì)類類 (教師類教師類)類是邏輯上相關(guān)的函數(shù)與數(shù)據(jù)的封裝,它是對(duì)所

19、要處理的問題的抽象描述。面向?qū)ο笳Z言必需提供的用戶定義的數(shù)據(jù)類型。類是將具有相同狀態(tài)、操作和訪問機(jī)制的多個(gè)對(duì)象抽象而成。對(duì)象對(duì)象 (一個(gè)教師(一個(gè)教師)從一般意義上講,對(duì)象是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物,它可以是有形的(比如一輛汽車),也可以是無形的(比如一項(xiàng)計(jì)劃)。對(duì)象是構(gòu)成世界的一個(gè)獨(dú)立單位,它具有自己的靜態(tài)特征(狀態(tài))和動(dòng)態(tài)特征(操作)。靜態(tài)特征即可以用某種數(shù)據(jù)來描述的特征,動(dòng)態(tài)特征即對(duì)象所表現(xiàn)的行為或?qū)ο笏哂械墓δ?。類的?shí)體就是對(duì)象。C+程序設(shè)計(jì)類和對(duì)象的關(guān)系就是抽象和具體的關(guān)系。類與對(duì)象的關(guān)系如同汽車與具體的一輛車的關(guān)系。汽車都能跑,有四個(gè)輪子,所有的汽車組成了一個(gè)類,具體到一輛汽

20、車,它具有類的全部特性(能跑,有四個(gè)輪子),是汽車類的一個(gè)子集或元素。類給出了屬于該類的全部對(duì)象的抽象定義,而對(duì)象則是符合這種定義的一個(gè)實(shí)體。所以,一個(gè)對(duì)象又稱作類的一個(gè)實(shí)例(instance)。 C+程序設(shè)計(jì)1.2.2對(duì)象的狀態(tài):對(duì)象的狀態(tài)是所有靜態(tài)屬性和這些屬性的動(dòng)態(tài)值的總和。 (如銀行帳戶.)1.2.3對(duì)象的交互(存取款.)C+程序設(shè)計(jì)面向?qū)ο笳Z言把狀態(tài)和操作封裝于對(duì)象體之中,并提供一種訪問機(jī)制,使對(duì)象的“私有數(shù)據(jù)”僅能由這個(gè)對(duì)象的操作來執(zhí)行。這種機(jī)制就是通過消息訪問機(jī)制來實(shí)現(xiàn)的。消息在面向?qū)ο蟪绦蛟O(shè)計(jì)中,一個(gè)對(duì)象向另一個(gè)對(duì)象發(fā)出的請(qǐng)求被稱為消息。消息是一個(gè)對(duì)象要求另一個(gè)對(duì)象執(zhí)行某個(gè)功能

21、操作的規(guī)格的說明,通過消息傳遞才能完成對(duì)象之間的請(qǐng)求或相互協(xié)作。C+程序設(shè)計(jì)方法方法是一系列計(jì)算步驟的有序集合。屬于一個(gè)類的對(duì)象具有相同的行為,當(dāng)某個(gè)行為作用在對(duì)象上時(shí),我們就說對(duì)象執(zhí)行了一個(gè)方法。一個(gè)對(duì)象請(qǐng)求另一個(gè)對(duì)象執(zhí)行了一個(gè)特定的方法,等價(jià)于一個(gè)對(duì)象發(fā)送一個(gè)消息給另一個(gè)對(duì)象,引起那個(gè)對(duì)象方法的執(zhí)行。C+程序設(shè)計(jì)1.2.4類的確定和劃分步驟:1)“程序要處理什么”2)“處理要完成怎樣的功能”方法:用抽象的思維方式,尋求一個(gè)大系統(tǒng)中事物的共性,將具有共性的系統(tǒng)成分確定為一個(gè)類。 (學(xué)校系統(tǒng).)C+程序設(shè)計(jì)1.3數(shù)據(jù)的抽象與封裝1.3.1 現(xiàn)實(shí)世界中的抽象與封裝 (錄音機(jī)按鈕、軟集成塊)1.3

22、.2 數(shù)據(jù)的抽象與封裝的基本概念 (銀行帳戶的接口 p9)C+程序設(shè)計(jì) 封裝封裝封裝是面向?qū)ο蠓椒ǖ囊粋€(gè)重要原則。它有兩個(gè)涵義:第一個(gè)涵義是,把對(duì)象的全部屬性和動(dòng)態(tài)行為結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單位(即對(duì)象)。第二個(gè)涵義也稱作“信息隱蔽”,即盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),對(duì)外形成一個(gè)邊界(或者說形成一道屏障),只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。這主要是指對(duì)象的外部不能直接地存取對(duì)象地屬性,只能通過幾個(gè)允許外部使用地服務(wù)與對(duì)象發(fā)生聯(lián)系。 C+程序設(shè)計(jì)1.3.3對(duì)象的特性封裝性模塊獨(dú)立性動(dòng)態(tài)連接性易維護(hù)性C+程序設(shè)計(jì)1.4 繼承性繼承性 (我是誰,龍生龍我是誰,龍生龍.)繼承是面向?qū)ο笳Z

23、言的另一特性。繼承使某類的對(duì)象可以繼承另一類對(duì)象的特性的一種機(jī)制。一個(gè)類的定義(子類)可以定義在另一個(gè)已定義類(父類)的基礎(chǔ)上。子類可以繼承父類中的屬性和操作,也可以定義自己的屬性和操作。繼承的必要性:提高了重用性,降低了復(fù)雜度,減少了接口的數(shù)量。類的繼承的特性:類間共性共享;類間有差別;類間有層次性。C+程序設(shè)計(jì)1.4.2繼承的分類按繼承源來分,繼承分為單繼承和多繼承(p13)。C+語言支持單繼承和多繼承,因而具有繼承這一特性所帶來的優(yōu)勢(shì),大大增加了程序的重用性。繼承的分類:p131.4. 3繼承與封裝的關(guān)系 封裝的單位是對(duì)象C+程序設(shè)計(jì)1.5 多態(tài)性多態(tài)性多態(tài)性即相同的消息作用在不同的對(duì)象

24、上形成了不同的行為。(喝.水、酒)1.5.2 重載的概念相同名字函數(shù)或運(yùn)算符在不同的場(chǎng)合可以表現(xiàn)出不同的行為。函數(shù)重載運(yùn)算符重載C+程序設(shè)計(jì) C+的發(fā)展歷史nC+源于C語言,而C語言是在B語言的基礎(chǔ)上發(fā)展起來的。 n1960年出現(xiàn)了一種面向問題的高級(jí)語言ALGOL 60 。n1963年英國(guó)劍橋大學(xué)推出了CPL(Combined Programming Language)語言,后來經(jīng)簡(jiǎn)化為BCPL語言。 n1970年美國(guó)貝爾(Bell)實(shí)驗(yàn)室的K.Thompson以BCPL語言為基礎(chǔ),設(shè)計(jì)了一種類似于BCPL的語言,取其第一字母B,稱為B語言。 C+程序設(shè)計(jì)n1972年美國(guó)貝爾實(shí)驗(yàn)室的Denni

25、s M.Ritchie為克服B語言的諸多不足,在B語言的基礎(chǔ)上重新設(shè)計(jì)了一種語言,取其第二字母C,故稱為C語言。 n1980年貝爾實(shí)驗(yàn)室的Bjarne Stroustrup對(duì)C語言進(jìn)行了擴(kuò)充,推出了“帶類的C”,多次修改后起名為C+。以后又經(jīng)過不斷的改進(jìn),發(fā)展成為今天的C+。 nC+改進(jìn)了C的不足之處,支持面向?qū)ο蟮某绦蛟O(shè)計(jì),在改進(jìn)的同時(shí)保持了C的簡(jiǎn)潔性和高效性。 C+程序設(shè)計(jì)1.2 C+程序的開發(fā)過程nC+語言是一種高級(jí)程序設(shè)計(jì)語言,它的開發(fā)過程與其他高級(jí)語言程序開發(fā)過程類似,一般要經(jīng)過四個(gè)步驟:編輯編譯鏈接執(zhí)行C+程序設(shè)計(jì)1.2.1 編輯編輯是指把按照C+語法規(guī)則編寫的程序代碼通過編輯器(

26、Borland C+ 5.05,Visual C+ 6.0,Turbo C+ 3.0)輸入計(jì)算機(jī),并存盤。在存盤時(shí),C+源文件的擴(kuò)展名為.CPP。1.2.2 編譯編譯將編輯好的C+源程序通過編譯器轉(zhuǎn)換為目標(biāo)文件(OBJ文件)。即生成該源文件的目標(biāo)代碼。 C+程序設(shè)計(jì)1.2.3 鏈接鏈接將用戶程序生成的多個(gè)目標(biāo)代碼文件(.obj)和系統(tǒng)提供的庫文件(.lib)中的某些代 碼 連 接 在 一 起 , 生 成 一 個(gè) 可 執(zhí) 行 文 件(.exe)。1.2.4 執(zhí)行執(zhí)行把生成的可執(zhí)行文件運(yùn)行,在屏幕上顯示運(yùn)行結(jié)果。用戶可以根據(jù)運(yùn)行結(jié)果來判斷程序是否出錯(cuò)。C+程序設(shè)計(jì)上機(jī)說明C+程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康膎

27、認(rèn)識(shí)Visual C+ 6.0 系統(tǒng)軟件;n編寫Hello World 程序;n理解源程序、目標(biāo)程序程執(zhí)行程序的內(nèi)涵;n熟練掌握編輯、編譯、連接程序的熟練掌握編輯、編譯、連接程序的過程過程。C+程序設(shè)計(jì)n熟悉Visual C+6.0 系統(tǒng)軟件的基本使用方法;n熟練掌握建立控制臺(tái)工程文件的方法,并且要知道新建文件保存的保存目錄,能夠在下次打開該工程進(jìn)行編輯修改;n編寫修改Hello World 程序;n編譯連接程序;n執(zhí)行該程序,查看程序執(zhí)行結(jié)果;n查找該程序的源程序、目標(biāo)程序和可執(zhí)行程序,理解它們各自的用途;二、實(shí)驗(yàn)內(nèi)容C+程序設(shè)計(jì)n建立一個(gè)工程(Hello World)n首先在D盤建立一個(gè)個(gè)

28、人目錄;n然后按下圖所示建立控制臺(tái)工程;三、實(shí)驗(yàn)步驟C+程序設(shè)計(jì)C+程序設(shè)計(jì)C+程序設(shè)計(jì)n雙擊 main函,進(jìn)入編輯狀態(tài);三、實(shí)驗(yàn)步驟C+程序設(shè)計(jì)C+程序設(shè)計(jì)C+程序設(shè)計(jì)n編譯、連接和執(zhí)行程序三、實(shí)驗(yàn)步驟C+程序設(shè)計(jì)C+程序設(shè)計(jì)C+程序設(shè)計(jì)n查看源程序、目標(biāo)程和可執(zhí)行程序n源程在 Hello World 目錄下 Hello World.cppn源程在 Hello World 目錄下 Debug 下 Hello World.objn執(zhí)行程序 Hello World 目錄下 Debug 下 Hello World.exe三、實(shí)驗(yàn)步驟C+程序設(shè)計(jì)1.3 C+的詞法與規(guī)則1.3.1 C+的字符集的字符

29、集n數(shù)字:0,1,2,3,4,5,6,7,8,9。n小寫字母:a,b,y,z。n大寫字母:A,B,Y,Z。n運(yùn)算符:+,-,*,/, %, ,= , ,!= ,= = , ,& , ,& , , ,( ), , ,- , , ! , ? , ?: , , , ; , ” , # 。n特殊字符:(連字符或下劃線)。n不可印出字符:空白格(包括空格、換行和制表符)。C+程序設(shè)計(jì)1.3.2 詞與詞法規(guī)則詞與詞法規(guī)則1. 標(biāo)識(shí)符標(biāo)識(shí)符標(biāo)識(shí)符是對(duì)實(shí)體定義的一種定義符,由字母或下劃線(或連字符)開頭、后面跟字母或數(shù)字或下劃線(或空串)組成的字符序列,一般有效長(zhǎng)度是8個(gè)字符(而ANSI C標(biāo)

30、準(zhǔn)規(guī)定31個(gè)字符),用來標(biāo)識(shí)用戶定義的常量名、變量名、函數(shù)名、文件名、數(shù)組名、和數(shù)據(jù)類型名和程序等。C+程序設(shè)計(jì)2. 關(guān)鍵字關(guān)鍵字關(guān)鍵字是具有特定含義,作為專用定義符的單詞,不允許另作它用。autobreakcasechar classconstcontinuedefault do ddefaultdeletedouble elseenum explicit externfloatforfriend gotoifinlineintlong mutablenewoperatorprivateprotectedpublicregisterreturnshort signedsizeofstatic

31、static_caststruct switchthistypedefunionunsigned virtualvoidwhile C+程序設(shè)計(jì)3. 運(yùn)算符和分隔符運(yùn)算符和分隔符運(yùn)算符是C+語言實(shí)現(xiàn)加、減等各種運(yùn)算的符號(hào)。 C+語言的分隔符主要是:空格、制表和換行符。4. 字符串字符串字符串是由雙引號(hào)括起來的字符。如“China”,“C+ Program”等。 5. 常量常量C+語言中常量包括實(shí)型常量(浮點(diǎn)常量)和整型常量(十進(jìn)制常量、八進(jìn)制常量、十六進(jìn)制常量)、浮點(diǎn)常量、字符常量和字符串常量。 C+程序設(shè)計(jì)6. 注釋注釋注釋是用來幫助閱讀、理解及維護(hù)程序。在編譯時(shí),注釋部分被忽略,不產(chǎn)生目標(biāo)

32、代碼。C+語言提供兩種注釋方式。一種是與C兼容的多行注釋,用/*和*/分界。另一種是單行注釋,以“/”開頭的表明本行中“/”符號(hào)后的內(nèi)容是注釋。如下程序: C+程序設(shè)計(jì)例1-1:一個(gè)簡(jiǎn)單的C+程序。#include void main() coutb ) c=a-b; d=c*a; else c=a+b; d=c*b; C+程序設(shè)計(jì)(5)函數(shù)調(diào)用語句函數(shù)調(diào)用語句函數(shù)調(diào)用語句是由一次函數(shù)調(diào)用加一個(gè)分號(hào)而構(gòu)成的一個(gè)語句。例如:max(x,y);(6)空語句)空語句空語句:;即只有分號(hào)“;”的語句,什么也不做。C+程序設(shè)計(jì)n 抽象和分類 (例) 抽象:抽象出實(shí)物的共同特點(diǎn) 分類:根據(jù)不同的特點(diǎn)進(jìn)行歸

33、類 面向?qū)ο蟪绦蛟O(shè)計(jì): 可讀性強(qiáng),可重用性高,效率不一定高 結(jié)構(gòu)化程序設(shè)計(jì): 可讀性差,重用性差,但效率高C+程序設(shè)計(jì)nJosephus問題 一群小孩圍成一圈,任意假定一個(gè)數(shù)m,從第一個(gè)小孩起,順時(shí)針方向數(shù),每數(shù)到第m個(gè)小孩時(shí),這個(gè)小孩就離開。小孩不斷離開,圈子不斷縮小。最后,剩下的一個(gè)小孩是勝利者。問勝利者是第幾個(gè)小孩?上面的問題可描述為:/Josephus問題解答建立小孩結(jié)構(gòu)類型初始化小孩數(shù),開始位置,數(shù)小孩個(gè)數(shù)分配小孩結(jié)構(gòu)數(shù)組C+程序設(shè)計(jì)for 初始化結(jié)構(gòu)數(shù)組(構(gòu)成環(huán)鏈) 掛接下一個(gè)數(shù)組元素 小孩編號(hào) 輸出編號(hào)endfor轉(zhuǎn)到初始位置while(小孩數(shù)多于一個(gè)) 數(shù)小孩個(gè)數(shù)(一個(gè)循環(huán))

34、出列小孩 將這個(gè)小孩從中刪除endwhileC+程序設(shè)計(jì)輸出得勝者結(jié)構(gòu)化方法: 結(jié)構(gòu)化方法按功能分割結(jié)構(gòu)化方法按功能分割 自頂而下,逐步細(xì)化根據(jù)描述,Josephus問題可以分為四個(gè)模塊 1初始化小孩數(shù),開始位置,數(shù)小孩數(shù); 2 初始化環(huán)鏈表(采用鏈表數(shù)據(jù)結(jié)構(gòu)來解) 3 數(shù)小孩 4 處理未獲勝的小孩。C+程序設(shè)計(jì)在此基礎(chǔ)上要逐步細(xì)化:第一點(diǎn)細(xì)化為: 鍵入小孩數(shù)、開始位置、數(shù)小孩個(gè)數(shù) 小孩數(shù)校驗(yàn) 開始位置校驗(yàn) 數(shù)小孩數(shù)校驗(yàn)第二點(diǎn)細(xì)化為: 分配結(jié)構(gòu)數(shù)組 for 初始化結(jié)構(gòu)數(shù)組(構(gòu)成環(huán)鏈) 連接下一個(gè)數(shù)組元素 小孩編號(hào)賦值 輸出小孩編號(hào) endfor 返回環(huán)鏈表C+程序設(shè)計(jì)數(shù)小孩細(xì)化為: for(從

35、1到數(shù)小孩間隔數(shù)) 開始位置挪到下一個(gè)小孩 endfor處理未獲勝的小孩描述為: while(小孩數(shù)多于一個(gè)) 數(shù)小孩(一個(gè)循環(huán)) 出列小孩 將這個(gè)小孩刪除 endwhileC+程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì)需要知道整個(gè)過程,相應(yīng)的數(shù)據(jù)結(jié)構(gòu),以及算法流程具體實(shí)現(xiàn):#include #incude struct Jose /小孩結(jié)構(gòu) int code; /小孩編號(hào) Jose * next; /下一個(gè)小孩結(jié)點(diǎn); C+程序設(shè)計(jì)/全局變量int n; /小孩數(shù)int begin; /開始位置int m; /數(shù)小孩的順序個(gè)數(shù)Jose * pivot; /鏈表哨兵Jose *pCur; /當(dāng)前結(jié)點(diǎn)指針/函數(shù)聲明i

36、nt assign(); /賦初值; void initial(Jose *pJose); /初始化環(huán)鏈表void count(int m); /數(shù)小孩void process(); /處理所有未獲勝小孩C+程序設(shè)計(jì)/主函數(shù)void main() if (!assign() cout”The program failed. n”; return;Jose *pJose=new Josen; /分配結(jié)構(gòu)數(shù)組 initial(pJose); /初始化結(jié)構(gòu)數(shù)組 count(begin); /轉(zhuǎn)到開始位置 process(); /處理所有未獲勝小孩 cout”n the winner is ”code

37、endl; delete pJose; /釋放空間;C+程序設(shè)計(jì)/賦初值int assign() int number, start, count; coutnumberstartcount; if (number3)/小孩數(shù)校驗(yàn) cerr”bad number of boys n”; return 0;C+程序設(shè)計(jì)if (start1)/開始位置校驗(yàn) cerr”bad beginning position. n”; return 0; if (count number)/數(shù)小孩 /順序個(gè)數(shù)校驗(yàn) cerr”bad interval number. n”; return 0; n=number;

38、 begin=start 1; m=count; /賦值 return 1;C+程序設(shè)計(jì)/鏈表初始化void initial(Jose *pJose) int lineCount=0; Jose *px=pJose; for(int i=1; inext=pJose + i % n; px-code=i; px=px-next; if (lineCount+ % 10)= = 0) coutendl; coutsetw(4)i; C+程序設(shè)計(jì) coutendl; pCur=pJose + n 1; /指向數(shù)組最后一個(gè)元素/數(shù)m個(gè)小孩void count(int m) for(int i=0;

39、inext; C+程序設(shè)計(jì)/處理未獲勝小孩void process() int linecount=0; for(int i=1; in; i+) count(m); /數(shù)小孩 if ( linecount+ % 10 ) = = 0) coutendl; coutsetw (4)code; pivot -next=pCur -next; /刪除小孩 pCur = pivot; C+程序設(shè)計(jì)n面向?qū)ο蠓椒ǔ橄蠛头诸悾?大致確定類的屬性(數(shù)據(jù)成員) 和方法(函數(shù)成員)Josephus類屬性: Boynumber, BeginPos, Interval方法:Initial, GetwinnerRi

40、ng類屬性:First, Pivot, Current方法:Clear, Print, CountC+程序設(shè)計(jì)/主函數(shù)定義一個(gè)Jose類對(duì)象賦初值initial求獲勝者getwinner面向?qū)ο蟪绦蛟O(shè)計(jì)使用戶不需要懂計(jì)算機(jī)太多,也不需要懂業(yè)務(wù)太多面向?qū)ο蟪绦虻膶?shí)現(xiàn)文件: ring.h ,jose.h ring.cpp, jose.cpp, jose4.cppC+程序設(shè)計(jì)/*ring.h開始*/struct Boy /小孩結(jié)構(gòu)作為鏈表結(jié)點(diǎn) int code; Boy *next;C+程序設(shè)計(jì)class Ring /環(huán)鏈表類定義 public: Ring(int n); void Count(in

41、t m); /數(shù)小孩 void PutBoy(); /輸出當(dāng)前小孩編號(hào) void ClearBoy(); /刪除小孩 Ring(); protected: Boy * pBegin; Boy * pivot Boy * pCurrent; /*ring.h結(jié)束*/C+程序設(shè)計(jì)/*ring.cpp開始*/#include #include #include “ring.h”Ring:Ring(int n) pBegin = new Boyn; pCurrent = pBegin;C+程序設(shè)計(jì) for(int i=1; inext) pCurrent - next = pBegin + i % n; /將結(jié)點(diǎn)鏈起來 pCurrent - code =i; /小孩編號(hào) PutBoy(); coutendl; pCurrent = &pBeginn - 1; /當(dāng)前小孩位置在最后

溫馨提示

  • 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)論