全國計算機二級考試C-教程課件_第1頁
全國計算機二級考試C-教程課件_第2頁
全國計算機二級考試C-教程課件_第3頁
全國計算機二級考試C-教程課件_第4頁
全國計算機二級考試C-教程課件_第5頁
已閱讀5頁,還剩137頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一章面向?qū)ο蟪绦蛟O(shè)計緒論

1.1什么是面向?qū)ο蟪绦蛟O(shè)計

1.2對象和類

1.3數(shù)據(jù)的抽象和封裝

1.4繼承性

1.5多態(tài)性

1.6面向?qū)ο蟪绦蛟O(shè)計語言第一章面向?qū)ο蟪绦蛟O(shè)計緒論 1.1什么是面向?qū)ο?關(guān)于課程目標

進一步學會面向過程編程理解面向?qū)ο笏枷胍詫ο蟮姆绞剿伎际煜++(P)利用C++編程關(guān)于課程目標

2在本課程中:C++是一個學習面向?qū)ο蟾拍畹墓ぞ哌\用面向?qū)ο竽J竭M行程序設(shè)計在本課程中:3采用面向?qū)ο蠓椒ǖ男Ч?OOA/OOD)可維護性可擴展性可靠性采用面向?qū)ο蠓椒ǖ男Ч?OOA/OOD)4如何實現(xiàn)課程目標閱讀和記憶閱讀書籍,記住語言特點思考以對象和類的方式思考實踐多編程如何實現(xiàn)課程目標閱讀和記憶5參考課本C++程序設(shè)計教程(錢能),清華大學出版社C++程序設(shè)計教程,H.M.Deitel,P.J.Deitel著,機械工業(yè)出版社C++大學教程(第二版),HarveayM.Deitel著,電子工業(yè)出版社

C++Primer(第三版),StanleyB.lippmanJoseeLajoie著,中國電力出版社C++編程思想(ThinkinginC++),BruceEckel著,機械工業(yè)出版社參考課本C++程序設(shè)計教程(錢能),清華大學出版社61從C語言到C++語言C語言以其如下獨有的特點風靡了全世界:(1)語言簡潔、緊湊,使用方便、靈活。C語言只有32個關(guān)鍵字,程序書寫形式自由。(2)豐富的運算符和數(shù)據(jù)類型。(3)可以直接訪問內(nèi)存地址,能進行位操作,使其能夠勝任開發(fā)操作系統(tǒng)的工作。1從C語言到C++語言C語言以其如下獨有的特點風靡了全世7(4)生成的目標代碼質(zhì)量高,程序運行效率高。(5)可移植性好。(4)生成的目標代碼質(zhì)量高,程序運行效率高。8局限性:(1)數(shù)據(jù)類型檢查機制相對較弱,這使得程序中的一些錯誤不能在編譯階段被發(fā)現(xiàn)。(2)C本身幾乎沒有支持代碼重用的語言結(jié)構(gòu),因此一個程序員精心設(shè)計的程序,很難為其它程序所用。(3)當程序的規(guī)模達到一定程度時,程序員很難控制程序的復雜性。局限性:9發(fā)展1980年,貝爾實驗室的BjarneStroustrup開始對C進行改進和擴充。1983年正式命名為C++。在經(jīng)歷了3次C++修訂后,1994年制定了ANSIC++標準的草案。以后又經(jīng)過不斷完善,成為目前的C++。C++仍在不斷發(fā)展中。美國微軟公司現(xiàn)已推出C#(CSharp)語言,來代替C++語言。發(fā)展1980年,貝爾實驗室的BjarneStroustru10ARichHistoryMS-DOSBASICWindowsVisualBASICIE,IISVisualStudio1995Internet1990GUI1981PC2002XML

WebServicesARichHistoryMS-DOSWindowsIE,11編譯器VC++6.0或其它(TurborC3.0,BorlandC++)編譯器VC++6.012有關(guān)面向?qū)ο缶幊痰木W(wǎng)站/softinfo/objects.html/Technology/OTTerminology.html/oofaq/www.itr.ch/courses/case/oo.html/有關(guān)面向?qū)ο缶幊痰木W(wǎng)站13C++的網(wǎng)站/~bs/c++.html/visualc/borlandcpp/cpprod.html/mike/webjr/begcpp.htm/morph/c++/main.htm/C++的網(wǎng)站/~bs14Object-Oriented編程簡介Object-Oriented編程簡介15內(nèi)容方法學編程技術(shù)面向?qū)ο笳Z言內(nèi)容方法學161.方法學1.方法學17思考問題的方法歸納從特殊到一般從不同的dogs到詞匯“dog”Dog思考問題的方法歸納Dog18思考問題的方法演繹從一般到特殊從詞匯“dog”,你可以區(qū)別出一個動物是還是不是一條狗DOG思考問題的方法演繹DOG19面向?qū)ο笏且环N思考方法世界上的任何東西都是一個對象;任何系統(tǒng)都是由對象構(gòu)成的(當然系統(tǒng)也是一個對象);系統(tǒng)的演化和開發(fā)就是通過系統(tǒng)內(nèi)外的對象進行交互完成的。面向?qū)ο笏且环N思考方法20世界上的任何東西都是一個對象花,樹,動物學生,教授桌子,椅子,教室,建筑大學,城市,國家世界,宇宙學科,如計算機,信息系統(tǒng),數(shù)學,歷史…世界上的任何東西都是一個對象花,樹,動物21任何系統(tǒng)都是由對象構(gòu)成的法律系統(tǒng)文化系統(tǒng)教育系統(tǒng)經(jīng)濟系統(tǒng)信息系統(tǒng)計算機系統(tǒng)任何系統(tǒng)都是由對象構(gòu)成的法律系統(tǒng)22系統(tǒng)開發(fā)就是定義對象間的交互揚州大學是由下列對象的交互構(gòu)成的:學生教授職員江蘇省政府中國政府…...揚大內(nèi)部揚大外部系統(tǒng)開發(fā)就是定義對象間的交互揚州大學是由下列對象的交互構(gòu)成的23設(shè)計方法學面向?qū)ο笫紫仁且环N設(shè)計方法學(OOA/OOD)對象是程序的構(gòu)成模塊(接口對象(editor,menu,file,etc),數(shù)據(jù)管理對象(db),etc.).對象代表了在應用中對現(xiàn)實世界的抽象.設(shè)計方法學面向?qū)ο笫紫仁且环N設(shè)計方法學(OOA/OOD)24設(shè)計方法學面向?qū)ο笾С謿w納:對象->類需要OOA/OOD工具.演繹:類->對象編程者需要學習有關(guān)類庫的知識設(shè)計方法學面向?qū)ο笾С?5設(shè)計方法學面向?qū)ο笾С諸op-down:從超類到子類Bottom-up:從子類到超類設(shè)計方法學面向?qū)ο笾С?6面向?qū)ο缶幊痰幕A(chǔ)*對象*封裝*繼承

