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

下載本文檔

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

文檔簡介

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

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

1.2對象和類

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

1.4繼承性

1.5多態(tài)性

1.6面向?qū)ο蟪绦蛟O(shè)計(jì)語言關(guān)于課程目標(biāo)

進(jìn)一步學(xué)會(huì)面向過程編程理解面向?qū)ο笏枷胍詫ο蟮姆绞剿伎际煜++(P)利用C++編程在本課程中:C++是一個(gè)學(xué)習(xí)面向?qū)ο蟾拍畹墓ぞ哌\(yùn)用面向?qū)ο竽J竭M(jìn)行程序設(shè)計(jì)采用面向?qū)ο蠓椒ǖ男Ч?OOA/OOD)可維護(hù)性可擴(kuò)展性可靠性如何實(shí)現(xiàn)課程目標(biāo)閱讀和記憶閱讀書籍,記住語言特點(diǎn)思考以對象和類的方式思考實(shí)踐多編程參考課本C++程序設(shè)計(jì)教程(錢能),清華大學(xué)出版社C++程序設(shè)計(jì)教程,H.M.Deitel,P.J.Deitel著,機(jī)械工業(yè)出版社C++大學(xué)教程(第二版),HarveayM.Deitel著,電子工業(yè)出版社

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

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

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

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

--問題處理手段為了理解問題,需要將不必要的細(xì)節(jié)分離出去:你將構(gòu)造你自己針對問題的抽象視圖,抽象模型這個(gè)建模過程稱為抽象abstraction.問題模型抽象模型模型定義了一個(gè)抽象的視圖,該視圖只關(guān)注于與問題和求解者相關(guān)的部分。你需要定義下列屬性:影響的數(shù)據(jù);識(shí)別出來的操作;ADT就是一種模型.Interface

Operations

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

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

Data3+

Procedures3Object2Data2+

Procedures2Object4

Data4+

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

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

面向?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è)整體——類。 類是對一組具有共同的屬性特征和行為特征的對象的抽象。類(教師類) 類是邏輯上相關(guān)的函數(shù)與數(shù)據(jù)的封裝,它是對所要處理的問題的抽象描述。面向?qū)ο笳Z言必需提供的用戶定義的數(shù)據(jù)類型。 類是將具有相同狀態(tài)、操作和訪問機(jī)制的多個(gè)對象抽象而成。對象(一個(gè)教師…) 從一般意義上講,對象是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物,它可以是有形的(比如一輛汽車),也可以是無形的(比如一項(xiàng)計(jì)劃)。對象是構(gòu)成世界的一個(gè)獨(dú)立單位,它具有自己的靜態(tài)特征(狀態(tài))和動(dòng)態(tài)特征(操作)。靜態(tài)特征即可以用某種數(shù)據(jù)來描述的特征,動(dòng)態(tài)特征即對象所表現(xiàn)的行為或?qū)ο笏哂械墓δ堋?/p>

類的實(shí)體就是對象。

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

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

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

封裝

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

1.3.3對象的特性封裝性模塊獨(dú)立性動(dòng)態(tài)連接性易維護(hù)性1.4繼承性(我是誰,龍生龍..)

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

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

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

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

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

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

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

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

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

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

1.2.3鏈接 將用戶程序生成的多個(gè)目標(biāo)代碼文件(.obj)和系統(tǒng)提供的庫文件(.lib)中的某些代碼連接在一起,生成一個(gè)可執(zhí)行文件(.exe)。1.2.4執(zhí)行 把生成的可執(zhí)行文件運(yùn)行,在屏幕上顯示運(yùn)行結(jié)果。用戶可以根據(jù)運(yùn)行結(jié)果來判斷程序是否出錯(cuò)。上機(jī)說明一、實(shí)驗(yàn)?zāi)康恼J(rèn)識(shí)VisualC++6.0系統(tǒng)軟件;編寫HelloWorld程序;理解源程序、目標(biāo)程序程執(zhí)行程序的內(nèi)涵;熟練掌握編輯、編譯、連接程序的過程。熟悉VisualC++6.0系統(tǒng)軟件的基本使用方法;熟練掌握建立控制臺(tái)工程文件的方法,并且要知道新建文件保存的保存目錄,能夠在下次打開該工程進(jìn)行編輯修改;編寫修改HelloWorld程序;編譯連接程序;執(zhí)行該程序,查看程序執(zhí)行結(jié)果;查找該程序的源程序、目標(biāo)程序和可執(zhí)行程序,理解它們各自的用途;二、實(shí)驗(yàn)內(nèi)容建立一個(gè)工程(HelloWorld)首先在D盤建立一個(gè)個(gè)人目錄;然后按下圖所示建立控制臺(tái)工程;三、實(shí)驗(yàn)步驟雙擊main函,進(jìn)入編輯狀態(tài);三、實(shí)驗(yàn)步驟編譯、連接和執(zhí)行程序三、實(shí)驗(yàn)步驟查看源程序、目標(biāo)程和可執(zhí)行程序源程在HelloWorld目錄下

