面向?qū)ο蟪绦蛟O(shè)計(jì) 試卷及答案 試卷B_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì) 試卷及答案 試卷B_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì) 試卷及答案 試卷B_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì) 試卷及答案 試卷B_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì) 試卷及答案 試卷B_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο蟪绦蛟O(shè)計(jì)試卷第1頁(yè)(共4頁(yè))PAGE6試題編號(hào):學(xué)年第二學(xué)期(試卷)面向?qū)ο蟪绦蛟O(shè)計(jì)(期末)(B卷)(開(kāi)卷)一、讀程題(本大題共5小題,每小題10分,共50分)程序1:#include<iostream>usingnamespacestd;classTdate{public: Tdate(intd,intm,inty) { cout<<"構(gòu)造"<<endl; day=d; month=m; year=y; }; Tdate(constTdate&oldTdate) { cout<<"拷貝構(gòu)造"<<endl; memcpy(this,&oldTdate,sizeof(Tdate)); }; ~Tdate(){};private: intday; intmonth; intyear;};intmain(){ Tdated1(1,2,2000); Tdated2(d1);}1、依據(jù)程序1的描述畫出Tdate類圖;2、依據(jù)程序1的描述畫出d1對(duì)象圖;3、根據(jù)該程序描述畫出程序運(yùn)行的時(shí)序圖;程序2:#include<iostream>usingnamespacestd;classCurrency{public: Currency&operator++(); Currencyoperator++(inti); operatordouble(); Currency&operator=(Currencyv); Currencyoperator+(Currencyb); Currencyoperator*(intb); Currency(inty,intf); Currency(doubled); Currency(); virtual~Currency(); virtualostream&print(ostream&out); virtualistream&input(istream&inp);protected: unsignedintyuan; unsignedintfen;};//Currency的實(shí)現(xiàn)代碼略classEuro:publicCurrency{public: Euro&operator=(constCurrency&v); ostream&print(ostream&out); Euro(inty,intf); Euro(doubled); Euro();};//Euro的實(shí)現(xiàn)代碼略intmain(){ constdoubled=2.34; Euror1(1,23),r2(d),r3; cout<<"r1:\t"; r1.print(cout); cout<<endl<<"r2:\t"<<r2; r3=r2; cout<<endl<<"r3=r2:\t"<<r3; r1++; cout<<endl<<"r1++:\t"<<r1; ++r2; cout<<endl<<"++r2:\t"<<r2; r3=r1+r2; cout<<endl<<"r3=r1+r2:\t"<<r3; r3=r1*3; cout<<endl<<"r3=r1*3:\t"<<r3; /*cout<<endl<<"按照元分的格式輸入:"<<endl; cin>>r3; cout<<"輸出:\t"<<r3;*/ cout<<endl<<int(1.6)<<endl; cout<<endl<<(int)1.6<<endl;};4、表達(dá)式語(yǔ)句r3=r1+r2中,調(diào)用了Currency和Euro中的哪些成員函數(shù)或重載的運(yùn)算?5、使用計(jì)算順序圖描述表達(dá)式r3=r1+r2中的計(jì)算順序及運(yùn)算結(jié)果。、二、編程題(本大題共3小題,每小題10分,共30分)根據(jù)下面的類圖:1、寫出拷貝構(gòu)造函數(shù)Tdate(constTdate&oldTdate)的實(shí)現(xiàn)代碼,且不能使用memcpy()等庫(kù)函數(shù);2、重載Tdate的賦值運(yùn)算;3、該設(shè)計(jì)使用指針實(shí)現(xiàn)Person到Tdate的組合關(guān)聯(lián),請(qǐng)先描述組合關(guān)聯(lián)的語(yǔ)義,然后編寫構(gòu)造函數(shù)Person(charn[],Tdated)和析構(gòu)函數(shù)~Person()的實(shí)現(xiàn)代碼,并保證使用構(gòu)造函數(shù)時(shí)不會(huì)發(fā)生運(yùn)行錯(cuò)誤。三、開(kāi)發(fā)步驟及任務(wù)(本大題共2小題,每小題10分,共20分)1、列出兩種編碼實(shí)現(xiàn)技術(shù),并舉例說(shuō)明其作用。 注:編碼實(shí)現(xiàn)技術(shù)要具體,不能是面向?qū)ο蠹夹g(shù)等抽象程度很高的技術(shù),而應(yīng)是其中包含的具體技術(shù),如繼承、多態(tài)、模板等。2、閱讀教材【2.5應(yīng)用舉例:?jiǎn)T工信息管理】,簡(jiǎn)述主要開(kāi)發(fā)步驟以及每個(gè)步驟完成的主要任務(wù)。試題編號(hào):學(xué)年第二學(xué)期(試卷)面向?qū)ο蟪绦蛟O(shè)計(jì)(期末)(B卷)(開(kāi)卷)一、讀程題(本大題共5小題,每小題10分,共50分)程序1:#include<iostream>usingnamespacestd;classTdate{public: Tdate(intd,intm,inty) { cout<<"構(gòu)造"<<endl; day=d; month=m; year=y; }; Tdate(constTdate&oldTdate) { cout<<"拷貝構(gòu)造"<<endl; memcpy(this,&oldTdate,sizeof(Tdate)); }; ~Tdate(){};private: intday; intmonth; intyear;};intmain(){ Tdated1(1,2,2000); Tdated2(d1);}4分1、畫出Tdate類圖;4分3分3分3分3分對(duì)象名3分,冒號(hào)1分對(duì)象名3分,冒號(hào)1分,類名3分3分3分3、畫出運(yùn)行時(shí)序圖;d1和d2前后位置正確2分;d1和d2前后位置正確2分;d1定義在main()內(nèi)部1分;d1分配內(nèi)存和調(diào)用構(gòu)造函數(shù)的消息正確1分;d1對(duì)象描述正確1分;d1調(diào)用析構(gòu)函數(shù)的消息正確1分;d2計(jì)分同d1。程序2:#include<iostream>usingnamespacestd;classCurrency{public: Currency&operator++(); Currencyoperator++(inti); operatordouble(); Currency&operator=(constCurrency&v); Currencyoperator+(Currencyb); Currencyoperator*(intb); Currency(inty,intf); Currency(doubled); Currency(); virtual~Currency(); virtualostream&print(ostream&out); virtualistream&input(istream&inp);protected: unsignedintyuan; unsignedintfen;};//Currency的實(shí)現(xiàn)代碼略classEuro:publicCurrency{public: Euro&operator=(constCurrency&v); ostream&print(ostream&out); Euro(inty,intf); Euro(doubled); Euro();};//Euro的實(shí)現(xiàn)代碼略intmain(){ constdoubled=2.34; Euror1(1,23),r2(d),r3; cout<<"r1:\t"; r1.print(cout); cout<<endl<<"r2:\t"<<r2; r3=r2; cout<<endl<<"r3=r2:\t"<<r3; r1++; cout<<endl<<"r1++:\t"<<r1; ++r2; cout<<endl<<"++r2:\t"<<r2; r3=r1+r2; cout<<endl<<"r3=r1+r2:\t"<<r3; r3=r1*3; cout<<endl<<"r3=r1*3:\t"<<r3; /*cout<<endl<<"按照元分的格式輸入:"<<endl; cin>>r3; cout<<"輸出:\t"<<r3;*/ cout<<endl<<int(1.6)<<endl; cout<<endl<<(int)1.6<<endl;};酌情給分酌情給分 1、CurrencyCurrency::operator+(Currencyb),由r1+r2的+運(yùn)算符調(diào)用; 2、Currency::Currency(constCurrency&oldCurrency),由r1+r2調(diào)用CurrencyCurrency::operator+(Currencyb)時(shí),實(shí)參r2拷貝到形參b的空間時(shí)調(diào)用,實(shí)際調(diào)用時(shí)間在CurrencyCurrency::operator+(Currencyb)之前; 3、Currency::Currency(inty,intf),由CurrencyCurrency::operator+(Currencyb)中代碼returnCurrency(y,f%100)調(diào)用,構(gòu)造一個(gè)用于返回的臨時(shí)對(duì)象; 4、Currency::~Currency(),CurrencyCurrency::operator+(Currencyb)結(jié)束時(shí),形參b被析構(gòu)時(shí)調(diào)用; 5、Euro&Euro::operator=(constCurrency&v),由r3=r1+r2的賦值運(yùn)算符調(diào)用; 6、Currency&Currency::operator=(constCurrency&v),由Euro&Euro::operator=(constCurrency&v)中代碼*((Currency*)this)=v調(diào)用; 7、Currency::~Currency(),由r3=r1+r2賦值結(jié)束后,析構(gòu)r1+r2返回的臨時(shí)對(duì)象。5、使用計(jì)算順序圖描述表達(dá)式r3=r1+r2中的計(jì)算順序及運(yùn)算結(jié)果。5個(gè)步驟的計(jì)算順序各1分5個(gè)步驟的計(jì)算順序各1分;5個(gè)步驟的計(jì)算結(jié)果各1分。二、編程題(本大題共3小題,每小題10分,共30分)根據(jù)下面的類圖:類作用域3分類作用域3分,構(gòu)造函數(shù)1分Tdate::Tdate(constTdate&oldTdate){每項(xiàng)2分每項(xiàng)2分 month=oldTdate.month; year=oldTdate.year;}2、重載Tdate的賦值運(yùn)算;返回2分,重載語(yǔ)法2返回2分,重載語(yǔ)法2分,參數(shù)2分屬性賦值2分屬性賦值2分,返回2分 month=v.month; year=v.year; return*this;}3、該設(shè)計(jì)使用指針實(shí)現(xiàn)Person到Tdate的組合關(guān)聯(lián),請(qǐng)先描述組合關(guān)聯(lián)的語(yǔ)義,然后編寫構(gòu)造函數(shù)Person(charn[],Tdated)和析構(gòu)函數(shù)~Person()的實(shí)現(xiàn)代碼,并保證使用構(gòu)造函數(shù)時(shí)不會(huì)發(fā)生運(yùn)行錯(cuò)誤。2分 面向?qū)ο蟪绦蛟O(shè)計(jì)中,組合關(guān)聯(lián)是描述“整體”與“部分”之間的構(gòu)成關(guān)系,組合關(guān)系中部分和整體具有相同生命周期。一旦整體對(duì)象不存在,部分對(duì)象也將不存在。2分 構(gòu)造函數(shù)Person(charn[],Tdated)實(shí)現(xiàn)代碼:Person(constcharn[],Tdated){6分,每6分,每行2分 name[sizeof(name)-1]='\0'; birthday=newTdate(d);} 析構(gòu)函數(shù)~Person()實(shí)現(xiàn)代碼:2分~Person(){2分 deletebirthday;}三、開(kāi)發(fā)步驟及任務(wù)(本大題共2小題,每小題10分,共20分)1、列出兩種編碼實(shí)現(xiàn)技術(shù),并舉例說(shuō)明其作用。酌情給分酌情給分繼承: 繼承是面向?qū)ο笏枷胫兄匾拍?,用于描述事物類別之間的包含關(guān)系,表示一個(gè)類所代表的集合包含另一個(gè)類所代表的集合。 在一個(gè)繼承關(guān)系中將代表母集的類稱為父類(ParentClass),代表子集的類稱為子類(ChildClass),將父類到子類稱為繼承。 繼承最主要的作用就是解決代碼冗余問(wèn)題,實(shí)現(xiàn)代碼重用,增加軟件的可擴(kuò)充性。 圖中,主要聲明了4個(gè)類及其繼承關(guān)系,其中,類GraduateStudent繼承于類Student,類Student和Teacher繼承于類Person,重用了類Person及其兩個(gè)關(guān)聯(lián)類Tdate和myString的代碼。其中,name、birthday、sex等重復(fù)的屬性和print()等功能相同的方法,只需要在基類Person中定義和實(shí)現(xiàn),減少了代碼冗余。 類GraduateStudent中,只調(diào)用了Student和Teacher的成員函數(shù),代碼中沒(méi)有出現(xiàn)類Person的信息,好像類Person不存在一樣。 這個(gè)特點(diǎn)非常有價(jià)值,能減少編程中涉及到的知識(shí),也能少打些代碼。這正好符合面向?qū)ο蟪绦蛟O(shè)計(jì)追求的目標(biāo),將程序員從細(xì)節(jié)中解脫出來(lái),而將更多精力用于解決實(shí)際問(wèn)題。多態(tài): 多態(tài)可以理解成“一個(gè)接口,多種實(shí)現(xiàn)”,就是同一種事物表現(xiàn)出的多種形態(tài),多態(tài)是面向?qū)ο笏枷胫兄匾拍?,主要是用?lái)實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編的。 多態(tài)把不同的子類對(duì)象都當(dāng)作父類來(lái)看,可以屏蔽不同子類對(duì)象之間的差異,寫出通用的代碼。即不用關(guān)心某個(gè)對(duì)象到底是什么具體類型,就可以使用該對(duì)象的某些方法,從而實(shí)現(xiàn)更加靈活的編程,提高系統(tǒng)的可擴(kuò)展性。 構(gòu)成多態(tài)的必要條件有3點(diǎn):存在繼承關(guān)系;基類存在虛函數(shù),且在派生類中被覆寫;存在基類類型的指針或者引用指向派生類對(duì)象。 上圖中,類Circle和Rectangle繼承于類Shape,類Shape的對(duì)象中可存儲(chǔ)一個(gè)點(diǎn)的坐標(biāo),類Circle的對(duì)象包含了圓的半徑以及父類對(duì)象中的點(diǎn),類Rectangle的對(duì)象中包含兩個(gè)點(diǎn)的坐標(biāo)。根據(jù)類Circle和Rectangle的對(duì)象中存儲(chǔ)的數(shù)據(jù),可計(jì)算圖形的面積。voidcompute(constShape&sp){ cout<<sp.area()<<endl;}intmain(){ Circlec(2.0,5.0,4.0); compute(c); Rectanglet(2.0,4.0,1.0,2.0); compute(t);} 程序中,有三個(gè)計(jì)算面積的area()成員函數(shù),但從compute()函數(shù)的視角,就只有一個(gè)計(jì)算面積的area()函數(shù),而不關(guān)心調(diào)用的是哪個(gè)area()函數(shù),更不關(guān)心是怎樣計(jì)算的。這個(gè)特點(diǎn)能讓area()函數(shù)的使用者省事省心。如果再增加一種圖形,area()函數(shù)的使用者也不必修改進(jìn)行高層計(jì)算的代碼。模板: 模板是抽象層次更高、重用性更好的一種編程技術(shù),代表了編程技術(shù)的一個(gè)主要發(fā)展方向。模板分為類模板(classtemplate)和函數(shù)模板(functiontemplate)。 采用模板編程,可以為各種邏輯功能相同而數(shù)據(jù)類型不同的程序提供一種代碼共享的機(jī)制,即將數(shù)據(jù)類型作為參數(shù)傳遞,這樣就不需要為不同的數(shù)據(jù)類型編寫相同的代碼。 以類模板為例,類是對(duì)某類事物的抽象,用于描述該類事物的共同屬性和行為,而類模板是對(duì)類的抽象,用于描述多個(gè)類的共同屬性和行為。 比如定義一個(gè)復(fù)數(shù)類Complex,使用類的兩個(gè)屬性分別存儲(chǔ)復(fù)數(shù)的兩個(gè)分量a和b。如果對(duì)精度要求不高,可選擇float類型存儲(chǔ)復(fù)數(shù)的兩個(gè)分量,其聲明代碼如下:classComplex_float{ floata; floatb;}; 如果對(duì)精度要求較高,可選擇double類型存儲(chǔ)復(fù)數(shù)的兩個(gè)分量,其聲明代碼如下:classComplex_double{ doublea; doubleb;}; 上面聲明的兩個(gè)類Complex_float和Complex_double都表示數(shù)學(xué)中的復(fù)數(shù),但需要分別為兩個(gè)類編寫復(fù)數(shù)運(yùn)算的實(shí)現(xiàn)代碼,使用類模板則可以用一種表達(dá)方法同時(shí)聲明這兩個(gè)類,以減少編寫工作量。 使用類模板Complex描述復(fù)數(shù),其聲明代碼如下:template<classT>classComplex{ Ta; Tb;}; 在程序中可以使用任意的類作為實(shí)際參數(shù)替換參數(shù)T,例如用float,在預(yù)編譯時(shí)將類模板代碼中的所有T替換為float,生成一個(gè)類Complex<float>,聲明代碼如下:classComplex<float>{ floata; floatb;}; 如果對(duì)精度要求較高,可使用double類型替換類模板Complex中的模板參數(shù)T,在預(yù)編譯時(shí)生成另一個(gè)類Complex<double>,其聲明代碼如下:classComplex<double>{ doublea; doubleb;}; 類Co

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論