一般說來,對象是根據(jù)類來定義的。我們也可以用一個類來定義另一個類。例如,山地車、賽車和雙座自行車都是自行車的一種。用面向?qū)ο蟮男g(shù)語來說,它都是自行車類的子類或派生類,而自行車類是它們的超類或父類或基類。它們的關(guān)系如下圖所示:

自行車每一個子類繼承了超類的數(shù)據(jù)和操作,但是,子類并不是局限于超類的數(shù)據(jù)和操作。例如,雙座自行車有兩個坐墊,山地車有一個額外的低速齒輪。繼承的主要益處是可以復用超類的程序代碼*多態(tài)賽車三地車雙座自行車面向?qū)ο缶幊痰幕A(chǔ)賽車三地車雙座自行車27面向?qū)ο蟆笆澜缡敲嫦驅(qū)ο蟮摹?---AlanKaysaid.如果你對世界了解,那么你就了解了面向?qū)ο?所以,面向?qū)ο笫侨菀椎?面向?qū)ο蟆笆澜缡敲嫦驅(qū)ο蟮摹?82.編程2.編程29編程就像寫作.如果你能夠描繪一樣東西,你就可以寫一個程序.所以,編程也是容易的.所以,面向?qū)ο蟮木幊痰扔谌菀?容易,得到“too(2)easy”.編程編程就像寫作.編程30編程但是,實際上,編程并不那么容易。因為編一個真正的好的程序是不容易的。它需要編程者的智慧,知識和經(jīng)驗.就象寫作一樣,要成為一個好的作家,就需要很多的經(jīng)驗和對這個世界的大量知識。學習和練習就必不可少。編程但是,實際上,編程并不那么容易。因為編一個真正的好的程序31編程技術(shù)非結(jié)構(gòu)化編程過程編程模塊化&結(jié)構(gòu)化編程抽象數(shù)據(jù)類型面向?qū)ο缶幊叹幊碳夹g(shù)非結(jié)構(gòu)化編程32非結(jié)構(gòu)化編程我們經(jīng)常將一個簡單的程序?qū)懗梢粋€主程序.此處,主程序代表了命令和聲明的一個序列,這個系列在整個程序中對全局數(shù)據(jù)進行修改.MainProgramData非結(jié)構(gòu)化編程我們經(jīng)常將一個簡單的程序?qū)懗梢粋€主程序.此處,33缺點這種技術(shù)只能用于很小的程序中.例如,如果相同的聲明序列在不同的地方要多次出現(xiàn)時,我們就不得不拷貝這些序列。如果其中發(fā)生了一個錯誤,我們就需要對每一個拷貝進行修改.這就導致了我們將這些序列抽取出來,單獨命名,并通過調(diào)用和返回值的方法來實現(xiàn)多處復用的方法。缺點這種技術(shù)只能用于很小的程序中.34過程編程在過程編程中,你可以將序列歸在一個地方過程調(diào)用可以被用于調(diào)用過程。在調(diào)用完成后,控制流繼續(xù)往下。MainProgramProcedure過程編程在過程編程中,你可以將序列歸在一個地方MainPr35過程通過參數(shù)和子過程(過程的過程),程序就可以寫得更有結(jié)構(gòu)并且可以減少錯誤.例如,如果過程是正確的,那么每一次使用它必然可以獲得正確的結(jié)果因而,為了查找錯誤,你就可以縮小查找的范圍.過程通過參數(shù)和子過程(過程的過程),程序就可以寫得更有36模塊化編程在模塊化編程中,具有公共功能的過程被集中在不同的模塊中一個程序就不再是一個單一整體構(gòu)成的了,它被分解成多個小的部分,這些小的部分之間通過調(diào)用相互交互,構(gòu)成了整個程序.模塊化編程在模塊化編程中,具有公共功能的過程被集中在不同的模37MainProgram(Alsoamodule)DataDataData1Module2+DataData2Module1+DataData1Procedure1Procedure2主程序協(xié)調(diào)多個模塊之間的調(diào)用,并進行數(shù)據(jù)的傳送Procedure3MainProgram(Alsoamodule)Dat38模塊化編程每一個模塊都可以有自己的數(shù)據(jù)。這將允許每一個模塊來管理內(nèi)部狀態(tài),這些狀態(tài)可以在調(diào)用這些模塊中的過程時得到修改.因此,每一個模塊都有一個狀態(tài),每一個模塊在整個程序中通常也最多存在一次模塊化編程每一個模塊都可以有自己的數(shù)據(jù)。這將允許每一個模塊來39結(jié)構(gòu)化編程結(jié)構(gòu)化程序中的三種結(jié)構(gòu)順序(s1,s2,…,sn)分支(if-then-else)循環(huán)Loop(for,do,andwhileloops)程序中有多少結(jié)構(gòu)?結(jié)構(gòu)化編程結(jié)構(gòu)化程序中的三種結(jié)構(gòu)順序(s1,s2,…,sn)40抽象數(shù)據(jù)類型(ADTs)抽象模型抽象數(shù)據(jù)類型屬性抽象數(shù)據(jù)類型(ADTs)抽象41抽象