HelloWorld.cpp源程在HelloWorld目錄下Debug下

HelloWorld.obj執(zhí)行程序HelloWorld目錄下Debug下

HelloWorld.exe三、實(shí)驗(yàn)步驟1.3C++的詞法與規(guī)則1.3.1C++的字符集數(shù)字:0,1,2,3,4,5,6,7,8,9。小寫字母:a,b,…,y,z。大寫字母:A,B,…,Y,Z。運(yùn)算符:+,-,*,/,%,<,<=,=,>=,>,!=,==,<<,>>,&,|,&&,‖,∧,~,(),[],{},->,?,!,?,?:,,,;,”,#。特殊字符:(連字符或下劃線)。不可印出字符:空白格(包括空格、換行和制表符)。1.3.2詞與詞法規(guī)則1.標(biāo)識(shí)符 標(biāo)識(shí)符是對實(shí)體定義的一種定義符,由字母或下劃線(或連字符)開頭、后面跟字母或數(shù)字或下劃線(或空串)組成的字符序列,一般有效長度是8個(gè)字符(而ANSIC標(biāo)準(zhǔn)規(guī)定31個(gè)字符),用來標(biāo)識(shí)用戶定義的常量名、變量名、函數(shù)名、文件名、數(shù)組名、和數(shù)據(jù)類型名和程序等。2.關(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 while3.運(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)常量、字符常量和字符串常量。

6.注釋

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

例1-1:一個(gè)簡單的C++程序。

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

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

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

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

if(a>b) {c=a-b; d=c*a; } else {c=a+b; d=c*b; }(5)函數(shù)調(diào)用語句 函數(shù)調(diào)用語句是由一次函數(shù)調(diào)用加一個(gè)分號(hào)而構(gòu)成的一個(gè)語句。 例如: max(x,y);(6)空語句 空語句: ; 即只有分號(hào)“;”的語句,什么也不做。抽象和分類(例)抽象:抽象出實(shí)物的共同特點(diǎn)分類:根據(jù)不同的特點(diǎn)進(jìn)行歸類面向?qū)ο蟪绦蛟O(shè)計(jì):可讀性強(qiáng),可重用性高,效率不一定高結(jié)構(gòu)化程序設(shè)計(jì):可讀性差,重用性差,但效率高Josephus問題一群小孩圍成一圈,任意假定一個(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ù)組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))出列小孩將這個(gè)小孩從中刪除endwhile輸出得勝者

結(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.

處理未獲勝的小孩。在此基礎(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)鏈表

數(shù)小孩細(xì)化為:for(從1到數(shù)小孩間隔數(shù))開始位置挪到下一個(gè)小孩endfor

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

具體實(shí)現(xiàn):

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

structJose//小孩結(jié)構(gòu){intcode;//小孩編號(hào)Jose*next;//下一個(gè)小孩結(jié)點(diǎn)};

//全局變量intn;//小孩數(shù)intbegin;//開始位置intm;//數(shù)小孩的順序個(gè)數(shù)Jose*pivot;//鏈表哨兵Jose*pCur;//當(dāng)前結(jié)點(diǎn)指針

//函數(shù)聲明intassign();//賦初值;voidinitial(Jose*pJose);//初始化環(huán)鏈表voidcount(intm);//數(shù)小孩voidprocess();//處理所有未獲勝小孩//主函數(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;//釋放空間;}//賦初值intassign(){intnumber,start,count;cout<<”pleaseinputthenumber,start,count:\n”;cin>>number>>start>>count;

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

//鏈表初始化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;}cout<<endl;pCur=pJose+n–1;//指向數(shù)組最后一個(gè)元素}

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

//處理未獲勝小孩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;}}面向?qū)ο蠓椒ǔ橄蠛头诸悾捍笾麓_定類的屬性(數(shù)據(jù)成員)和方法(函數(shù)成員)

Josephus類屬性:Boynumber,BeginPos,Interval方法:Initial,GetwinnerRing類屬性:First,Pivot,Current方法:Clear,Print,Count//主函數(shù)定義一個(gè)Jose類對象賦初值initial求獲勝者getwinner

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

面向?qū)ο蟪绦虻膶?shí)現(xiàn)

文件:ring.h,jose.hring.cpp,jose.cpp,jose4.cpp/*ring.h開始*/

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

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

Ring::Ring(intn){pBegin=newBoy[n];pCurrent=pBegin;for(inti=1;i<n;i++,pCurrent=pCurrent->next){pCurrent->next=pBegin+i%n;//將結(jié)點(diǎn)鏈起來pCurrent->code=i;//小孩編號(hào)PutBoy();}cout<<endl;pCurrent=&pBe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論