第一篇:C語(yǔ)言程序設(shè)計(jì)(鄭莉)課后習(xí)題答案
C++語(yǔ)言程序設(shè)計(jì)(清華大學(xué)鄭莉)課后習(xí)題答案
第 一 章 概述
1-1 簡(jiǎn)述計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言的發(fā)展歷程。
解:
迄今為止計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言的發(fā)展經(jīng)歷了機(jī)器語(yǔ)言、匯編語(yǔ)言、高級(jí)語(yǔ)言等階段,C++語(yǔ)言是一種面向?qū)ο蟮木幊陶Z(yǔ)言,也屬于高級(jí)語(yǔ)言。
1-2 面向?qū)ο蟮木幊陶Z(yǔ)言有哪些特點(diǎn)?
解:
面向?qū)ο蟮木幊陶Z(yǔ)言與以往各種編程語(yǔ)言有根本的不同,它設(shè)計(jì)的出發(fā)點(diǎn)就是為了能更直接的描述客觀世界中存在的事物以及它們之間的關(guān)系。面向?qū)ο蟮木幊陶Z(yǔ)言將客觀事物看作具有屬性和行為的對(duì)象,通過(guò)抽象找出同一類(lèi)對(duì)象的共同屬性(靜態(tài)特征)和行為(動(dòng)態(tài)特征),形成類(lèi)。通過(guò)類(lèi)的繼承與多態(tài)可以很方便地實(shí)現(xiàn)代碼重用,大大縮短了軟件開(kāi)發(fā)周期,并使得軟件風(fēng)格統(tǒng)一。因此,面向?qū)ο蟮木幊陶Z(yǔ)言使程序能夠比較直接地反問(wèn)題域的本來(lái)面目,軟件開(kāi)發(fā)人員能夠利用人類(lèi)認(rèn)識(shí)事物所采用的一般思維方法來(lái)進(jìn)行軟件開(kāi)發(fā)。C++語(yǔ)言是目前應(yīng)用最廣的面向?qū)ο蟮木幊陶Z(yǔ)言。
1-3 什么是結(jié)構(gòu)化程序設(shè)計(jì)方法?這種方法有哪些優(yōu)點(diǎn)和缺點(diǎn)?
解:
結(jié)構(gòu)化程序設(shè)計(jì)的思路是:自頂向下、逐步求精;其程序結(jié)構(gòu)是按功能劃分為若干個(gè)基本模塊;各模塊之間的關(guān)系盡可能簡(jiǎn)單,在功能上相對(duì)獨(dú)立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成;其模塊化實(shí)現(xiàn)的具體方法是使用子程序。結(jié)構(gòu)化程序設(shè)計(jì)由于采用了模塊分解與功能抽象,自頂向下、分而治之的方法,從而有效地將一個(gè)較復(fù)雜的程序系統(tǒng)設(shè)計(jì)任務(wù)分解成許多易于控制和處理的子任務(wù),便于開(kāi)發(fā)和維護(hù)。雖然結(jié)構(gòu)化程序設(shè)計(jì)方法具有很多的優(yōu)點(diǎn),但它仍是一種面向過(guò)程的程序設(shè)計(jì)方法,它把數(shù)據(jù)和處理數(shù)據(jù)的過(guò)程分離為相互獨(dú)立的實(shí)體。當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過(guò)程都要進(jìn)行相應(yīng)的修改,每一種相對(duì)于老問(wèn)題的新方法都要帶來(lái)額外的開(kāi)銷(xiāo),程序的可重用性差。
由于圖形用戶界面的應(yīng)用,程序運(yùn)行由順序運(yùn)行演變?yōu)槭录?qū)動(dòng),使得軟件使用起來(lái)越來(lái)越方便,但開(kāi)發(fā)起來(lái)卻越來(lái)越困難,對(duì)這種軟件的功能很難用過(guò)程來(lái)描述和實(shí)現(xiàn),使用面向過(guò)程的方法來(lái)開(kāi)發(fā)和維護(hù)都將非常困難。
1-4 什么是對(duì)象?什么是面向?qū)ο蠓椒??這種方法有哪些特點(diǎn)?
解:
從一般意義上講,對(duì)象是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物,它可以是有形的,也可以是無(wú)形的。對(duì)象是構(gòu)成世界的一個(gè)獨(dú)立單位,它具有自己的靜態(tài)特征和動(dòng)態(tài)特征。面向?qū)ο蠓椒ㄖ械膶?duì)象,是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是用來(lái)構(gòu)成系統(tǒng)的一個(gè)基本單位,由一組屬性和一組行為構(gòu)成。面向?qū)ο蟮姆椒▽?shù)據(jù)及對(duì)數(shù)據(jù)的操作方法放在一起,作為一個(gè)相互依存、不可分離的整體--對(duì)象。對(duì)同類(lèi)型對(duì)象抽象出其共性,形成類(lèi)。類(lèi)中的大多數(shù)數(shù)據(jù),只能用本類(lèi)的方法進(jìn)行處理。類(lèi)通過(guò)一個(gè)簡(jiǎn)單的外部接口,與外界發(fā)生關(guān)系,對(duì)象與對(duì)象之間通過(guò)消息進(jìn)行通訊。這樣,程序模塊間的關(guān)系更為簡(jiǎn)單,程序模塊的獨(dú)立性、數(shù)據(jù)的安全性就有了良好的保障。通過(guò)實(shí)現(xiàn)繼承與多態(tài)性,還可以大大提高程序的可重用性,使得軟件的開(kāi)發(fā)和維護(hù)都更為方便。
面向?qū)ο蠓椒ㄋ鶑?qiáng)調(diào)的基本原則,就是直接面對(duì)客觀存在的事物來(lái)進(jìn)行軟件開(kāi)發(fā),將人們?cè)谌粘I钪辛?xí)慣的思維方式和表達(dá)方式應(yīng)用在軟件開(kāi)發(fā)中,使軟件開(kāi)發(fā)從過(guò)分專(zhuān)業(yè)化的方法、規(guī)則和技巧中回到客觀世界,回到人們通常的思維。
1-5 什么叫做封裝?
解:
封裝是面向?qū)ο蠓椒ǖ囊粋€(gè)重要原則,就是把對(duì)象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單位,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。
1-6 面向?qū)ο蟮能浖こ贪男┲饕獌?nèi)容?
解:
面向?qū)ο蟮能浖こ淌敲嫦驅(qū)ο蠓椒ㄔ谲浖こ填I(lǐng)域的全面應(yīng)用,它包括面向?qū)ο蟮姆治觯∣OA)、面向?qū)ο蟮脑O(shè)計(jì)(OOD)、面向?qū)ο蟮木幊蹋∣OP)、面向?qū)ο蟮臏y(cè)試(OOT)和面向?qū)ο蟮能浖S護(hù)(OOSM)等主要內(nèi)容。
1-7 簡(jiǎn)述計(jì)算機(jī)內(nèi)部的信息可分為幾類(lèi)?
解:
計(jì)算機(jī)內(nèi)部的信息可以分成控制信息和數(shù)據(jù)信息二大類(lèi);控制信息可分為指令和控制字兩類(lèi);數(shù)據(jù)信息可分為數(shù)值信息和非數(shù)值信息兩類(lèi)。
1-8 什么叫二進(jìn)制?使用二進(jìn)制有何優(yōu)點(diǎn)和缺點(diǎn)?
解:
二進(jìn)制是基數(shù)為2,每位的權(quán)是以2 為底的冪的進(jìn)制,遵循逢二進(jìn)一原則,基本符號(hào)為0和1。采用二進(jìn)制碼表示信息,有如下幾個(gè)優(yōu)點(diǎn):1.易于物理實(shí)現(xiàn);2.二進(jìn)制數(shù)運(yùn)算簡(jiǎn)單;3.機(jī)器可靠性高;4.通用性強(qiáng)。其缺點(diǎn)是它表示數(shù)的容量較小,表示同一個(gè)數(shù),二進(jìn)制較其他進(jìn)制需要更多的位數(shù)。
1-9 請(qǐng)將以下十進(jìn)制數(shù)值轉(zhuǎn)換為二進(jìn)制和十六進(jìn)制補(bǔ)碼:(1)2(2)9(3)93(4)-32(5)65535(6)-1
解:
(1)(2)10 =(10)2 =(2)16(2)(9)10 =(1001)2 =(9)16(3)(93)10 =(1011101)2 =(5D)16(4)(-32)10 =(11100000)2 =(E0)16(5)(65535)10 =(11111111 11111111)2 =(FFFF)16(6)(-1)10 =(11111111 11111111)2 =(FFFF)16
1-10 請(qǐng)將以下數(shù)值轉(zhuǎn)換為十進(jìn)制:
(1)(1010)2(2)(10001111)2(3)(01011111 11000011)2(4)(7F)16(5)(2D3E)16(6)(F10E)16
解:
(1)(1010)2 =(10)10(2)(10001111)2 =(143)10(3)(01011111 11000011)2 =(24515)10
(4)(7F)16 =(127)10(5)(2D3E)16 =(11582)10(6)(F10E)16 =(61710)10
1-11 簡(jiǎn)要比較原碼、反碼、補(bǔ)碼等幾種編碼方法。
解:
原碼:將符號(hào)位數(shù)字化為 0 或 1,數(shù)的絕對(duì)值與符號(hào)一起編碼,即所謂“符號(hào)──絕對(duì)值表示”的編碼。正數(shù)的反碼和補(bǔ)碼與原碼表示相同。負(fù)數(shù)的反碼與原碼有如下關(guān)系:
符號(hào)位相同(仍用1表示),其余各位取反(0變1,1變0)。補(bǔ)碼由該數(shù)反碼的最末位加1求得。
第 二 章 C++簡(jiǎn)單程序設(shè)計(jì)
2-1 C++語(yǔ)言有那些主要特點(diǎn)和優(yōu)點(diǎn)?
解:
C++語(yǔ)言的主要特點(diǎn)表現(xiàn)在兩個(gè)方面,一是全面兼容C,二是支持面向?qū)ο蟮姆椒?。C++是一個(gè)更好的C,它保持了C的簡(jiǎn)潔、高效、接近匯編語(yǔ)言、具有良好的可讀性和可移植性等特點(diǎn),對(duì)C的類(lèi)型系統(tǒng)進(jìn)行了改革和擴(kuò)充,因此C++比C更安全,C++的編譯系統(tǒng)能檢查出更多的類(lèi)型錯(cuò)誤。C++語(yǔ)言最重要的特點(diǎn)是支持面向?qū)ο蟆?/p>
2-2 下列標(biāo)識(shí)符哪些是合法的?
Program,-page,_lock,test2,3in1,@mail,A_B_C_D
解:
Program,_lock,test2,A_B_C_D是合法的標(biāo)識(shí)符,其它的不是。
2-3 例2.1中每條語(yǔ)句的作用是什么? #include
cout<<“Hello!n”;cout<<“Welcome to c++!n”;}
解:
#include
//嵌入到該程序中該指令所在的地方
void main()//主函數(shù)名,void 表示函數(shù)沒(méi)有返回值 { //函數(shù)體標(biāo)志
cout<<“Hello!n”;//輸出字符串Hello!到標(biāo)準(zhǔn)輸出設(shè)備(顯示器)上。
cout<<“Welcome to c++!n”;//輸出字符串Welcome to c++!} 在屏幕輸出如下: Hello!Welcome to c++!
2-4 使用關(guān)鍵字const而不是#define語(yǔ)句的好處有哪些?
解:
const定義的常量是有類(lèi)型的,所以在使用它們時(shí)編譯器可以查錯(cuò);而且,這些變量在調(diào)試時(shí)仍然是可見(jiàn)的。
2-5 請(qǐng)寫(xiě)出C++語(yǔ)句聲明一個(gè)常量PI,值為3.1416;再聲明一個(gè)浮點(diǎn)型變量a,把PI的值賦給a。
解:
const float PI = 3.1416;float a = PI;
2-6 在下面的枚舉類(lèi)型中,Blue的值是多少?
enum COLOR { WHITE,BLACK = 100,RED,BLUE,GREEN = 300 };
解: Blue = 102
2-7 注釋有什么作用?C++中有哪幾種注釋的方法?他們之間有什么區(qū)別?
解:
注釋在程序中的作用是對(duì)程序進(jìn)行注解和說(shuō)明,以便于閱讀。編譯系統(tǒng)在對(duì)源程序進(jìn)行編譯時(shí)不理會(huì)注釋部分,因此注釋對(duì)于程序的功能實(shí)現(xiàn)不起任何作用。而且由于編譯時(shí)忽略注釋部分,所以注釋內(nèi)容不會(huì)增加最終產(chǎn)生的可執(zhí)行程序的大小。適當(dāng)?shù)厥褂米⑨專(zhuān)軌蛱岣叱绦虻目勺x性。在C++中,有兩種給出注釋的方法:一種是延用C語(yǔ)言方法,使用“/*”和“*/”括起注釋文字。另一種方法是使用“//”,從“//”開(kāi)始,直到它所在行的行尾,所有字符都被作為注釋處理。
2-8 什么叫做表達(dá)式?x = 5 + 7是一個(gè)表達(dá)式嗎?它的值是多少?
解:
任何一個(gè)用于計(jì)算值的公式都可稱為表達(dá)式。x = 5 + 7是一個(gè)表達(dá)式,它的值為12。
2-9 下列表達(dá)式的值是多少? 1.201 / 4 2.201 % 4 3.201 / 4.0
解: 1. 50 2. 1 3. 50.25
2-10 執(zhí)行完下列語(yǔ)句后,a、b、c三個(gè)變量的值為多少? a = 30;b = a++;c = ++a;
解:
a:32 ; b:30 ; c:32;
2-11 在一個(gè)for循環(huán)中,可以初始化多個(gè)變量嗎?如何實(shí)現(xiàn)?
解:
在for循環(huán)設(shè)置條件的第一個(gè)“;”前,用,分隔不同的賦值表達(dá)式。例如:
for(x = 0,y = 10;x < 100;x++,y++)
2-12 執(zhí)行完下列語(yǔ)句后,n的值為多少? int n;for(n = 0;n < 100;n++)
解: n的值為100
2-13 寫(xiě)一條for語(yǔ)句,計(jì)數(shù)條件為n從100到200,步長(zhǎng)為2;然后用while和do?while語(yǔ)句完成同樣的循環(huán)。
解: for循環(huán):
for(int n = 100;n <= 200;n += 2);
while循環(huán): int x = 100;while(n <= 200)n += 2;
do?while循環(huán): int n = 100;do { n += 2;} while(n <= 200);
2-14 if(x = 3)和 if(x = = 3)這兩條語(yǔ)句的差別是什么?
解:
語(yǔ)句if(x = 3)把3賦給x,賦值表達(dá)式的值為true,作為if語(yǔ)句的條件;語(yǔ)句if(x == 3)首先判斷x的值是否為3,若相等條件表達(dá)式的值為ture,否則為false。
2-15 什么叫做作用域?什么叫做局部變量?什么叫做全局變量,如何使用全局變量?
解:
作用域是一個(gè)標(biāo)識(shí)符在程序正文中有效的區(qū)域。局部變量,一般來(lái)講就是具有塊作用域的變量;全局變量,就是具有文件作用域的變量。
2-16 已知x、y兩個(gè)變量,寫(xiě)一條簡(jiǎn)單的if語(yǔ)句,把較小的的值賦給原本值較大的變量。
解: if(x > y)x = y;
else // y > x || y == x y = x;
2-17 修改下面這個(gè)程序中的錯(cuò)誤,改正后它的運(yùn)行結(jié)果是什么?
#include
i = 10;/* 給i賦值 j = 20;/* 給j賦值 */
cout << “i + j = << i + j;/* 輸出結(jié)果 */ return 0;}
解: 改正:
#include
i = 10;// 給i賦值 j = 20;/* 給j賦值 */
cout << ”i + j = “ << i + j;/* 輸出結(jié)果 */ return 0;}
程序運(yùn)行輸出: i + j = 30
2-18 編寫(xiě)一個(gè)程序,運(yùn)行時(shí)提示輸入一個(gè)數(shù)字,再把這個(gè)數(shù)字顯示出來(lái)。
解: 源程序:
#include
int main(){ int i;cout << ”請(qǐng)輸入一個(gè)數(shù)字:“;cin >> i;cout << ”您輸入一個(gè)數(shù)字是“ << i << endl;return 0;} 程序運(yùn)行輸出: 請(qǐng)輸入一個(gè)數(shù)字:5 您輸入一個(gè)數(shù)字是5
2-19 C++有哪幾種數(shù)據(jù)類(lèi)型?簡(jiǎn)述其值域。編程顯示你使用的計(jì)算機(jī)中的各種數(shù)據(jù)類(lèi)型的字節(jié)數(shù)。
解: 源程序:
#include
int main(){ cout << ”The size of an int is:tt“ << sizeof(int)<< ” bytes.n“;cout << ”The size of a short int is:t“ << sizeof(short)<< ” bytes.n“;cout << ”The size of a long int is:t“ << sizeof(long)<< ” bytes.n“;cout << ”The size of a char is:tt“ << sizeof(char)<< ” bytes.n“;cout << ”The size of a float is:tt“ << sizeof(float)<< ” bytes.n“;cout << ”The size of a double is:t“ << sizeof(double)<< ” bytes.n“;return 0;} 程序運(yùn)行輸出:
The size of an int is: 4 bytes.The size of a short int is: 2 bytes.The size of a long int is: 4 bytes.The size of a char is: 1 bytes.The size of a float is: 4 bytes.The size of a double is: 8 bytes.2-20 打印ASCII碼為32~127的字符。
解:
#include
for(int i = 32;i<128;i++)cout <<(char)i;return 0;}
程序運(yùn)行輸出:
!”#$%G'()*+,./0123456789:;<>?@ABCDEFGHIJKLMNOP_QRSTUVWXYZ[]^'abcdefghijklmnopqrstuvwxyz<|>~s
2-21 運(yùn)行下面的程序,觀察其輸出,與你的設(shè)想是否相同? #include
unsigned int x;unsigned int y = 100;unsigned int z = 50;x= yy;
cout << “nNow difference is: ” << x < 解: 程序運(yùn)行輸出: Difference is: 50 Now difference is: 4294967246 注意,第二行的輸出并非-50,注意x、y、z的數(shù)據(jù)類(lèi)型。 2-22 運(yùn)行下面的程序,觀察其輸出,體會(huì)i++與++i的差別。#include auto存儲(chǔ)類(lèi)型:采用堆棧方式分配內(nèi)存空間,屬于一時(shí)性存儲(chǔ),其存儲(chǔ)空間可以被若干變量多次覆蓋使用; register存儲(chǔ)類(lèi)型:存放在通用寄存器中; extern存儲(chǔ)類(lèi)型:在所有函數(shù)和程序段中都可引用; static存儲(chǔ)類(lèi)型:在內(nèi)存中是以固定地址存放的,在整個(gè)程序cout << “One year passes...n”;cout << “I am: ” << myAge << “ years old.n”;cout << “You are: ” << yourAge << “ years oldn”;cout << “Another year passesn”;cout << “I am: ” << myAge++ << “ years old.n”;cout << “You are: ” << ++yourAge << “ years oldn”;cout << “Let's print it again.n”;cout << “I am: ” << myAge << “ years old.n”;cout << “You are: ” << yourAge << “ years oldn”;return 0;} 解: 程序運(yùn)行輸出: I am 39 years old You are 39 years old One year passes I am 40 years old You are 40 years old Another year passes I am 40 years old You are 41 years old Let's print it again I am 41 years old You are 41 years old 2-23 什么叫常量?什么叫變量? 解: 所謂常量是指在程序運(yùn)行的整個(gè)過(guò)程中其值始終不可改變的量,除了用文字表示常量外,也可以為常量命名,這就是符號(hào)常量;在程序的執(zhí)行過(guò)程中其值可以變化的量稱為變量,變量是需要用名字來(lái)標(biāo)識(shí)的。 2-24 變量有哪幾種存儲(chǔ)類(lèi)型? 解: 運(yùn)行期間都有效。 2-25 寫(xiě)出下列表達(dá)式的值: 1.2 < 3 && 6 < 9 2.!(4<7) 3.!(3 > 5)||(6 < 2) 解: 1.true 2.false 3.true 2-26 若a = 1,b = 2,c = 3,下列各式的結(jié)果是什么? 1.a | b32)* 5/9;在主程序中提示用戶輸入一個(gè)華氏溫度,轉(zhuǎn)化后輸出相應(yīng)的攝氏溫度。 解: 源程序見(jiàn)“實(shí)驗(yàn)指導(dǎo)”部分實(shí)驗(yàn)三 3-9 編寫(xiě)函數(shù)判斷一個(gè)數(shù)是否是質(zhì)數(shù),在主程序中實(shí)現(xiàn)輸入、輸出。 解: #include int prime(int i);//判一個(gè)數(shù)是否是質(zhì)數(shù)的函數(shù) void main(){ int i; cout << “請(qǐng)輸入一個(gè)整數(shù):”;cin >> i;if(prime(i)) cout << i << “是質(zhì)數(shù).” << endl;else cout << i << “不是質(zhì)數(shù).” << endl;} int prime(int i){ int j,k,flag;flag = 1;k = sqrt(i);for(j = 2;j <= k;j++){ if(i%j == 0){ flag = 0;break;} } if(flag)return 1;else return 0;} 程序運(yùn)行輸出: 請(qǐng)輸入一個(gè)整數(shù):1151 1151是質(zhì)數(shù).3-10 編寫(xiě)函數(shù)求兩個(gè)整數(shù)的最大公約數(shù)和最小公倍數(shù)。 解: 源程序: #include int fn1(int i,int j);//求最大公約數(shù)的函數(shù) void main(){ int i,j,x,y;cout << “請(qǐng)輸入一個(gè)正整數(shù):”;cin >> i;cout << “請(qǐng)輸入另一個(gè)正整數(shù):”;cin >> j; x = fn1(i,j);y = i * j / x;cout << i << “和” << j << “的最大公約數(shù)是:” << x << endl;cout << i << “和” << j << “的最小公倍數(shù)是:” << y << endl;} int fn1(int i, int j){ int temp;if(i < j) { temp = i;i = j;j = i;} while(j!= 0){ temp = i % j;i = j;j = temp;} return i;} 程序運(yùn)行輸出: 請(qǐng)輸入一個(gè)正整數(shù):120 請(qǐng)輸入另一個(gè)正整數(shù):72 120和72的最大公約數(shù)是:24 120和72的最小公倍數(shù)是:360 3-11 什么叫作嵌套調(diào)用?什么叫作遞歸調(diào)用? 解: 函數(shù)允許嵌套調(diào)用,如果函數(shù)1調(diào)用了函數(shù)2,函數(shù)2再調(diào)用函數(shù)3,便形成了函數(shù)的嵌套調(diào)用。 函數(shù)可以直接或間接地調(diào)用自身,稱為遞歸調(diào)用。 3-12 在主程序中提示輸入整數(shù)n,編寫(xiě)函數(shù)用遞歸的方法求1 + 2 + ? + n的值。 解: #include int fn1(int i); void main(){ int i; cout << “請(qǐng)輸入一個(gè)正整數(shù):”;cin >> i; cout << “從1累加到” < 3-13 編寫(xiě)遞歸函數(shù)GetPower(int x,int y)計(jì)算x的y次冪,在主程序中實(shí)現(xiàn)輸入輸出。 解: 源程序: #include long GetPower(int x,int y){ if(y == 1)return x;else return(x * GetPower(x,y-1));} 程序運(yùn)行輸出: Enter a number: 3 To what power? 4 3 to the 4th power is 81 3-14 用遞歸的方法編寫(xiě)函數(shù)求Fibonacci 級(jí)數(shù),公式為fib(n) = fib(n-1)+ fib(n-2),n>2; fib(1)= fib(2)= 1;觀察遞歸調(diào)用的過(guò)程。 解: 源程序見(jiàn)“實(shí)驗(yàn)指導(dǎo)”部分實(shí)驗(yàn)三 3-15 用遞歸的方法編寫(xiě)函數(shù)求n階勒讓德多項(xiàng)式的值,在主程序中實(shí)現(xiàn)輸入、輸出; 解: #include float p(int n, int x); void main(){ int n,x; cout << “請(qǐng)輸入正整數(shù)n:”;cin >> n; cout << “請(qǐng)輸入正整數(shù)x:”;cin >> x; cout << “n = ” << n << endl;cout << “x = ” << x << endl; cout << “P” << n << “(” << x << “)= ” << p(n,x)<< endl;} float p(int n, int x){ if(n == 0)return 1;else if(n == 1)return x;else return((2*n-1)*x*p(n-1,x)itsBottom;return(Width * Height);} int main(){ Rectangle MyRectangle(100, 20, 50, 80); int Area = MyRectangle.GetArea(); cout << “Area: ” << Area << “n”;return 0;} 程序運(yùn)行輸出: Area: 3000 Upper Left X Coordinate: 20 4-10 設(shè)計(jì)一個(gè)用于人事管理的People(人員)類(lèi)。考慮到通用性,這里只抽象出所有類(lèi)型人員都具有的屬性:number(編號(hào))、sex(性別)、birthday(出生日期)、id(身份證號(hào))等等。其中“出生日期”定義為一個(gè)“日期”類(lèi)內(nèi)嵌子對(duì)象。用成員函數(shù)實(shí)現(xiàn)對(duì)人員信息的錄入和顯示。要求包括:構(gòu)造函數(shù)和析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、內(nèi)聯(lián)成員函數(shù)、帶缺省形參值的成員函數(shù)、聚集。 解: 本題用作實(shí)驗(yàn)四的選做題,因此不給出答案。 4-11 定義一個(gè)矩形類(lèi),有長(zhǎng)、寬兩個(gè)屬性,有成員函數(shù)計(jì)算矩形的面積 解: #include class Rectangle { public: Rectangle(float len, float width){ Length = len;Width = width;} ~Rectangle(){}; float GetArea(){ return Length * Width;} float GetLength(){ return Length;} float GetWidth(){ return Width;} private: float Length;float Width;}; void main(){ float length, width; cout << “請(qǐng)輸入矩形的長(zhǎng)度:”;cin >> length; cout << “請(qǐng)輸入矩形的寬度:”;cin >> width; Rectangle r(length, width); cout << “長(zhǎng)為” << length << “寬為” << width << “的矩形的面積為:” << r.GetArea()<< endl;} 程序運(yùn)行輸出: 請(qǐng)輸入矩形的長(zhǎng)度:5 請(qǐng)輸入矩形的寬度:4 長(zhǎng)為5寬為4的矩形的面積為:20 4-12 定義一個(gè)“數(shù)據(jù)類(lèi)型” datatype類(lèi),能處理包含字符型、整型、浮點(diǎn)型三種類(lèi)型的數(shù)據(jù),給出其構(gòu)造函數(shù)。解: #include class datatype{ enum{ character, integer, floating_point } vartype;union { char c;int i;float f;};public: datatype(char ch){ vartype = character;c = ch;} datatype(int ii){ vartype = integer;i = ii;} datatype(float ff){ vartype = floating_point;f = ff;} void print();}; void datatype::print(){ switch(vartype){ case character: cout << “字符型: ” << c << endl;break;case integer: cout << “整型: ” << i << endl;break;case floating_point: cout << “浮點(diǎn)型: ” << f << endl;break;} } void main(){ datatype A('c'), B(12), C(1.44F); A.print();B.print();C.print();} 程序運(yùn)行輸出: 字符型: c 整型: 12 浮點(diǎn)型: 1.44 4-13 定義一個(gè)Circle類(lèi),有數(shù)據(jù)成員半徑Radius,成員函數(shù)GetArea(),計(jì)算圓的面積,構(gòu)造一個(gè)Circle的對(duì)象進(jìn)行測(cè)試。 解: #include class Circle { public: Circle(float radius){ Radius = radius;} ~Circle(){} float GetArea(){ return 3.14 * Radius * Radius;} private: float Radius;}; void main(){ float radius; cout << “請(qǐng)輸入圓的半徑:”;cin >> radius;Circle p(radius); cout << “半徑為” << radius << “的圓的面積為:” << p.GetArea()<< endl;} 程序運(yùn)行輸出: 請(qǐng)輸入圓的半徑:5 半徑為5的圓的面積為:78.5 4-14 定義一個(gè)tree類(lèi),有成員ages,成員函數(shù)grow(int years)對(duì)ages加上years,age()顯示tree對(duì)象的ages的值。解: #include class Tree { int ages;public: Tree(int n=0);~Tree();void grow(int years);void age();}; Tree::Tree(int n){ ages = n;} Tree::~Tree(){ age();} void Tree::grow(int years){ ages += years;} void Tree::age(){ cout << “這棵樹(shù)的年齡為” << ages << endl;} void main(){ Tree t(12); t.age();t.grow(4);} 程序運(yùn)行輸出: 這棵樹(shù)的年齡為12 這棵樹(shù)的年齡為16 第 五 章 C++程序的基本結(jié)構(gòu) 5-1 什么叫做作用域?有哪幾種類(lèi)型的作用域? 解: 作用域討論的是標(biāo)識(shí)符的有效范圍,作用域是一個(gè)標(biāo)識(shí)符在程序正文中有效的區(qū)域。C++的作用域分為函數(shù)原形作用域、塊作用域(局部作用域)、類(lèi)作用域和文件作用域.5-2 什么叫做可見(jiàn)性?可見(jiàn)性的一般規(guī)則是什么? 解: 可見(jiàn)性是標(biāo)識(shí)符是否可以引用的問(wèn)題; 可見(jiàn)性的一般規(guī)則是:標(biāo)識(shí)符要聲明在前,引用在后,在同一作用域中,不能聲明同名的標(biāo)識(shí)符。對(duì)于在不同的作用域聲明的標(biāo)識(shí)符,遵循的原則是:若有兩個(gè)或多個(gè)具有包含關(guān)系的作用域,外層聲明的標(biāo)識(shí)符如果在內(nèi)層沒(méi)有聲明同名標(biāo)識(shí)符時(shí)仍可見(jiàn),如果內(nèi)層聲明了同名標(biāo)識(shí)符則外層標(biāo)識(shí)符不可見(jiàn)。 5-3 下面的程序的運(yùn)行結(jié)果是什么,實(shí)際運(yùn)行一下,看看與你的設(shè)想有何不同。#include int x = 5,y = 7;int main(){ cout << “x from main: ” << x << “n”;cout << “y from main: ” << y << “nn”;myFunction(); cout << “Back from myFunction!nn”;cout << “x from main: ” << x << “n”;cout << “y from main: ” << y << “n”;return 0;} void myFunction(){ int y = 10; cout << “x from myFunction: ” << x << “n”;cout << “y from myFunction: ” << y << “nn”;} 解: 程序運(yùn)行輸出: x from main: 5 y from main: 7 x from myFunction: 5 y from myFunction: 10 Back from myFunction! x from main: 5 y from main: 7 5-4 假設(shè)有兩個(gè)無(wú)關(guān)系的類(lèi)Engine和Fuel,使用時(shí),怎樣允許Fuel成員訪問(wèn)Engine中的私有和保護(hù)的成員? 解: 源程序: class fuel;class engine { friend class fuel;private;int powerlevel;public;engine(){ powerLevel = 0;} void engine_fn(fuel &f);};class fuel { friend class engine;private;int fuelLevel;public: fuel(){ fuelLevel = 0;} void fuel_fn(engine &e);}; 5-5 什么叫做靜態(tài)數(shù)據(jù)成員?它有何特點(diǎn)? 解: 類(lèi)的靜態(tài)數(shù)據(jù)成員是類(lèi)的數(shù)據(jù)成員的一種特例,采用static關(guān)鍵字來(lái)聲明。對(duì)于類(lèi)的普通數(shù)據(jù)成員,每一個(gè)類(lèi)的對(duì)象都擁 有一個(gè)拷貝,就是說(shuō)每個(gè)對(duì)象的同名數(shù)據(jù)成員可以分別存儲(chǔ)不同的數(shù)值,這也是保證對(duì)象擁有自身區(qū)別于其它對(duì)象的特征的需要,但是靜態(tài)數(shù)據(jù)成員,每個(gè)類(lèi)只要一個(gè)拷貝,由所有該類(lèi)的對(duì)象共同維護(hù)和使用,這個(gè)共同維護(hù)、使用也就實(shí)現(xiàn)了同一類(lèi)的不同對(duì)象之間的數(shù)據(jù)共享。 5-6 什么叫做靜態(tài)函數(shù)成員?它有何特點(diǎn)? 解: 使用static關(guān)鍵字聲明的函數(shù)成員是靜態(tài)的,靜態(tài)函數(shù)成員屬于整個(gè)類(lèi),同一個(gè)類(lèi)的所有對(duì)象共同維護(hù),為這些對(duì)象所共享。靜態(tài)函數(shù)成員具有以下兩個(gè)方面的好處,一是由于靜態(tài)成員函數(shù)只能直接訪問(wèn)同一個(gè)類(lèi)的靜態(tài)數(shù)據(jù)成員,可以保證不會(huì)對(duì)該類(lèi)的其余數(shù)據(jù)成員造成負(fù)面影響;二是同一個(gè)類(lèi)只維護(hù)一個(gè)靜態(tài)函數(shù)成員的拷貝,節(jié)約了系統(tǒng)的開(kāi)銷(xiāo),提高程序的運(yùn)行效率。 5-7 定義一個(gè)Cat類(lèi),擁有靜態(tài)數(shù)據(jù)成員HowManyCats,記錄Cat的個(gè)體數(shù)目;靜態(tài)成員函數(shù)GetHowMany(),存取HowManyCats。設(shè)計(jì)程序測(cè)試這個(gè)類(lèi),體會(huì)靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)的用法。 解: 源程序: #include class Cat { public: Cat(int age):itsAge(age){HowManyCats++;} virtual ~Cat(){ HowManyCats--;} virtual int GetAge(){ return itsAge;} virtual void SetAge(int age){ itsAge = age;} static int GetHowMany(){ return HowManyCats;} private: int itsAge; static int HowManyCats;}; int Cat::HowManyCats = 0; void TelepathicFunction(); int main(){ const int MaxCats = 5;Cat *CatHouse[MaxCats];int i;for(i = 0;i for(i = 0;i void TelepathicFunction(){ cout << “There are ” << Cat::GetHowMany()<< “ cats alive!n”;} 程序運(yùn)行輸出: There are 1 cats alive!There are 2 cats alive!There are 3 cats alive!There are 4 cats alive!There are 5 cats alive!There are 4 cats alive!There are 3 cats alive!There are 2 cats alive!There are 1 cats alive!There are 0 cats alive! 5-8 什么叫做友元函數(shù)?什么叫做友元類(lèi)? 解: 友元函數(shù)是使用friend關(guān)鍵字聲明的函數(shù),它可以訪問(wèn)相應(yīng)類(lèi)的保護(hù)成員和私有成員。友元類(lèi)是使用friend關(guān)鍵字聲明的類(lèi),它的所有成員函數(shù)都是相應(yīng)類(lèi)的友元函數(shù)。 5-9 如果類(lèi)A是類(lèi)B的友元,類(lèi)B是類(lèi)C的友元,類(lèi)D是類(lèi)A的派生類(lèi),那么類(lèi)B是類(lèi)A的友元嗎?類(lèi)C是類(lèi)A的友元嗎?類(lèi)D是類(lèi)B的友元嗎? 解: 類(lèi)B不是類(lèi)A的友元,友元關(guān)系不具有交換性; 類(lèi)C不是類(lèi)A的友元,友元關(guān)系不具有傳遞性; 類(lèi)D不是類(lèi)B的友元,友元關(guān)系不能被繼承。 5-10 靜態(tài)成員變量可以為私有的嗎?聲明一個(gè)私有的靜態(tài)整型成員變量。 解: 可以,例如: private: static int a; 5-11 在一個(gè)文件中定義一個(gè)全局變量n,主函數(shù)main(),在另一個(gè)文件中定義函數(shù)fn1(),在main()中對(duì)n賦值,再調(diào)用fn1(),在fn1()中也對(duì)n賦值,顯示n最后的值。 解: #include void main(){ n = 20;fn1(); cout << “n的值為” < // fn1.h文件 extern int n; void fn1(){ n=30;} 程序運(yùn)行輸出: n的值為30 5-12 在函數(shù)fn1()中定義一個(gè)靜態(tài)變量n,fn1()中對(duì)n的值加1,在主函數(shù)中,調(diào)用fn1()十次,顯示n的值。 解: #include void fn1(){ static int n = 0;n++;cout << “n的值為” << n < void main(){ for(int i = 0;i < 10;i++)fn1();} 程序運(yùn)行輸出: n的值為1 n的值為2 n的值為3 n的值為4 n的值為5 n的值為6 n的值為7 n的值為8 n的值為9 n的值為10 5-13 定義類(lèi)X、Y、Z,函數(shù)h(X*),滿足:類(lèi)X有私有成員i,Y的成員函數(shù)g(X*)是X的友元函數(shù),實(shí)現(xiàn)對(duì)X的成員i加1,類(lèi)Z是類(lèi)X的友元類(lèi),其成員函數(shù)f(X*)實(shí)現(xiàn)對(duì)X的成員i加5,函數(shù)h(X*)是X的友元函數(shù),實(shí)現(xiàn)對(duì)X的成員i加10。在一個(gè)文件中定義和實(shí)現(xiàn)類(lèi),在另一個(gè)文件中實(shí)現(xiàn)main()函數(shù)。 解: #include “my_x_y_z.h” void main(){ X x;Z z;z.f(&x);} // my_x_y_z.h文件 #ifndef MY_X_Y_Z_H class X;class Y { void g(X*);}; class X { private: int i;public: X(){i=0;} friend void h(X*);friend void Y::g(X*);friend class Z;}; void h(X* x){ x->i =+10;} void Y::g(X* x){ x->i ++;} class Z { public: void f(X* x){ x->i += 5;} }; #endif // MY_X_Y_Z_H 程序運(yùn)行輸出:無(wú) 5-14 定義Boat與Car兩個(gè)類(lèi),二者都有weight屬性,定義二者的一個(gè)友元函數(shù)totalWeight(),計(jì)算二者的重量和。 解: 源程序: #include class Boat;class Car { private: int weight;public: Car(int j){weight = j;} friend int totalWeight(Car &aCar,Boat &aBoat);}; class Boat { private: int weight;public: Boat(int j){weight = j;} friend int totalWeight(Car &aCar,Boat &aBoat);}; int totalWeight(Car &aCar,Boat &aBoat){ return aCar.weight + aBoat.weight;} void main(){ Car c1(4);Boat b1(5); cout << totalWeight(c1,b1)<< endl;} 程序運(yùn)行輸出: 9 5-15 如果在類(lèi)模板的定義中有一個(gè)靜態(tài)數(shù)據(jù)成員,則在程序運(yùn)行中會(huì)產(chǎn)生多少個(gè)相應(yīng)的靜態(tài)變量? 解: 這個(gè)類(lèi)模板的每一個(gè)實(shí)例類(lèi)都會(huì)產(chǎn)生一個(gè)相應(yīng)的靜態(tài)變量。 第 六 章 數(shù)組、指針與字符串 6-1 數(shù)組A[10][5][15]一共有多少個(gè)元素? 解: 10×5×15 = 750 個(gè)元素 1-2 在數(shù)組A[20]中第一個(gè)元素和最后一個(gè)元素是哪一個(gè)? 解: 第一個(gè)元素是A[0],最后一個(gè)元素是A[19]。 6-3 用一條語(yǔ)句定義一個(gè)有五個(gè)元素的整型數(shù)組,并依次賦予1~5的初值。 解: 源程序: int IntegerArray[5] = { 1,2,3,4,5 };或:int IntegerArray[] = { 1,2,3,4,5 }; 6-4 已知有一個(gè)數(shù)組名叫oneArray,用一條語(yǔ)句求出其元素的個(gè)數(shù)。 解: 源程序: nArrayLength = sizeof(oneArray)/ sizeof(oneArray[0]); 6-5 用一條語(yǔ)句定義一個(gè)有5×3個(gè)元素的二維整型數(shù)組,并依次賦予1~15的初值。 解: 源程序: int theArray[5][3] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; 或:int theArray[5][3] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15} }; 6-6 運(yùn)算符*和&的作用是什么? 解: *稱為指針運(yùn)算符,是一個(gè)一元操作符,表示指針?biāo)赶虻膶?duì)象的值;&稱為取地址運(yùn)算符,也是一個(gè)一元操作符,是用來(lái)得到一個(gè)對(duì)象的地址。 6-7 什么叫做指針?指針中儲(chǔ)存的地址和這個(gè)地址中的值有何區(qū)別? 解: 指針是一種數(shù)據(jù)類(lèi)型,具有指針類(lèi)型的變量稱為指針變量。指針變量存放的是另外一個(gè)對(duì)象的地址,這個(gè)地址中的值就是另一個(gè)對(duì)象的內(nèi)容。 6-8 定義一個(gè)整型指針,用new語(yǔ)句為其分配包含10個(gè)整型元素的地址空間。 解: 源程序: int *pInteger = new int[10]; 6-9 在字符串”Hello,world!”中結(jié)束符是什么? 解: 是NULL字符。 6-10 定義一個(gè)有五個(gè)元素的整型數(shù)組,在程序中提示用戶輸入元素值,最后再在屏幕上顯示出來(lái)。 解: 源程序: #include int main(){ int myArray[5];int i;for(i=0;i<5;i++){ cout << “Value for myArray[” << i << “]: ”;cin >> myArray[i];} for(i = 0;i<5;i++)cout << i << “: ” << myArray[i] << “n”;return 0;} 程序運(yùn)行輸出: Value for myArray[0]: 2 Value for myArray[1]: 5 Value for myArray[2]: 7 Value for myArray[3]: 8 Value for myArray[4]: 3 0: 2 1: 5 2: 7 3: 8 4: 3 6-11 引用和指針有何區(qū)別?何時(shí)只能使用指針而不能使用引用? 解: 引用是一個(gè)別名,不能為NULL值,不能被重新分配;指針是一個(gè)存放地址的變量。當(dāng)需要對(duì)變量重新賦以另外的地址或賦值為NULL時(shí)只能使用指針。 6-12 聲明下列指針:float類(lèi)型變量的指針pFloat,char類(lèi)型的指針pString和struct customer型的指針prec。 解: float *pfloat;char *pString; struct customer *prec; 6-13 給定float類(lèi)型的指針fp,寫(xiě)出顯示fp所指向的值的輸出流語(yǔ)句。 解: cout << “Value == ” << *fp; 6-14 程序中定義一個(gè)double類(lèi)型變量的指針。分別顯示指針占了多少字節(jié)和指針?biāo)傅淖兞空剂硕嗌僮止?jié)。 解: double *counter; cout << “nSize of pointer == ”sizeof(counter);cout << 'nSize of addressed value == “< 6-15 const int * p1 和 int * const p2的區(qū)別是什么?解: const int * p1 聲明了一個(gè)指向整型常量的指針p1,因此不能通過(guò)指針p1來(lái)改變它所指向的整型值;int * const p2聲明了一個(gè)指針型常量,用于存放整型變量的地址,這個(gè)指針一旦初始化后,就不能被重新賦值了。 6-16 定義一個(gè)整型變量a,一個(gè)整型指針p,一個(gè)引用r,通過(guò)p把a(bǔ)的值改為10,通過(guò)r把a(bǔ)的值改為5 解: void main(){ int a;int *p = &a;int &r = a;*p = 10;r = 5;} 6-17 下列程序有何問(wèn)題,請(qǐng)仔細(xì)體會(huì)使用指針時(shí)應(yīng)避免出現(xiàn)這個(gè)的問(wèn)題。 #include 解: 指針p沒(méi)有初始化,也就是沒(méi)有指向某個(gè)確定的內(nèi)存單元,它指向內(nèi)存中的一個(gè)隨機(jī)地址,給這個(gè)隨機(jī)地址賦值是非常危險(xiǎn)的。 6-18 下列程序有何問(wèn)題,請(qǐng)改正;仔細(xì)體會(huì)使用指針時(shí)應(yīng)避免出現(xiàn)的這個(gè)問(wèn)題。#include int Fn1(){ int * p = new int(5);return *p;} 解: 此程序中給*p分配的內(nèi)存沒(méi)有被釋放掉。改正: #include int *a = Fn1(); cout << ”the value of a is: “ << *a;delete a;return 0;} int* Fn1(){ int * p = new int(5);return p;} 6-19 聲明一個(gè)參數(shù)為整型,返回值為長(zhǎng)整型的函數(shù)指針;聲明類(lèi)A的一個(gè)成員函數(shù)指針,其參數(shù)為整型,返回值長(zhǎng)整型。 解: long(* p_fn1)(int);long(A::*p_fn2)(int); 6-20 實(shí)現(xiàn)一個(gè)名為SimpleCircle的簡(jiǎn)單圓類(lèi),其數(shù)據(jù)成員int *itsRadius為一個(gè)指向其半徑值的指針,設(shè)計(jì)對(duì)數(shù)據(jù)成員的各種操作,給出這個(gè)類(lèi)的完整實(shí)現(xiàn)并測(cè)試這個(gè)類(lèi)。 解: 源程序: #include class SimpleCircle { public: SimpleCircle();SimpleCircle(int);SimpleCircle(const SimpleCircle &);~SimpleCircle(){} void SetRadius(int);int GetRadius()const; private: int *itsRadius;}; SimpleCircle::SimpleCircle(){ itsRadius = new int(5);} SimpleCircle::SimpleCircle(int radius){ itsRadius = new int(radius);} SimpleCircle::SimpleCircle(const SimpleCircle & rhs){ int val = rhs.GetRadius();itsRadius = new int(val);} int SimpleCircle::GetRadius()const { return *itsRadius;} int main(){ SimpleCircle CircleOne, CircleTwo(9);cout << ”CircleOne: “ << CircleOne.GetRadius()<< endl;cout << ”CircleTwo: “ << CircleTwo.GetRadius()<< endl;return 0;}程序運(yùn)行輸出: CircleOne: 5 CircleTwo: 9 6-21 編寫(xiě)一個(gè)函數(shù),統(tǒng)計(jì)一個(gè)英文句子中字母的個(gè)數(shù),在主程序中實(shí)現(xiàn)輸入、輸出。 解: 源程序: #include int count(char *str){ int i,num=0; for(i=0;str[i];i++){ if((str[i]>='a' && str[i]<='z')||(str[i]>='A' && str[i]<='Z'))num++;} return num;} void main(){ char text[100]; cout << ”輸入一個(gè)英語(yǔ)句子:“ << endl;gets(text); cout << ”這個(gè)句子里有“ << count(text)<< ”個(gè)字母?!?<< endl;} 程序運(yùn)行輸出: 輸入一個(gè)英語(yǔ)句子: It is very interesting!這個(gè)句子里有19個(gè)字母。 6-22 編寫(xiě)函數(shù)int index(char *s,char *t),返回字符串t 在字符串s中出現(xiàn)的最左邊的位置,如果在s中沒(méi)有與t匹配的子串,就返回-1。 解: 源程序: #include int index(char *s, char *t){ int i,j,k; for(i = 0;s[i]!= '