--問題處理手段為了理解問題,需要將不必要的細節(jié)分離出去:你將構(gòu)造你自己針對問題的抽象視圖,抽象模型這個建模過程稱為抽象abstraction.抽象

--問題處理手段為了理解問題,需要將不必要的細節(jié)分離出42問題模型抽象問題模型抽象43模型模型定義了一個抽象的視圖,該視圖只關(guān)注于與問題和求解者相關(guān)的部分。你需要定義下列屬性:影響的數(shù)據(jù);識別出來的操作;ADT就是一種模型.模型模型定義了一個抽象的視圖,該視圖只關(guān)注于與問題和求解者相44Interface

Operations

AbstractDataStructureAbstractDataTypeADTAbstractDataStructureAbstrac45定義(ADT)ADT有下列一些特性:1.它提供了一種類型.2.它提供了操作的集合.該集合被稱為接口.3.接口的操作是類型數(shù)據(jù)結(jié)構(gòu)的唯一訪問途徑.4.原理和前提定義了類型的應用領(lǐng)域.定義(ADT)ADT有下列一些特性:46例子:ADTList類型

List.類型list實例的接口由接口定義文件定義操作:insert,get,append,delete,search,…例子:ADTList類型List.47面向?qū)ο蟮木幊虒ο笫怯沙橄髷?shù)據(jù)類型來的面向?qū)ο缶幊淌菍ο蠼换サ囊粋€網(wǎng)絡(luò),每一個對象保存自己的狀態(tài)程序中的對象通過發(fā)送消息進行交互面向?qū)ο蟮木幊虒ο笫怯沙橄髷?shù)據(jù)類型來的48Object1Data1+Procedures1DataData1Object3

Data3+

Procedures3Object2Data2+

Procedures2Object4

Data4+

