《C面向?qū)ο蟪绦蛟O(shè)計(jì)》習(xí)題與上機(jī)解答-提交稿
《《C面向?qū)ο蟪绦蛟O(shè)計(jì)》習(xí)題與上機(jī)解答-提交稿》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《《C面向?qū)ο蟪绦蛟O(shè)計(jì)》習(xí)題與上機(jī)解答-提交稿(98頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》 習(xí)題與上機(jī)實(shí)驗(yàn)題解答 陳維興 陳昕 編著 人民郵電出版社 目 錄 第1章 面向?qū)ο蠓椒ǜ攀? 1.1 習(xí)題參考解答 第2章 C++的初步知識(shí) 2.1 習(xí)題參考解答 2.2 上機(jī)實(shí)驗(yàn)題參考解答 第3章 類(lèi)和對(duì)象 3.1 習(xí)題參考解答 3.2 上機(jī)實(shí)驗(yàn)題參考解答 第4章 類(lèi)和對(duì)象的進(jìn)一步討論 4.1 習(xí)題參考解答 4.2 上機(jī)實(shí)驗(yàn)題參考解答
2、 第5章 繼承與派生 5.1 習(xí)題參考解答 5.2 上機(jī)實(shí)驗(yàn)題參考解答 第6章 多態(tài)性與虛函數(shù) 6.1 習(xí)題與參考解答 6.2 上機(jī)實(shí)驗(yàn)題與參考解答 第7章 運(yùn)算符重載 7.1 習(xí)題參考解答 7.2 上機(jī)實(shí)驗(yàn)題參考解答 第8章 模板 8.1 習(xí)題參考解答 8.2 上機(jī)實(shí)驗(yàn)題參考解答 第9章 C++的輸入和輸出 9.1 習(xí)題參考解答 9.2 上機(jī)實(shí)驗(yàn)題參考解答 第10章 異常處理和命名空間 10.1 習(xí)題參考解答 10.2 上機(jī)實(shí)驗(yàn)題參考解答 第11章 綜合設(shè)計(jì)與實(shí)現(xiàn) 11.1 習(xí)題參考解答 11.2 上機(jī)實(shí)驗(yàn)題參考解答
3、 第1章 面向?qū)ο蠓椒ǜ攀? 1.1 習(xí)題參考解答 【1.1】 【解】 面向過(guò)程程序設(shè)計(jì)的主要特征是:程序由過(guò)程定義和過(guò)程調(diào)用組成(所謂過(guò)程,簡(jiǎn)單地說(shuō),就是程序執(zhí)行某項(xiàng)操作的一段代碼,函數(shù)是最常用的過(guò)程。),從這個(gè)意義出發(fā), 基于面向過(guò)程的程序可以用以下的公式來(lái)表述: 程序 = 過(guò)程 + 調(diào)用 【1.2】 【解】 面向過(guò)程程序設(shè)計(jì)中普遍采用的優(yōu)化方法是使用結(jié)構(gòu)化程序設(shè)計(jì)方法,其局限性至少有以下幾個(gè)方面: (1) 面向過(guò)程程序設(shè)計(jì)方法開(kāi)發(fā)軟件的生產(chǎn)效率低下 (2) 面向過(guò)程程序設(shè)計(jì)方法難以應(yīng)付日益龐大的信息量和多樣的信息類(lèi)型 (3) 面向過(guò)程程序設(shè)計(jì)方
4、法難以適應(yīng)各種新環(huán)境 【1.3】 【解】 面向?qū)ο蟪绦蛟O(shè)計(jì)是一種新的程序設(shè)計(jì)范型。這種范型的主要特征是: 程序 = 對(duì)象 + 消息 對(duì)于面向?qū)ο蟮某绦蛟O(shè)計(jì),程序員注重的是類(lèi)的設(shè)計(jì)和編寫(xiě),即問(wèn)題域中涉及幾個(gè)類(lèi),各個(gè)類(lèi)之間的關(guān)系如何,每個(gè)類(lèi)包含哪些數(shù)據(jù)和函數(shù)(操作代碼),再由類(lèi)生成其對(duì)象。程序中的一切操作都是通過(guò)向?qū)ο蟀l(fā)送消息來(lái)實(shí)現(xiàn)的,對(duì)象接收到消息后,啟動(dòng)有關(guān)方法(通過(guò)成員函數(shù))完成相應(yīng)的操作。 【1.4】 【解】 現(xiàn)實(shí)世界中的對(duì)象,具有以下特性: (1) 有一個(gè)名字:每一個(gè)對(duì)象必須有一個(gè)名字,稱(chēng)為對(duì)象名,以區(qū)別于其他對(duì)象; (2) 有一組屬性:用屬性來(lái)描述它的某
5、些特征,一般可以用數(shù)據(jù)來(lái)表示,所有的屬性都有值; (3) 有一組行為: 對(duì)象的行為或功能也稱(chēng)為方法,一般用一組操作來(lái)描述; (4) 有一組接口:除施加于對(duì)象內(nèi)部的操作外,對(duì)象還提供了一組公有操作用于與外界接口,從而可以與其他對(duì)象建立關(guān)系。 【1.5】 【解】 在面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)象是描述其屬性的數(shù)據(jù)以及對(duì)這些數(shù)據(jù)施加的一組操作封裝在一起構(gòu)成的統(tǒng)一體?!邦?lèi)”就是具有相同的數(shù)據(jù)(屬性)和相同的操作代碼(函數(shù))的一組對(duì)象的集合。 類(lèi)和對(duì)象之間的關(guān)系是抽象和具體的關(guān)系。類(lèi)是多個(gè)對(duì)象進(jìn)行綜合抽象的結(jié)果,一個(gè)對(duì)象是類(lèi)的一個(gè)實(shí)例。 【1.6】 什么是消息? 【解】 面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)
6、必須提供一種機(jī)制允許一個(gè)對(duì)象與另一個(gè)對(duì)象的交互。這種機(jī)制叫消息傳遞。一個(gè)對(duì)象向另一個(gè)對(duì)象發(fā)出的請(qǐng)求被稱(chēng)為“消息”。 【1.7】 【解】 在面向?qū)ο蟪绦蛟O(shè)計(jì)中的消息傳遞實(shí)際是對(duì)現(xiàn)實(shí)世界中的信息傳遞的直接模擬。調(diào)用對(duì)象中的函數(shù)就是向該對(duì)象傳送一個(gè)消息,要求該對(duì)象實(shí)現(xiàn)某一行為(功能)。對(duì)象所能實(shí)現(xiàn)的行為(功能),在程序設(shè)計(jì)方法中稱(chēng)為方法,它們是通過(guò)調(diào)用相應(yīng)的函數(shù)來(lái)實(shí)現(xiàn)的,在C++語(yǔ)言中方法是通過(guò)成員函數(shù)來(lái)實(shí)現(xiàn)的。 【1.8】 【解】 在面向?qū)ο蟪绦蛟O(shè)計(jì)中,抽象是通過(guò)特定的實(shí)例(對(duì)象)抽取共同特性后形成概念的過(guò)程。C和C++中的數(shù)據(jù)類(lèi)型就是對(duì)一批具體的數(shù)的抽象。例如,“整型數(shù)據(jù)”是對(duì)所
7、有整數(shù)的抽象。 封裝是面向?qū)ο蟪绦蛟O(shè)計(jì)方法的一個(gè)重要特性,所謂封裝具有兩方面的含義:一是將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個(gè)對(duì)象中,各個(gè)對(duì)象相對(duì)獨(dú)立、相不干擾。二是將對(duì)象中某些數(shù)據(jù)與操作代碼對(duì)外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消息。這種對(duì)外界隱蔽的做法稱(chēng)為信息隱蔽。信息隱蔽有利于數(shù)據(jù)安全,防止無(wú)關(guān)人員訪(fǎng)問(wèn)和修改數(shù)據(jù)。 【1.9】 【解】 以面向?qū)ο蟪绦蛟O(shè)計(jì)的觀點(diǎn),繼承所表達(dá)的是類(lèi)之間相關(guān)的關(guān)系。這種關(guān)系使得某一類(lèi)可以繼承另外一個(gè)類(lèi)的特征和能力。 若類(lèi)之間具有繼承關(guān)系,則它們之間具有下列幾個(gè)特性: (1) 類(lèi)間具有共享特征(包括數(shù)據(jù)和操作代碼的
8、共享); (2) 類(lèi)間具有差別或新增部分(包括非共享的數(shù)據(jù)和操作代碼); (3) 類(lèi)間具有層次結(jié)構(gòu)。 【1.10】 【解】 從繼承源來(lái)分,繼承分為單繼承和多繼承。 單繼承是指每個(gè)派生類(lèi)只直接繼承了一個(gè)基類(lèi)的特征。例如,圖1.1表示了一種單繼承關(guān)系。它表示W(wǎng)indows操作系統(tǒng)的窗口之間的繼承關(guān)系。 窗口 對(duì)話(huà)窗口 編輯窗口 圖1.1 單繼承示意圖 多繼承是指多個(gè)基類(lèi)派生出一個(gè)派生類(lèi)的繼承關(guān)系。多繼承的派生類(lèi)直接繼承了不止一個(gè)基類(lèi)的特征。例如,小孩喜歡的玩具車(chē)即繼承了車(chē)的一些特性,
9、還繼承了玩具的一些特征。如圖1.2所示。 車(chē) 玩具 玩具車(chē) 圖1.2 多繼承示意圖 【1.11】 【解】 多態(tài)性是面向?qū)ο蟪绦虻闹匾卣?。多態(tài)性是指不同的對(duì)象收到相同的的消息時(shí)執(zhí)行不同的操作。例如,我們同樣雙擊Window系統(tǒng)桌面上的圖標(biāo)時(shí),有的是打開(kāi)多媒體播放器,有的是打開(kāi)資源管理器。 多態(tài)性增強(qiáng)了軟件的靈活性和重用性,為軟件的開(kāi)發(fā)與維護(hù)提供了極大的便利。尤其是采用了虛函數(shù)和動(dòng)態(tài)聯(lián)編機(jī)制后,允許用戶(hù)以更為明確、易懂的方式去建立通用的軟件。 【1.12】 【解】 面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)主要包括以下幾個(gè)方面: (1) 可提高程序的重
10、用性 面向?qū)ο蟪绦蛟O(shè)計(jì)方法能比較好地解決軟件重用的問(wèn)題。對(duì)象所固有的封裝性和信息隱藏等機(jī)理,使得對(duì)象內(nèi)部的實(shí)現(xiàn)與外界隔離,具有較強(qiáng)的獨(dú)立性,它可以作為一個(gè)大粒度的程序構(gòu)件,供同類(lèi)程序直接使用。 有兩種方法可以重復(fù)使用一個(gè)對(duì)象類(lèi):一種方法是建立在各種環(huán)境下都能使用的類(lèi)庫(kù),供相關(guān)程序直接使用;另一種方法是從它派生出一個(gè)滿(mǎn)足當(dāng)前需要的新類(lèi)。繼承性機(jī)制使得子類(lèi)不僅可以重用其父類(lèi)的數(shù)據(jù)和程序代碼,而且可以在父類(lèi)代碼的基礎(chǔ)上方便地修改和擴(kuò)充,這種修改并不影響對(duì)原有類(lèi)的使用。 (2) 可控制程序的復(fù)雜性 面向?qū)ο蟪绦蛟O(shè)計(jì)方法采用了封裝和信息隱藏技術(shù),把數(shù)據(jù)及對(duì)數(shù)據(jù)的操作放在一個(gè)個(gè)類(lèi)中,作為相互依存、
11、不可分割的整體來(lái)處理。這樣,在程序中任何要訪(fǎng)問(wèn)這些數(shù)據(jù)的地方都只需簡(jiǎn)單地通過(guò)傳遞信息和調(diào)用方法來(lái)進(jìn)行,這就有效地控制了程序的復(fù)雜性。 (3) 可改善程序的可維護(hù)性 在面向?qū)ο蟪绦蛟O(shè)計(jì)方法中,對(duì)對(duì)象的操作只能通過(guò)消息傳遞來(lái)實(shí)現(xiàn),所以只要消息模式即對(duì)應(yīng)的方法界面不變,方法體的任何修改不會(huì)導(dǎo)致發(fā)送消息的程序修改,這顯然對(duì)程序的維護(hù)帶來(lái)了方便。另外,類(lèi)的封裝和信息隱藏機(jī)制使得外界對(duì)其中的數(shù)據(jù)和程序代碼的非法操作成為不可能,這也就大大地減少了程序的錯(cuò)誤率。 (4) 能夠更好地支持大型程序設(shè)計(jì) 類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型,所以類(lèi)作為一個(gè)程序模塊,要比通常的子程序的獨(dú)立性強(qiáng)的多,面向?qū)ο蠹夹g(shù)在數(shù)據(jù)抽象上
12、又引入了動(dòng)態(tài)連接和繼承性等機(jī)制,進(jìn)一步發(fā)展了基于數(shù)據(jù)抽象的模塊化設(shè)計(jì),使其更好地支持大型程序設(shè)計(jì)。 (5) 增強(qiáng)了計(jì)算機(jī)處理信息的范圍 面向?qū)ο蟪绦蛟O(shè)計(jì)方法把描述事物靜態(tài)屬性的數(shù)據(jù)結(jié)構(gòu)和表示事物動(dòng)態(tài)行為的操作放在一起構(gòu)成一個(gè)整體,完整地、自然地表示客觀世界中的實(shí)體。用類(lèi)來(lái)直接描述現(xiàn)實(shí)世界中的類(lèi)型,可使計(jì)算機(jī)系統(tǒng)的描述和處理對(duì)象從數(shù)據(jù)擴(kuò)展到現(xiàn)實(shí)世界和思維世界的各種事物,這實(shí)際上大大擴(kuò)展了計(jì)算機(jī)系統(tǒng)處理的信息量和信息類(lèi)型。 第2章 C++的初步知識(shí) 2.1 習(xí)題參考解答 【2.1】 【解】 C++語(yǔ)言的主要特點(diǎn)表現(xiàn)在兩個(gè)方面,一是全面兼容C,并對(duì)C的功能作了不少擴(kuò)允,
13、二是增加了面向?qū)ο蟮臋C(jī)制。具體表現(xiàn)為: (1) C++是C的超集,C++保持與C的兼容,這就使許多C代碼不經(jīng)修改就可以為C++所用,用C編寫(xiě)的眾多的庫(kù)函數(shù)和實(shí)用軟件基本上可以不加修改地用于C++。 (2) C++ 是一個(gè)更好的C,它保持了C的簡(jiǎn)潔、高效和接近匯編語(yǔ)言等特點(diǎn),并對(duì)C的功能作了不少擴(kuò)允。用C++編寫(xiě)的程序比C更安全,可讀性更好,代碼結(jié)構(gòu)更為合理。 (3) 用C++編寫(xiě)的程序質(zhì)量高,從開(kāi)發(fā)時(shí)間、費(fèi)用到形成的軟件的可重用性、可擴(kuò)充性、可維護(hù)性和可靠性等方面有了很大的提高,使得大中型的程序開(kāi)發(fā)變得更加容易。 (4) 增加了面向?qū)ο蟮臋C(jī)制, C++幾乎支持所有的面問(wèn)對(duì)象程序設(shè)計(jì)特征
14、,體現(xiàn)了近20年來(lái)在程序設(shè)計(jì)和軟件開(kāi)發(fā)領(lǐng)域出現(xiàn)的新思想和新技術(shù)。
C++語(yǔ)言最有意義的方面是支持面向?qū)ο蟮奶卣?然而,由于C++與C保持兼容,使得C++不是一個(gè)純正的面向?qū)ο蟮恼Z(yǔ)言,C++既可用于面向過(guò)程的結(jié)構(gòu)化程序設(shè)計(jì),也可用于面向?qū)ο蟮某绦蛟O(shè)計(jì)。
【2.2】
【解】
#include
15、 //定義函數(shù)circle { return 3.14*r*r; } double triangle(double h,double w) //定義函數(shù)triangle { return 0.5*h*w; } int main() //定義主函數(shù)main { double r,h,w; double cs,ts; cout<<"Input r,h,w:"; cin>>r>>h>>w; //輸入圓的半徑和三角形
16、高和底的值
cs= circle(r); //調(diào)用函數(shù)circle
ts= triangle(h,w); //調(diào)用函數(shù)triangle
cout<<"The area of circle is: "< 17、circle is: 314
The area of triangle is:100
【2.3】
【解】B
【2.4】
【解】C
【2.5】
【解】C
【2.6】
【解】C
【2.7】
【解】C
【2.8】
【解】A
【2.9】
【解】B
【2.10】
【解】D
【2.11】
【解】D
【2.12】
【解】 C
【2.13】
【解】 D
說(shuō)明:
“int *p=new int(5);”表示動(dòng)態(tài)分配1個(gè)整型內(nèi)存空間,初值為5;
“int *p=new int[5];”表示動(dòng)態(tài)分配5個(gè)整型內(nèi)存空間;
“int *p=new int;”表示動(dòng) 18、態(tài)分配1個(gè)整型內(nèi)存空間;
“int *p=new int[5](0)”想給一個(gè)數(shù)組分配內(nèi)存空間時(shí),對(duì)數(shù)組進(jìn)行初始化,這是不允許的。
【2.14】
【解】 D
說(shuō)明:
name被定義為指向常量的常指針, 這個(gè)指針變量所指的地址不能改變,它所指向的地址中的數(shù)據(jù)也不能改變。“name[3]=′a′;”修改了name所指向的地址中的數(shù)據(jù),“name="lin";”和“name=new char[5];”修改了name所指的地址,只有D輸出一個(gè)字符是正確的。
【2.15】
【解】 A
說(shuō)明:
name被定義常指針,它所指向的地址中的數(shù)據(jù)能改變,但它所指的地址不能改變?!皀ame[3 19、]=′q′;”修改了name所指向的地址中的數(shù)據(jù),是正確的。而“name="lin";”、“name=new char[5];”和“name=new char(′q′);”以不同的方法修改了name所指的地址,都是錯(cuò)誤的。
【2.16】
【解】 A
說(shuō)明:
name被定義指向常量的指針, 它所指向的地址中的數(shù)據(jù)不能改變,但它所指的地址可以修改,而“name[3]=q;”修改了name所指向的地址中的數(shù)據(jù),是錯(cuò)誤的?!皀ame=="lin";” 、“name=new char[5];”和“name= new char(′q′)”以不同的方法修改了name所指的地址,都是正確的。
【 20、2.17】
【解】C
【2.18】
【解】 D
說(shuō)明:
C++中不能建立引用數(shù)組和指向引用的指針,也不能建立引用的引用。所以A、B、C是錯(cuò)誤的,D是正確的。
【2.19】
【解】A
【2.20】
【解】B
【2.21】
【解】
(1) 這兩個(gè)函數(shù)原型是等價(jià)的,因?yàn)楹瘮?shù)原型中的參數(shù)名可以缺省。
(2) 這兩個(gè)函數(shù)的第一行是不等價(jià)的,函數(shù)的第一行中必須包含參數(shù)名。
【2.22】
【解】
不可能通過(guò)編譯的原因是:在程序中,當(dāng)一個(gè)函數(shù)的定義在后,而對(duì)它的調(diào)用在前時(shí),必須將該函數(shù)的原型寫(xiě)在調(diào)用語(yǔ)句之前,而在本程序中缺少函數(shù)原型語(yǔ)句。在語(yǔ)句“using namespace 21、std;”后加上函數(shù)原型語(yǔ)句“sum(int a,int b);”就可通過(guò)編譯。
【2.23】
【解】本程序的運(yùn)行結(jié)果如下:
x+y=65
【2.24】
【解】本程序的運(yùn)行結(jié)果如下:
101
說(shuō)明:
在語(yǔ)句“::i=i+1;”中賦值號(hào)左邊“::i”的中i是全局變量,賦值號(hào)右邊的i是局部變量。所以執(zhí)行該語(yǔ)句的結(jié)果是將局部變量i的值加1(即101)后賦值給全局變量i。
【2.25】
【解】本程序的運(yùn)行結(jié)果如下:
10 10
說(shuō)明:
函數(shù)f(&m,n)中 第1個(gè)參數(shù)是引用參數(shù), 引用參數(shù)是一種按地址傳遞參數(shù)的方法,對(duì)其的調(diào)用是傳地址調(diào)用;而第2個(gè)參數(shù)是變量參數(shù),對(duì)它 22、的調(diào)用是傳值調(diào)用。所以調(diào)用函數(shù)f后, 實(shí)參a的值被改為10, 實(shí)參b的值不變,仍為10。
【2.26】
【解】本程序的運(yùn)行結(jié)果如下:
10
20
說(shuō)明:
函數(shù)f的參數(shù)是變量的引用, 對(duì)它的調(diào)用是傳地址調(diào)用,所以函數(shù)f調(diào)用后,主函數(shù)中k的值變?yōu)?0。又由于m是對(duì)函數(shù)f的引用,當(dāng)m被賦值為20時(shí),k的值也變?yōu)?0 。
【2.27】
【解】程序的作用是:輸入3個(gè)整數(shù),然后輸出其中值最大的數(shù)。在主函數(shù)中輸入3個(gè)整數(shù),然后調(diào)用f函數(shù),在f函數(shù)中實(shí)現(xiàn)找最小的整數(shù),用if語(yǔ)句比較兩個(gè)數(shù),將大者存放在變量m中,經(jīng)過(guò)兩個(gè)if語(yǔ)句的比較,m中存放的是3個(gè)整數(shù)中最大的數(shù)。運(yùn)行情況如下:
2 23、4 7↙ (輸入3個(gè)整數(shù))
7 (輸出其中最大的數(shù))
【2.28】
【解】實(shí)現(xiàn)本題功能的程序如下:
#include 24、
}
本程序的運(yùn)行結(jié)果是:
please input 2 floats to x,y:2.1 3↙
pow(2.1,3)=9.261
說(shuō)明:
由于要用到系統(tǒng)函數(shù)pow(x,y),所以要包含頭文件cmath。
【2.29】
【解】實(shí)現(xiàn)本題功能的程序如下:
#include 25、值1
cout<<*p<<"\t"<<*(p+1)<<"\t";
p=p+2; //p指向第3個(gè)內(nèi)存空間
for (int i=3;i<=20;i++)
{ *p=*(p-1)+*(p-2);
cout<<*p<<"\t";
if (i%5==0) cout< 26、 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
【2.30】
【解】實(shí)現(xiàn)本題功能的程序如下:
#include 27、d)
{ return sqrt(d);
}
int main()
{ int i=12;
long l=1234;
double d=12.34;
cout<<"i的二次方根是:"< 28、在第一次上機(jī)時(shí),按以下步驟建立和運(yùn)行C++程序:
(1) 先進(jìn)入Visual C++6.0環(huán)境。
(2) 編輯 C++源程序。
按照第12章介紹的單文件程序的編輯方法,在自己指定的子目錄中(例如D:\C++)建立一個(gè)名為test1_1.cpp的新文件(此時(shí)尚未向文件輸入內(nèi)容) ,并從鍵盤(pán)輸入以上的源程序。
(3) 編譯C++程序。
選擇“Build(編譯)→Compile test2_1.cppp(編譯test2_1.cpp)”命令,對(duì)此源程序進(jìn)行編譯。觀察和分析編譯信息。(注:以上括號(hào)中的內(nèi)容是Visual C++ 6.0中文版中的中文顯示,以下同。)
根據(jù)編譯信息指出的 29、錯(cuò)誤,修改程序,再進(jìn)行編譯。如果還有錯(cuò),再重復(fù)此過(guò)程,直到編譯信息提示:“test2_1.obj - 0 error(s),0 warming(s)”,即既沒(méi)有error類(lèi)型的語(yǔ)法錯(cuò)誤,也沒(méi)有warming類(lèi)型的語(yǔ)法錯(cuò)誤,這時(shí)產(chǎn)生一個(gè)test2_1.obj文件。
(4)連接C++程序。
選擇“Build(編譯)→Build test2_1.exe(構(gòu)建test2_1.exe)”命令,對(duì)程序進(jìn)行連接,如果不出錯(cuò),就會(huì)生成可執(zhí)行程序test2_1.exe。
(5) 運(yùn)行C++程序。
選擇“Build→Execute test2_1.exe(執(zhí)行Execute test2_1.exe 30、)”命令,執(zhí)行可執(zhí)行程序test2_1.exe。觀察屏幕的變化。在輸出窗口應(yīng)顯示如下運(yùn)行結(jié)果:
Hello!
This is a program.
(6) 分析運(yùn)行結(jié)果。
分析結(jié)果是否正確,如果不正確或認(rèn)為輸出格式不理想,可以修改程序,然后重新執(zhí)行以上步驟。
(7) 關(guān)閉工作空間。
在執(zhí)行完一個(gè)程序,編輯和運(yùn)行新的程序前,應(yīng)執(zhí)行“File(文件)->Close Workspace(關(guān)閉工作區(qū))”命令,則結(jié)束對(duì)該程序的的操作。若要退出VC++環(huán)境,則執(zhí)行“File(文件)->Exit(退出)”命令。
【運(yùn)行結(jié)果】
Hello!
This is a program.
【2.2 31、】
【錯(cuò)誤分析】
編譯程序,提示有4個(gè)error錯(cuò)誤,1個(gè)warming錯(cuò)誤。
① 編譯出錯(cuò)信息告知在第3行有2個(gè)error錯(cuò)誤,第1個(gè)錯(cuò)誤的原因是cout未經(jīng)聲明,第2個(gè)錯(cuò)誤的原因是運(yùn)算符“<<”不合法。這都是因?yàn)榱鲗?duì)象cout是標(biāo)準(zhǔn)的輸出流對(duì)象,它在文件iostream中聲明,因此必須包含頭文件iostream。因此應(yīng)添加以下語(yǔ)句:
#include 32、r錯(cuò)誤原因是第5行少了1個(gè)分號(hào)“;”,這是因?yàn)槊織l語(yǔ)句需要由分號(hào)作為結(jié)束符。也許讀者要問(wèn),明明這兩個(gè)錯(cuò)誤都是出現(xiàn)在第4行,為什么說(shuō)成第5行有錯(cuò)呢?這是因?yàn)镃++允許將一條語(yǔ)句分寫(xiě)成幾行,檢查完第4行沒(méi)有分號(hào)后,必須檢查下一行,直到發(fā)現(xiàn)第5行的“}” 前都沒(méi)有“;” 時(shí),才判定出錯(cuò)。因此在第5行報(bào)錯(cuò)。修改方法是:在第5行語(yǔ)句的末尾加上“;”。
③ 編譯出錯(cuò)信息告知第5行有1個(gè)warming錯(cuò)誤,原因是main函數(shù)默認(rèn)的返回值類(lèi)型是int, 而main函數(shù)中沒(méi)有返回值。修改方法:在“}”前加上返回語(yǔ)句“return 0;”。
【修改后的程序】
//test2_2_1_2.cpp
# 33、include 34、<<"x*y="< 35、out<<"x*y="< 36、}
【錯(cuò)誤分析】
本題有兩處錯(cuò)誤:
①) 語(yǔ)句“cout<<"x+y=< 37、 cout<<"x+y="< 38、test2_3.cpp
#include 39、(x,y);
return(temp>z ? temp:z);
}
char maxl(char x,char y)
{ return(x>y ? x:y);
}
int maxl(char x,char y,char z)
{ int temp=maxl(x,y);
return(temp>z ? temp:z);
}
int main()
{ int x1,x2;
double d1,d2;
char c1,c2;
x1=maxl(3,5);
x2=maxl(4,5,8);
c1=maxl(a,b);
c2=maxl(d,e,h);
d1=m 40、axl(3.1,5.6);
d2=maxl(15.3,13.4,27.8);
cout<<"maxl(3,5)="< 41、(3.1,5.6)=5.6
max1(15.3,13.4,27.8)=27.8
maxl(a,b)=b
maxl(d,e,h)=h
【2.4】
【參考程序】
//test2_4.cpp
#include 43、14*(*r)*(*r)< 44、3.4】
【解】B
【3.5】
【解】D
【3.6】
【解】B
說(shuō)明:
C++中對(duì)構(gòu)造函數(shù)有一些規(guī)定:不能帶返回值;可以不帶參數(shù);也可以缺省定義;但構(gòu)造函數(shù)的名字與類(lèi)名必須完全相同。
【3.7】
【解】B
【3.8】
【解】C
【3.9】
【解】C
【3.10】
【解】B
【3.11】
【解】C
說(shuō)明:
C++中對(duì)析構(gòu)函數(shù)也有一些規(guī)定:沒(méi)有參數(shù);不能重載;析造函數(shù)的名字與是在類(lèi)名前加“~”;析構(gòu)函數(shù)不能指定返回類(lèi)型。
【3.12】
【解】C
【3.13】
【解】C
【3.14】
【解】B
【3.15】
【解】D
【3.16】
【 45、解】
語(yǔ)句(1)使用帶默認(rèn)參數(shù)的構(gòu)造函數(shù),或不帶參數(shù)的構(gòu)造函數(shù),定義了point類(lèi)的兩個(gè)對(duì)象p2和p3;
語(yǔ)句(2)在建立新對(duì)象p2時(shí),用已經(jīng)存在的對(duì)象P1去初始化新對(duì)象p2,在這個(gè)過(guò)程中用“賦值法”調(diào)用了拷貝構(gòu)造函數(shù)。
語(yǔ)句(3)在建立新對(duì)象p2時(shí),用已經(jīng)存在的對(duì)象P1去初始化新對(duì)象p2,在這個(gè)過(guò)程中用“代入法”調(diào)用了拷貝構(gòu)造函數(shù)。
語(yǔ)句(4)將對(duì)象p1數(shù)據(jù)成員的值拷貝到對(duì)象p4中, 這個(gè)過(guò)程是通過(guò)默認(rèn)賦值運(yùn)算符函數(shù)實(shí)現(xiàn)的。
【3.17】
【解】本程序的運(yùn)行結(jié)果如下:
Exit main
dst 55
【3.18】
【解】本程序的運(yùn)行結(jié)果如下:
Counting 46、 at 0
Counting at 1
Counting at 2
Counting at 3
Counting at 4
Counting at 5
Couhting at 6
Counting at 7
Counting at 8
Counting at 9
說(shuō)明:
在本程序中主函數(shù)main只包括了一個(gè)return語(yǔ)句,但竟然有內(nèi)容輸出!什么時(shí)候調(diào)用了構(gòu)造函數(shù)?我們知道,構(gòu)造函數(shù)在對(duì)象被定義時(shí)調(diào)用。那么對(duì)象anObject是何時(shí)被調(diào)用的呢?在主函數(shù)main之前,語(yǔ)句“test anObject”處 47、。
【3.19】
【解】本程序的運(yùn)行結(jié)果如下:
Con.
Copy con.
default.
【3.20】
【解】
第1個(gè)錯(cuò)誤:printStu()和setSno兩個(gè)成員函數(shù)沒(méi)有用public定義,不允許外部函數(shù)對(duì)對(duì)象進(jìn)行操作。
第2個(gè)錯(cuò)誤:成員函數(shù)在類(lèi)外定義,應(yīng)加上類(lèi)名“Student::”。
第3個(gè)錯(cuò)誤:setAge應(yīng)在類(lèi)中說(shuō)明,并且在類(lèi)外定義時(shí),應(yīng)加上類(lèi)名“Student::”。
【3.21】
【解】
構(gòu)造函數(shù)Point是私有的,語(yǔ)句“Point cpoint;”執(zhí)行時(shí)出現(xiàn)錯(cuò)誤。
【3.22】
【解】 實(shí)現(xiàn)本題功能的程序如下:
#include 48、tream>
using namespace std;
class Circle{
public:
Circle(float r){radius=r;}
float area(){return 3.14*radius*radius;}
private:
float radius;
};
int main()
{ float r;
cout<<"請(qǐng)輸入圓的半徑:";
cin>>r;
Circle p(r);
cout<<"半徑為"< 49、是:
請(qǐng)輸入圓的半徑:3
半徑為3的圓的面積為:28.26
【3.23】
【解】實(shí)現(xiàn)本題功能的程序如下:
#include 50、41592*r*r*h;
}
void cylinder::vol()
{ cout<<"volume is:"< 51、t m,int d)
{ year=y;
mon=m;
day=d;
}
Date(Date&d)
{ year=d.year;
mon=d.mon;
day=d.day;
}
void SetDate(int Y,int m,int d)
{ year=Y;
mon=m;
day=d;
}
void printDate()
{ cout<<"日期是:"< 52、
}
int GetYear()
{ return year;
}
int GetMonth()
{ return mon;
}
int GetDay()
{ return day;
}
private:
int day,mon,year;
};
void main()
{ Date d1(2010,6,8);
cout<<"日期是:"< 53、e d2;
d2.SetDate(2010,8,1);
d2.printDate();
Date d3(d1);
d3.printDate();
}
程序的運(yùn)行結(jié)果是:
日期是:2010年6月8日
日期是:2010年8月1日
日期是:2010年6月8日
3.2 上機(jī)實(shí)驗(yàn)題參考解答
【3.1】
(1)
【運(yùn)行結(jié)果】
Copy-initialization Constructor is called
Copy-initialization Constructor is called
p3=(3,4)
Destructor is calleded
D 54、estructor is calleded
Destructor is calleded
(2)
【運(yùn)行結(jié)果】
Constructor is Called.
Copy-initialization Constructor is called
Copy-initialization Constructor is called
p3=(3,4)
Destructor is calleded
Destructor is calleded
Destructor is calleded
【結(jié)果分析】
① 創(chuàng)建對(duì)象p1時(shí),調(diào)用帶有兩個(gè)參數(shù)的構(gòu)造函數(shù),輸出第1行結(jié)果。
② 創(chuàng) 55、建對(duì)象p2和p3時(shí),調(diào)用拷貝構(gòu)造函數(shù),輸出第2行和第3行結(jié)果。
③ 當(dāng)程序運(yùn)行結(jié)束,釋放對(duì)象p3、p2和p1時(shí), 分別調(diào)用析構(gòu)函數(shù)輸出最后3行結(jié)果。
(3)
【錯(cuò)誤分析】
調(diào)試程序時(shí),發(fā)現(xiàn)添加的兩條語(yǔ)句有錯(cuò)。這是因?yàn)镃oordinate類(lèi)中沒(méi)有提供適合創(chuàng)建對(duì)象p4和p5的構(gòu)造函數(shù)。為了解決這個(gè)問(wèn)題,可以增加一個(gè)默認(rèn)構(gòu)造函數(shù)和帶一個(gè)參數(shù)的構(gòu)造函數(shù),但最簡(jiǎn)單的方法是修改帶有兩個(gè)參數(shù)的構(gòu)造函數(shù), 使參數(shù)帶有默認(rèn)值。如:
Coordinate(int x1=0,int y1=0);
這樣,創(chuàng)建對(duì)象p4時(shí),2個(gè)參數(shù)分別使用默認(rèn)值0和0;而創(chuàng)建對(duì)象p5時(shí), 第1個(gè)參數(shù)為2,第2個(gè) 56、參數(shù)使用默認(rèn)值0。
(4)
【運(yùn)行結(jié)果】
Constructor is Called.
Copy-initialization Constructor is called
Copy-initialization Constructor is called
p3=(3,4)
Constructor is Called.
Constructor is Called.
Destructor is calleded
Destructor is calleded
Destructor is calleded
Destructor is calleded
Destructor 57、is calleded
【結(jié)果分析】
從輸出結(jié)果可以看出,程序調(diào)用了3次構(gòu)造函數(shù),2次拷貝構(gòu)造函數(shù)。
① 創(chuàng)建對(duì)象時(shí),將根據(jù)參數(shù)的情況調(diào)用相應(yīng)的構(gòu)造函數(shù)。程序在執(zhí)行語(yǔ)句
Coordinate pl(3,4);
Coordinate p4;
Coordinate p5(2);
創(chuàng)建對(duì)象p1、p4和p5時(shí),調(diào)用了3次構(gòu)造函數(shù)。
② 當(dāng)用類(lèi)的一個(gè)對(duì)象去創(chuàng)建該類(lèi)的另一個(gè)對(duì)象時(shí),將調(diào)用拷貝構(gòu)造函數(shù)。程序在執(zhí)行
語(yǔ)句
Coordinate p2(p1);
Coordinate p3=p2;
創(chuàng)建對(duì)象p2和p3時(shí),調(diào)用了2次拷貝構(gòu)造函數(shù)。
【2.2】
【參考程序】
58、//test3_2.cpp
#include 59、 //顯示魔方成員函數(shù)
private:
int m[4][4];
int step; //相鄰元素之間的差值
int first; //起始值
int sum; //最大元素值和最小元素值的和
};
void magic::getdata() //輸入初值成員函數(shù)
{ cout<<"輸入4*4魔方起始值:";
cin>>first;
cout<<"輸入相鄰元素差值:";
cin>>step;
}
vo 60、id magic::setfirstmagic() //設(shè)置初始魔方成員函數(shù)
{ int i,j;
int tmp;
tmp=first;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{
m[i][j]=tmp;
tmp+=step;
}
}
void magic::generatemagic() //生成最終魔方成員函數(shù)
{ sum=m[0][0]+m[3][3];
for (int i=0,j=0;i<4;i++ 61、,j++)
m[i][j]=sum-m[i][j];
for( i=0,j=3;i<4;i++,j--)
m[i][j]=sum-m[i][j];
}
void magic::printmagic() //顯示魔方成員函數(shù)
{ int i,j;
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
cout< 62、)
{ magic A;
A.getdata();
A.setfirstmagic();
cout<<"初始魔方如下:"< 63、 11 13 15
17 19 21 23
25 27 29 31
最終魔方如下:
31 3 5 25
9 21 19 15
17 13 11 23
7 27 29 1
【3.3】
【參考程序】
//test3_3.cpp
#include 64、ring s[]);
string str[len]={"Germany","Japan","America","Britain","France"};
cout<<"按逆轉(zhuǎn)前的順序輸出字符串:"< 65、)
cout< 66、ce
按逆轉(zhuǎn)后的順序輸出字符串:
France Britain America Japan Germany
第4章 類(lèi)和對(duì)象的進(jìn)一步討論
4.1 習(xí)題參考解答
【4.1】
【解】
所謂對(duì)象數(shù)組是指每一數(shù)組元素都是對(duì)象的數(shù)組,也就是說(shuō),若一個(gè)類(lèi)有若干個(gè)對(duì)象,我們把這一系列的對(duì)象用一個(gè)數(shù)組來(lái)存放。對(duì)象數(shù)組的元素是對(duì)象,不僅具有數(shù)據(jù)成員,而且還有函數(shù)成員。
【4.2】
【解】對(duì)象指針就是用于存放對(duì)象地址的變量。聲明對(duì)象指針的一般語(yǔ)法形式為:
類(lèi)名* 對(duì)象指針名;
【4.3】
【解】B
【4.4】
【解】C
【4.5】
【解】B
說(shuō)明:
C++中規(guī)定,在建立對(duì)象前就可以為靜態(tài)數(shù)據(jù)成員賦值。同時(shí)規(guī)定在靜態(tài)成員函數(shù)中不能使用this指針;靜態(tài)成員函數(shù)在類(lèi)外定義時(shí),不需要用static前綴;靜態(tài)成員函數(shù)既可以在類(lèi)內(nèi)定義也可以在類(lèi)外定義。
【4.6】
【解】D
【4.7】
【解】C
【4.8】
【解】D
【4.9】
【解】A
【4.10】
【解】A
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案