Procedures4Object1Data1+Procedures1DataDa49面向?qū)ο缶幊淘诿嫦驅(qū)ο缶幊讨?,我們直接發(fā)送一個消息,而不是去調(diào)用一個程序來實現(xiàn)一個功能.粗略地說,每一個對象實現(xiàn)了自己的模塊面向?qū)ο缶幊淘诿嫦驅(qū)ο缶幊讨?,我們直接發(fā)送一個消息,而不是去50面向?qū)ο缶幊堂恳粋€對象負責正確地初始化和銷毀自身.相應地,對對象而言,我們就不需要顯式地創(chuàng)建和生成過程面向?qū)ο缶幊堂恳粋€對象負責正確地初始化和銷毀自身.51模塊信息隱藏數(shù)據(jù)封裝抽象數(shù)據(jù)類型對象面向?qū)ο蟮难莼K面向?qū)ο蟮难莼?2記住封裝(Data&Operations)---信息隱藏的技術(shù)——對象的用戶不能看到對象的數(shù)據(jù)和操作的細節(jié).數(shù)據(jù)抽象----從對象中發(fā)現(xiàn)類的過程抽象數(shù)據(jù)類型----類記住封裝(Data&Operations)---信息隱533.編碼語言3.編碼語言54面向?qū)ο笳Z言面向?qū)ο缶幊陶Z言就是能夠很方便地支持面向?qū)ο蟾拍畹恼Z言Smalltalk:1972-1980.C++:1980.Java:1992(Smalltalk+C++).其它:Effile,Objective-C,Ada,...面向?qū)ο笳Z言面向?qū)ο缶幊陶Z言就是能夠很方便地支持面向?qū)ο蟾拍?5SmalltalkSmalltalk是一個純的面向?qū)ο笳Z言.多數(shù)人認為Smalltalk程序比C++程序開發(fā)起來更快.SmalltalkSmalltalk是一個純的面向?qū)ο笳Z言56Smalltalk豐富的類庫,通過繼承實現(xiàn)重用Smalltalk擁有動態(tài)開發(fā)環(huán)境。它不是編譯的,但是C++是編譯的.這使得開發(fā)過程更可變,你可以方便地對類和各種情形進行修改Smalltalk豐富的類庫,通過繼承實現(xiàn)重用57Smalltalk編程者并不能象在C++中那樣立即掌握o-o概念.正因為如此,掌握Smalltalk需要更多地時間.但是多數(shù)時間是花在學習面向?qū)ο蠓椒▽W和技術(shù)上,而不是編程語言上的。實際上,Smalltalk比C和C++更為簡單.Smalltalk編程者并不能象在C++中那樣立即掌握58C++C++是C的面向?qū)ο蟀姹?它與C是一致的(它實際上是C的超集),所以現(xiàn)存的C代碼能夠包含在C++程序中.C++程序速度快,效率高.這些特性已經(jīng)使C++成為很流行的語言.C++C++是C的面向?qū)ο蟀姹?它與C是一致的(它59C++它犧牲了一些靈活性以提高效率.C++采用編譯時綁定的方法。這使得程序運行時的效率很高,代碼也較小,但是它影響了重用類的某些能力.

C++它犧牲了一些靈活性以提高效率.60C++C++已經(jīng)非常流行,絕大多數(shù)新的C編譯器實際上是C/C++編譯器.但是,如果想進行面向?qū)ο缶幊?,你必須用C++編程(思考),而不是C.這些都將對有經(jīng)驗的C編程者帶來挑戰(zhàn)。他們認為他們是在運用C++編程,但實際上只用了很少的面向?qū)ο筇攸c。C++C++已經(jīng)非常流行,絕大多數(shù)新的C編譯器實際上是61C++C++是一個優(yōu)秀的語言.利用它,你可以編出世界上最好的程序!C++是一個差的語言.使用它,你也可能編出世界上最差的程序所以,在學習和使用它時,注意它的OO特性和非OO特性。C++C++是一個優(yōu)秀的語言.62Java它是一個可移植語言,它可以運行在瀏覽器上。因此,它在Internet和Intranet上發(fā)揮出了極大的作用。Java它是一個可移植語言,它可以運行在瀏覽器上。因此,它在63JavaJava是C++和Smalltalk古怪的混合.它具有C++的語法,使它容易學習(也許是難以學習,這依賴于學習者的經(jīng)驗).它具有Smalltalk的結(jié)構(gòu),如虛擬機和字節(jié)碼.JavaJava是C++和Smalltalk古怪的混合.64Java(續(xù))C++的改進:取消指針垃圾回收運行在類似于Smalltalk-風格的虛擬機上只要具有虛擬機,不同的機器上都可以運行Java(續(xù))C++的改進:65JavaJava開發(fā)工具目前也已經(jīng)有很多種了,如Sun,Borland,IBM,MicrosoftJavaJava開發(fā)工具目前也已經(jīng)有很多種了,如Sun,661.1比較p11.1比較p167面向?qū)ο笏枷雴栴}域(Domain)以問題域中的事物為中心思考問題Object1Object2Objectn….對象歸類----抽象化Class1Class2Classn….類實例化:定義對象,構(gòu)建系統(tǒng),形成解決方案面向?qū)ο笏枷雴栴}域(Domain)以問題域中的事物為中心思68面向過程思想問題域(Domain)以問題域的系統(tǒng)流程為中心分析Sub1Sub2Subn….各子流程實現(xiàn)----函數(shù)化Func1Func2Funcn….根據(jù)系統(tǒng)的流程組建軟件,通過函數(shù)的調(diào)用實現(xiàn)面向過程思想問題域(Domain)以問題域的系統(tǒng)流程為中心691.2對象和類客觀世界-----認識世界----計算機世界功能模塊設(shè)計相應的數(shù)據(jù)結(jié)構(gòu)具體的函數(shù)和過程面向過程設(shè)計相應的數(shù)據(jù)結(jié)構(gòu)功能模塊面向?qū)ο?.2對象和類功能模塊設(shè)計相應的具體的面向過程設(shè)計相應的功70

面向?qū)ο蟪绦蛟O(shè)計是在吸取結(jié)構(gòu)化程序設(shè)計的一切優(yōu)點的基礎(chǔ)上發(fā)展起來的一種新的程序設(shè)計方法。它的本質(zhì)是把數(shù)據(jù)和處理數(shù)據(jù)的過程當成一個整體——類。 類是對一組具有共同的屬性特征和行為特征的對象的抽象。 面向?qū)ο蟪绦蛟O(shè)計是在吸取結(jié)構(gòu)化程序設(shè)計的一切優(yōu)點的基礎(chǔ)71類(教師類) 類是邏輯上相關(guān)的函數(shù)與數(shù)據(jù)的封裝,它是對所要處理的問題的抽象描述。面向?qū)ο笳Z言必需提供的用戶定義的數(shù)據(jù)類型。 類是將具有相同狀態(tài)、操作和訪問機制的多個對象抽象而成。對象(一個教師…) 從一般意義上講,對象是現(xiàn)實世界中一個實際存在的事物,它可以是有形的(比如一輛汽車),也可以是無形的(比如一項計劃)。對象是構(gòu)成世界的一個獨立單位,它具有自己的靜態(tài)特征(狀態(tài))和動態(tài)特征(操作)。靜態(tài)特征即可以用某種數(shù)據(jù)來描述的特征,動態(tài)特征即對象所表現(xiàn)的行為或?qū)ο笏哂械墓δ堋?/p>

類的實體就是對象。

類(教師類)72

類和對象的關(guān)系就是抽象和具體的關(guān)系。

類與對象的關(guān)系如同汽車與具體的一輛車的關(guān)系。汽車都能跑,有四個輪子,所有的汽車組成了一個類,具體到一輛汽車,它具有類的全部特性(能跑,有四個輪子),是汽車類的一個子集或元素。類給出了屬于該類的全部對象的抽象定義,而對象則是符合這種定義的一個實體。所以,一個對象又稱作類的一個實例(instance)。

731.2.2對象的狀態(tài): 對象的狀態(tài)是所有靜態(tài)屬性和這些屬性的動態(tài)值的總和。(如銀行帳戶..)1.2.3對象的交互 (存取款..)1.2.274面向?qū)ο笳Z言把狀態(tài)和操作封裝于對象體之中,并提供一種訪問機制,使對象的“私有數(shù)據(jù)”僅能由這個對象的操作來執(zhí)行。這種機制就是通過消息訪問機制來實現(xiàn)的。消息在面向?qū)ο蟪绦蛟O(shè)計中,一個對象向另一個對象發(fā)出的請求被稱為消息。消息是一個對象要求另一個對象執(zhí)行某個功能操作的規(guī)格的說明,通過消息傳遞才能完成對象之間的請求或相互協(xié)作。面向?qū)ο笳Z言把狀態(tài)和操作封裝于對象體75方法方法是一系列計算步驟的有序集合。屬于一個類的對象具有相同的行為,當某個行為作用在對象上時,我們就說對象執(zhí)行了一個方法。一個對象請求另一個對象執(zhí)行了一個特定的方法,等價于一個對象發(fā)送一個消息給另一個對象,引起那個對象方法的執(zhí)行。方法761.2.4類的確定和劃分步驟:1)“程序要處理什么” 2)“處理要完成怎樣的功能”方法:用抽象的思維方式,尋求一個大系統(tǒng)中事物的共性,將具有共性的系統(tǒng)成分確定為一個類。(學校系統(tǒng)….)1.2.4類的確定和劃分771.3數(shù)據(jù)的抽象與封裝1.3.1現(xiàn)實世界中的抽象與封裝(錄音機按鈕]、軟集成塊…)1.3.2數(shù)據(jù)的抽象與封裝的基本概念(銀行帳戶的接口p9)1.3數(shù)據(jù)的抽象與封裝78

封裝

封裝是面向?qū)ο蠓椒ǖ囊粋€重要原則。它有兩個涵義:第一個涵義是,把對象的全部屬性和動態(tài)行為結(jié)合在一起,形成一個不可分割的獨立單位(即對象)。第二個涵義也稱作“信息隱蔽”,即盡可能隱蔽對象的內(nèi)部細節(jié),對外形成一個邊界(或者說形成一道屏障),只保留有限的對外接口使之與外部發(fā)生聯(lián)系。這主要是指對象的外部不能直接地存取對象地屬性,只能通過幾個允許外部使用地服務與對象發(fā)生聯(lián)系。

封裝791.3.3對象的特性封裝性模塊獨立性動態(tài)連接性易維護性1.3.3對象的特性801.4繼承性(我是誰,龍生龍..)

繼承是面向?qū)ο笳Z言的另一特性。繼承使某類的對象可以繼承另一類對象的特性的一種機制。 一個類的定義(子類)可以定義在另一個已定義類(父類)的基礎(chǔ)上。子類可以繼承父類中的屬性和操作,也可以定義自己的屬性和操作。

繼承的必要性:提高了重用性,降低了復雜度,減少了接口的數(shù)量。

類的繼承的特性:類間共性共享;類間有差別;類間有層次性。1.4繼承性(我是誰,龍生龍..)811.4.2繼承的分類按繼承源來分,繼承分為單繼承和多繼承(p13)。C++語言支持單繼承和多繼承,因而具有繼承這一特性所帶來的優(yōu)勢,大大增加了程序的重用性。繼承的分類:p131.4.3繼承與封裝的關(guān)系封裝的單位是對象1.4.2繼承的分類821.5多態(tài)性

多態(tài)性即相同的消息作用在不同的對象上形成了不同的行為。 (喝….水、酒)

1.5.2重載的概念相同名字函數(shù)或運算符在不同的場合可以表現(xiàn)出不同的行為。函數(shù)重載運算符重載1.5多態(tài)性1.5.2重載的概念83C++的發(fā)展歷史C++源于C語言,而C語言是在B語言的基礎(chǔ)上發(fā)展起來的。

1960年出現(xiàn)了一種面向問題的高級語言ALGOL60。1963年英國劍橋大學推出了CPL(CombinedProgrammingLanguage)語言,后來經(jīng)簡化為BCPL語言。

1970年美國貝爾(Bell)實驗室的K.Thompson以BCPL語言為基礎(chǔ),設(shè)計了一種類似于BCPL的語言,取其第一字母B,稱為B語言。

C++的發(fā)展歷史C++源于C語言,而C語言是在B語言的基841972年美國貝爾實驗室的DennisM.Ritchie為克服B語言的諸多不足,在B語言的基礎(chǔ)上重新設(shè)計了一種語言,取其第二字母C,故稱為C語言。1980年貝爾實驗室的BjarneStroustrup對C語言進行了擴充,推出了“帶類的C”,多次修改后起名為C++。以后又經(jīng)過不斷的改進,發(fā)展成為今天的C++。

C++改進了C的不足之處,支持面向?qū)ο蟮某绦蛟O(shè)計,在改進的同時保持了C的簡潔性和高效性。

1972年美國貝爾實驗室的DennisM.Ritchie為851.2C++程序的開發(fā)過程C++語言是一種高級程序設(shè)計語言,它的開發(fā)過程與其他高級語言程序開發(fā)過程類似,一般要經(jīng)過四個步驟:編輯編譯鏈接執(zhí)行1.2C++程序的開發(fā)過程C++語言是一種高級程序設(shè)計861.2.1編輯 是指把按照C++語法規(guī)則編寫的程序代碼通過編輯器(BorlandC++5.05,VisualC++6.0,TurboC++3.0)輸入計算機,并存盤。在存盤時,C++源文件的擴展名為.CPP。1.2.2編譯 將編輯好的C++源程序通過編譯器轉(zhuǎn)換為目標文件(OBJ文件)。即生成該源文件的目標代碼。

1.2.1編輯871.2.3鏈接 將用戶程序生成的多個目標代碼文件(.obj)和系統(tǒng)提供的庫文件(.lib)中的某些代碼連接在一起,生成一個可執(zhí)行文件(.exe)。1.2.4執(zhí)行 把生成的可執(zhí)行文件運行,在屏幕上顯示運行結(jié)果。用戶可以根據(jù)運行結(jié)果來判斷程序是否出錯。1.2.3鏈接88上機說明上機說明89一、實驗目的認識VisualC++6.0系統(tǒng)軟件;編寫HelloWorld程序;理解源程序、目標程序程執(zhí)行程序的內(nèi)涵;熟練掌握編輯、編譯、連接程序的過程。一、實驗目的認識VisualC++6.0系統(tǒng)軟件;90熟悉VisualC++6.0系統(tǒng)軟件的基本使用方法;熟練掌握建立控制臺工程文件的方法,并且要知道新建文件保存的保存目錄,能夠在下次打開該工程進行編輯修改;編寫修改HelloWorld程序;編譯連接程序;執(zhí)行該程序,查看程序執(zhí)行結(jié)果;查找該程序的源程序、目標程序和可執(zhí)行程序,理解它們各自的用途;二、實驗內(nèi)容熟悉VisualC++6.0系統(tǒng)軟件的基本使用方法;二、91建立一個工程(HelloWorld)首先在D盤建立一個個人目錄;然后按下圖所示建立控制臺工程;三、實驗步驟建立一個工程(HelloWorld)三、實驗步驟92全國計算機二級考試C--教程課件93全國計算機二級考試C--教程課件94雙擊main函,進入編輯狀態(tài);三、實驗步驟雙擊main函,進入編輯狀態(tài);三、實驗步驟95全國計算機二級考試C--教程課件96全國計算機二級考試C--教程課件97編譯、連接和執(zhí)行程序三、實驗步驟編譯、連接和執(zhí)行程序三、實驗步驟98全國計算機二級考試C--教程課件99全國計算機二級考試C--教程課件100查看源程序、目標程和可執(zhí)行程序源程在HelloWorld目錄下 HelloWorld.cpp源程在HelloWorld目錄下Debug下HelloWorld.obj執(zhí)行程序HelloWorld目錄下Debug下 HelloWorld.exe三、實驗步驟查看源程序、目標程和可執(zhí)行程序三、實驗步驟1011.3C++的詞法與規(guī)則1.3.1C++的字符集數(shù)字:0,1,2,3,4,5,6,7,8,9。小寫字母:a,b,…,y,z。大寫字母:A,B,…,Y,Z。運算符:+,-,*,/,%,<,<=,=,>=,>,!=,==,<<,>>,&,|,&&,‖,∧,~,(),[],{},->,?,!,?,?:,,,;,”,#。特殊字符:(連字符或下劃線)。不可印出字符:空白格(包括空格、換行和制表符)。1.3C++的詞法與規(guī)則1.3.1C++的字符集1021.3.2詞與詞法規(guī)則1.標識符 標識符是對實體定義的一種定義符,由字母或下劃線(或連字符)開頭、后面跟字母或數(shù)字或下劃線(或空串)組成的字符序列,一般有效長度是8個字符(而ANSIC標準規(guī)定31個字符),用來標識用戶定義的常量名、變量名、函數(shù)名、文件名、數(shù)組名、和數(shù)據(jù)類型名和程序等。1.3.2詞與詞法規(guī)則1032.關(guān)鍵字 關(guān)鍵字是具有特定含義,作為專用定義符的單詞,不允許另作它用。auto break case char classconst continue default do ddefaultdelete double else enum explicitextern float for friend gotoif inline int long mutablenew operator private protectedpublic register return short signedsizeof static static_cast struct switchthis typedef union unsignedvirtualvoid while2.關(guān)鍵字1043.運算符和分隔符 運算符是C++語言實現(xiàn)加、減等各種運算的符號。 C++語言的分隔符主要是:空格、制表和換行符。4.字符串 字符串是由雙引號括起來的字符。如“China”,“C++Program”等。

5.常量 C++語言中常量包括實型常量(浮點常量)和整型常量(十進制常量、八進制常量、十六進制常量)、浮點常量、字符常量和字符串常量。

3.運算符和分隔符1056.注釋

注釋是用來幫助閱讀、理解及維護程序。在編譯時,注釋部分被忽略,不產(chǎn)生目標代碼。C++語言提供兩種注釋方式。一種是與C兼容的多行注釋,用/*和*/分界。另一種是單行注釋,以“//”開頭的表明本行中“//”符號后的內(nèi)容是注釋。如下程序:

6.注釋106例1-1:一個簡單的C++程序。

#include<iostream.h> voidmain() { cout<<”ThisismyfirstC++program.\n”;//輸出ThisismyfirstC++program. /*輸出 ThisismyfirstC++program.*/

}例1-1:一個簡單的C++程序。1071.3.3書寫格式 C++語言程序的書寫格式自由度高,靈活性強,隨意性大,如一行內(nèi)可寫一條語句,也可寫幾條語句;一個語句也可分寫在多行內(nèi)。不過應采用適當?shù)母袷綍鴮?,便于人們閱讀和理解。 為了增加程序的可讀性和利于理解,編寫程序時按如下要點書寫: (1)一般情況下每個語句占用一行。 (2)不同結(jié)構(gòu)層次的語句,從不同的起始位置開始,即在同一結(jié)構(gòu)層次中的語句,縮進同樣的字數(shù)。 (3)表示結(jié)構(gòu)層次的大括弧,寫在該結(jié)構(gòu)化語句第一個字母的下方,與結(jié)構(gòu)化語句對齊,并占用一行。 (4)適當加些空格和空行。1.3.3書寫格式1081.5C++程序的構(gòu)成 C++語言程序由以下基本部分組成。1. 函數(shù) 一個C++程序是由若干個函數(shù)構(gòu)成的。函數(shù)分為庫函數(shù)(標準函數(shù))和自定義函數(shù)。庫函數(shù)一般是由系統(tǒng)提供的。一個完整的C++語言程序只有一個主函數(shù)。2. 預處理命令 預處理命令以位于行首的符號“#”開始,C++提供的預處理有宏定義命令、文件包含命令和條件編譯命令三種。

1.5C++程序的構(gòu)成 C++語言程序由以下基本部分1093. 程序語句 一條完整的語句必須以分號“;”結(jié)束。程序語句有如下幾類:(1)說明語句 用來說明變量的類型和初值。 如下面語句是把變量說明為浮點數(shù)。 floata,b,c; 又如下面語句是把變量sum說明為整型變量,并賦初值為零。 intsum=0;3. 程序語句110(2)表達式語句 由一個表達式構(gòu)成一個語句,用以描述算術(shù)運算、邏輯運算、或產(chǎn)生某種特定動作,在任何表達式最后加一個分號就構(gòu)成了一個語句。如下例由賦值表達式加“;”就構(gòu)成一個賦值表達式語句。(3)程序控制語句 用來描述語句的執(zhí)行條件與執(zhí)行順序的語句,C++語言的控制語句有9種,如下頁所示。其語句中的括號(

)表示其中是條件,~表示內(nèi)嵌的語句。(2)表達式語句111if()~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ù)返回語句if()~else 條件語句112(4)復合語句 復合語句是一種十分重要的語句,由大括號{和}把一些說明和語句組合在一起,使它們在語法上等價于一個簡單語句;可由若干簡單語句或復合語句組成。 例如:

if(a>b) {c=a-b; d=c*a; } else {c=a+b; d=c*b; }(4)復合語句113(5)函數(shù)調(diào)用語句 函數(shù)調(diào)用語句是由一次函數(shù)調(diào)用加一個分號而構(gòu)成的一個語句。 例如: max(x,y);(6)空語句 空語句: ; 即只有分號“;”的語句,什么也不做。(5)函數(shù)調(diào)用語句114抽象和分類(例)抽象:抽象出實物的共同特點分類:根據(jù)不同的特點進行歸類面向?qū)ο蟪绦蛟O(shè)計:可讀性強,可重用性高,效率不一定高結(jié)構(gòu)化程序設(shè)計:可讀性差,重用性差,但效率高抽象和分類115Josephus問題一群小孩圍成一圈,任意假定一個數(shù)m,從第一個小孩起,順時針方向數(shù),每數(shù)到第m個小孩時,這個小孩就離開。小孩不斷離開,圈子不斷縮小。最后,剩下的一個小孩是勝利者。問勝利者是第幾個小孩?上面的問題可描述為://Josephus問題解答建立小孩結(jié)構(gòu)類型初始化小孩數(shù),開始位置,數(shù)小孩個數(shù)分配小孩結(jié)構(gòu)數(shù)組Josephus問題116for初始化結(jié)構(gòu)數(shù)組(構(gòu)成環(huán)鏈)掛接下一個數(shù)組元素小孩編號輸出編號endfor

轉(zhuǎn)到初始位置

while(小孩數(shù)多于一個)數(shù)小孩個數(shù)(一個循環(huán))出列小孩將這個小孩從中刪除endwhilefor初始化結(jié)構(gòu)數(shù)組(構(gòu)成環(huán)鏈)117輸出得勝者

結(jié)構(gòu)化方法:

結(jié)構(gòu)化方法按功能分割自頂而下,逐步細化根據(jù)描述,Josephus問題可以分為四個模塊1.初始化小孩數(shù),開始位置,數(shù)小孩數(shù);2.

初始化環(huán)鏈表(采用鏈表數(shù)據(jù)結(jié)構(gòu)來解)3.

數(shù)小孩4.

處理未獲勝的小孩。輸出得勝者118在此基礎(chǔ)上要逐步細化:第一點細化為:鍵入小孩數(shù)、開始位置、數(shù)小孩個數(shù)小孩數(shù)校驗開始位置校驗數(shù)小孩數(shù)校驗第二點細化為:分配結(jié)構(gòu)數(shù)組for初始化結(jié)構(gòu)數(shù)組(構(gòu)成環(huán)鏈)連接下一個數(shù)組元素小孩編號賦值輸出小孩編號endfor返回環(huán)鏈表

在此基礎(chǔ)上要逐步細化:119數(shù)小孩細化為:for(從1到數(shù)小孩間隔數(shù))開始位置挪到下一個小孩endfor

處理未獲勝的小孩描述為:while(小孩數(shù)多于一個)數(shù)小孩(一個循環(huán))出列小孩將這個小孩刪除endwhile數(shù)小孩細化為:120結(jié)構(gòu)化程序設(shè)計需要知道整個過程,相應的數(shù)據(jù)結(jié)構(gòu),以及算法流程

具體實現(xiàn):

#include<iostream.h>#incude<iomanip.h>

structJose//小孩結(jié)構(gòu){intcode;//小孩編號Jose*next;//下一個小孩結(jié)點};

結(jié)構(gòu)化程序設(shè)計需要知道整個過程,相應的數(shù)據(jù)結(jié)構(gòu),以及算法流程121//全局變量intn;//小孩數(shù)intbegin;//開始位置intm;//數(shù)小孩的順序個數(shù)Jose*pivot;//鏈表哨兵Jose*pCur;//當前結(jié)點指針

//函數(shù)聲明intassign();//賦初值;voidinitial(Jose*pJose);//初始化環(huán)鏈表voidcount(intm);//數(shù)小孩voidprocess();//處理所有未獲勝小孩//全局變量122//主函數(shù)voidmain(){if(!assign()){cout<<”Theprogramfailed.\n”;return;}

Jose*pJose=newJose[n];//分配結(jié)構(gòu)數(shù)組initial(pJose);//初始化結(jié)構(gòu)數(shù)組count(begin);//轉(zhuǎn)到開始位置process();//處理所有未獲勝小孩

cout<<”\nthewinneris”<<pCur->code<<endl;delete[]pJose;//釋放空間;}//主函數(shù)123//賦初值intassign(){intnumber,start,count;cout<<”pleaseinputthenumber,start,count:\n”;cin>>number>>start>>count;

if(number<3)//小孩數(shù)校驗{cerr<<”badnumberofboys\n”;return0;}//賦初值124if(start<1)//開始位置校驗{cerr<<”badbeginningposition.\n”;return0;}if(count<2||count>number)//數(shù)小孩//順序個數(shù)校驗{cerr<<”badintervalnumber.\n”;return0;}n=number;begin=start–1;m=count;//賦值return1;}

if(start<1)//開始位置校驗125//鏈表初始化voidinitial(Jose*pJose){intlineCount=0;Jose*px=pJose;

for(inti=1;i<=n;i++){px->next=pJose+i%n;px->code=i;px=px->next;

if((lineCount++%10)==0)cout<<endl;cout<<setw(4)<<i;}//鏈表初始化126cout<<endl;pCur=pJose+n–1;//指向數(shù)組最后一個元素}

//數(shù)m個小孩voidcount(intm){for(inti=0;i<m;i++){pivot=pCur;pCur=pivot->next;}}

cout<<endl;127//處理未獲勝小孩voidprocess(){intlinecount=0;for(inti=1;i<n;i++){count(m);//數(shù)小孩if((linecount++%10)==0)cout<<endl;cout<<setw(4)<<pCur->code;

pivot->next=pCur->next;//刪除小孩pCur=pivot;}}//處理未獲勝小孩128面向?qū)ο蠓椒ǔ橄蠛头诸悾捍笾麓_定類的屬性(數(shù)據(jù)成員)和方法(函數(shù)成員)

Josephus類屬性:Boynumber,BeginPos,Interval方法:Initial,GetwinnerRing類屬性:First,Pivot,Current方法:Clear,Print,Count面向?qū)ο蠓椒?29//主函數(shù)定義一個Jose類對象賦初值initial求獲勝者getwinner

面向?qū)ο蟪绦蛟O(shè)計使用戶不需要懂計算機太多,也不需要懂業(yè)務太多

面向?qū)ο蟪绦虻膶崿F(xiàn)

文件:ring.h,jose.hring.cpp,jose.cpp,jose4.cpp//主函數(shù)130/*ring.h開始*/

structBoy//小孩結(jié)構(gòu)作為鏈表結(jié)點{intcode;Boy*next;};/*ring.h開始*/131classRing//環(huán)鏈表類定義{public:Ring(intn);voidCount(intm);//數(shù)小孩voidPutBoy();//輸出當前小孩編號voidClearBoy();//刪除小孩~Ring();protected:Boy*pBegin;Boy*pivotBoy*pCurrent;};/*ring.h結(jié)束*/classRing//環(huán)鏈表類定義132/*ring.cpp開始*/

#include<iostream.h>#include<iomanip.h>#include“ring.h”

Ring::Ring(intn){pBegin=newBoy[n];pCurrent=pBegin;/*ring.cpp開始*/133for(inti=1;i<n;i++,pCurrent=pCurrent->next){pCurrent->next=pBegin+i%n;//將結(jié)點鏈起來

溫馨提示

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

評論

0/150

提交評論