第一篇:C語言程序設計(鄭莉)課后習題答案
C++語言程序設計(清華大學鄭莉)課后習題答案
第 一 章 概述
1-1 簡述計算機程序設計語言的發展歷程。
解:
迄今為止計算機程序設計語言的發展經歷了機器語言、匯編語言、高級語言等階段,C++語言是一種面向對象的編程語言,也屬于高級語言。
1-2 面向對象的編程語言有哪些特點?
解:
面向對象的編程語言與以往各種編程語言有根本的不同,它設計的出發點就是為了能更直接的描述客觀世界中存在的事物以及它們之間的關系。面向對象的編程語言將客觀事物看作具有屬性和行為的對象,通過抽象找出同一類對象的共同屬性(靜態特征)和行為(動態特征),形成類。通過類的繼承與多態可以很方便地實現代碼重用,大大縮短了軟件開發周期,并使得軟件風格統一。因此,面向對象的編程語言使程序能夠比較直接地反問題域的本來面目,軟件開發人員能夠利用人類認識事物所采用的一般思維方法來進行軟件開發。C++語言是目前應用最廣的面向對象的編程語言。
1-3 什么是結構化程序設計方法?這種方法有哪些優點和缺點?
解:
結構化程序設計的思路是:自頂向下、逐步求精;其程序結構是按功能劃分為若干個基本模塊;各模塊之間的關系盡可能簡單,在功能上相對獨立;每一模塊內部均是由順序、選擇和循環三種基本結構組成;其模塊化實現的具體方法是使用子程序。結構化程序設計由于采用了模塊分解與功能抽象,自頂向下、分而治之的方法,從而有效地將一個較復雜的程序系統設計任務分解成許多易于控制和處理的子任務,便于開發和維護。雖然結構化程序設計方法具有很多的優點,但它仍是一種面向過程的程序設計方法,它把數據和處理數據的過程分離為相互獨立的實體。當數據結構改變時,所有相關的處理過程都要進行相應的修改,每一種相對于老問題的新方法都要帶來額外的開銷,程序的可重用性差。
由于圖形用戶界面的應用,程序運行由順序運行演變為事件驅動,使得軟件使用起來越來越方便,但開發起來卻越來越困難,對這種軟件的功能很難用過程來描述和實現,使用面向過程的方法來開發和維護都將非常困難。
1-4 什么是對象?什么是面向對象方法?這種方法有哪些特點?
解:
從一般意義上講,對象是現實世界中一個實際存在的事物,它可以是有形的,也可以是無形的。對象是構成世界的一個獨立單位,它具有自己的靜態特征和動態特征。面向對象方法中的對象,是系統中用來描述客觀事物的一個實體,它是用來構成系統的一個基本單位,由一組屬性和一組行為構成。面向對象的方法將數據及對數據的操作方法放在一起,作為一個相互依存、不可分離的整體--對象。對同類型對象抽象出其共性,形成類。類中的大多數數據,只能用本類的方法進行處理。類通過一個簡單的外部接口,與外界發生關系,對象與對象之間通過消息進行通訊。這樣,程序模塊間的關系更為簡單,程序模塊的獨立性、數據的安全性就有了良好的保障。通過實現繼承與多態性,還可以大大提高程序的可重用性,使得軟件的開發和維護都更為方便。
面向對象方法所強調的基本原則,就是直接面對客觀存在的事物來進行軟件開發,將人們在日常生活中習慣的思維方式和表達方式應用在軟件開發中,使軟件開發從過分專業化的方法、規則和技巧中回到客觀世界,回到人們通常的思維。
1-5 什么叫做封裝?
解:
封裝是面向對象方法的一個重要原則,就是把對象的屬性和服務結合成一個獨立的系統單位,并盡可能隱蔽對象的內部細節。
1-6 面向對象的軟件工程包括哪些主要內容?
解:
面向對象的軟件工程是面向對象方法在軟件工程領域的全面應用,它包括面向對象的分析(OOA)、面向對象的設計(OOD)、面向對象的編程(OOP)、面向對象的測試(OOT)和面向對象的軟件維護(OOSM)等主要內容。
1-7 簡述計算機內部的信息可分為幾類?
解:
計算機內部的信息可以分成控制信息和數據信息二大類;控制信息可分為指令和控制字兩類;數據信息可分為數值信息和非數值信息兩類。
1-8 什么叫二進制?使用二進制有何優點和缺點?
解:
二進制是基數為2,每位的權是以2 為底的冪的進制,遵循逢二進一原則,基本符號為0和1。采用二進制碼表示信息,有如下幾個優點:1.易于物理實現;2.二進制數運算簡單;3.機器可靠性高;4.通用性強。其缺點是它表示數的容量較小,表示同一個數,二進制較其他進制需要更多的位數。
1-9 請將以下十進制數值轉換為二進制和十六進制補碼:(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 請將以下數值轉換為十進制:
(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 簡要比較原碼、反碼、補碼等幾種編碼方法。
解:
原碼:將符號位數字化為 0 或 1,數的絕對值與符號一起編碼,即所謂“符號──絕對值表示”的編碼。正數的反碼和補碼與原碼表示相同。負數的反碼與原碼有如下關系:
符號位相同(仍用1表示),其余各位取反(0變1,1變0)。補碼由該數反碼的最末位加1求得。
第 二 章 C++簡單程序設計
2-1 C++語言有那些主要特點和優點?
解:
C++語言的主要特點表現在兩個方面,一是全面兼容C,二是支持面向對象的方法。C++是一個更好的C,它保持了C的簡潔、高效、接近匯編語言、具有良好的可讀性和可移植性等特點,對C的類型系統進行了改革和擴充,因此C++比C更安全,C++的編譯系統能檢查出更多的類型錯誤。C++語言最重要的特點是支持面向對象。
2-2 下列標識符哪些是合法的?
Program,-page,_lock,test2,3in1,@mail,A_B_C_D
解:
Program,_lock,test2,A_B_C_D是合法的標識符,其它的不是。
2-3 例2.1中每條語句的作用是什么? #include
cout<<“Hello!n”;cout<<“Welcome to c++!n”;}
解:
#include
//嵌入到該程序中該指令所在的地方
void main()//主函數名,void 表示函數沒有返回值 { //函數體標志
cout<<“Hello!n”;//輸出字符串Hello!到標準輸出設備(顯示器)上。
cout<<“Welcome to c++!n”;//輸出字符串Welcome to c++!} 在屏幕輸出如下: Hello!Welcome to c++!
2-4 使用關鍵字const而不是#define語句的好處有哪些?
解:
const定義的常量是有類型的,所以在使用它們時編譯器可以查錯;而且,這些變量在調試時仍然是可見的。
2-5 請寫出C++語句聲明一個常量PI,值為3.1416;再聲明一個浮點型變量a,把PI的值賦給a。
解:
const float PI = 3.1416;float a = PI;
2-6 在下面的枚舉類型中,Blue的值是多少?
enum COLOR { WHITE,BLACK = 100,RED,BLUE,GREEN = 300 };
解: Blue = 102
2-7 注釋有什么作用?C++中有哪幾種注釋的方法?他們之間有什么區別?
解:
注釋在程序中的作用是對程序進行注解和說明,以便于閱讀。編譯系統在對源程序進行編譯時不理會注釋部分,因此注釋對于程序的功能實現不起任何作用。而且由于編譯時忽略注釋部分,所以注釋內容不會增加最終產生的可執行程序的大小。適當地使用注釋,能夠提高程序的可讀性。在C++中,有兩種給出注釋的方法:一種是延用C語言方法,使用“/*”和“*/”括起注釋文字。另一種方法是使用“//”,從“//”開始,直到它所在行的行尾,所有字符都被作為注釋處理。
2-8 什么叫做表達式?x = 5 + 7是一個表達式嗎?它的值是多少?
解:
任何一個用于計算值的公式都可稱為表達式。x = 5 + 7是一個表達式,它的值為12。
2-9 下列表達式的值是多少? 1.201 / 4 2.201 % 4 3.201 / 4.0
解: 1. 50 2. 1 3. 50.25
2-10 執行完下列語句后,a、b、c三個變量的值為多少? a = 30;b = a++;c = ++a;
解:
a:32 ; b:30 ; c:32;
2-11 在一個for循環中,可以初始化多個變量嗎?如何實現?
解:
在for循環設置條件的第一個“;”前,用,分隔不同的賦值表達式。例如:
for(x = 0,y = 10;x < 100;x++,y++)
2-12 執行完下列語句后,n的值為多少? int n;for(n = 0;n < 100;n++)
解: n的值為100
2-13 寫一條for語句,計數條件為n從100到200,步長為2;然后用while和do?while語句完成同樣的循環。
解: for循環:
for(int n = 100;n <= 200;n += 2);
while循環: int x = 100;while(n <= 200)n += 2;
do?while循環: int n = 100;do { n += 2;} while(n <= 200);
2-14 if(x = 3)和 if(x = = 3)這兩條語句的差別是什么?
解:
語句if(x = 3)把3賦給x,賦值表達式的值為true,作為if語句的條件;語句if(x == 3)首先判斷x的值是否為3,若相等條件表達式的值為ture,否則為false。
2-15 什么叫做作用域?什么叫做局部變量?什么叫做全局變量,如何使用全局變量?
解:
作用域是一個標識符在程序正文中有效的區域。局部變量,一般來講就是具有塊作用域的變量;全局變量,就是具有文件作用域的變量。
2-16 已知x、y兩個變量,寫一條簡單的if語句,把較小的的值賦給原本值較大的變量。
解: if(x > y)x = y;
else // y > x || y == x y = x;
2-17 修改下面這個程序中的錯誤,改正后它的運行結果是什么?
#include
i = 10;/* 給i賦值 j = 20;/* 給j賦值 */
cout << “i + j = << i + j;/* 輸出結果 */ return 0;}
解: 改正:
#include
i = 10;// 給i賦值 j = 20;/* 給j賦值 */
cout << ”i + j = “ << i + j;/* 輸出結果 */ return 0;}
程序運行輸出: i + j = 30
2-18 編寫一個程序,運行時提示輸入一個數字,再把這個數字顯示出來。
解: 源程序:
#include
int main(){ int i;cout << ”請輸入一個數字:“;cin >> i;cout << ”您輸入一個數字是“ << i << endl;return 0;} 程序運行輸出: 請輸入一個數字:5 您輸入一個數字是5
2-19 C++有哪幾種數據類型?簡述其值域。編程顯示你使用的計算機中的各種數據類型的字節數。
解: 源程序:
#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;} 程序運行輸出:
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;}
程序運行輸出:
!”#$%G'()*+,./0123456789:;<>?@ABCDEFGHIJKLMNOP_QRSTUVWXYZ[]^'abcdefghijklmnopqrstuvwxyz<|>~s
2-21 運行下面的程序,觀察其輸出,與你的設想是否相同? #include
unsigned int x;unsigned int y = 100;unsigned int z = 50;x= yy;
cout << “nNow difference is: ” << x < 解: 程序運行輸出: Difference is: 50 Now difference is: 4294967246 注意,第二行的輸出并非-50,注意x、y、z的數據類型。 2-22 運行下面的程序,觀察其輸出,體會i++與++i的差別。#include auto存儲類型:采用堆棧方式分配內存空間,屬于一時性存儲,其存儲空間可以被若干變量多次覆蓋使用; register存儲類型:存放在通用寄存器中; extern存儲類型:在所有函數和程序段中都可引用; static存儲類型:在內存中是以固定地址存放的,在整個程序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;} 解: 程序運行輸出: 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 什么叫常量?什么叫變量? 解: 所謂常量是指在程序運行的整個過程中其值始終不可改變的量,除了用文字表示常量外,也可以為常量命名,這就是符號常量;在程序的執行過程中其值可以變化的量稱為變量,變量是需要用名字來標識的。 2-24 變量有哪幾種存儲類型? 解: 運行期間都有效。 2-25 寫出下列表達式的值: 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,下列各式的結果是什么? 1.a | b32)* 5/9;在主程序中提示用戶輸入一個華氏溫度,轉化后輸出相應的攝氏溫度。 解: 源程序見“實驗指導”部分實驗三 3-9 編寫函數判斷一個數是否是質數,在主程序中實現輸入、輸出。 解: #include int prime(int i);//判一個數是否是質數的函數 void main(){ int i; cout << “請輸入一個整數:”;cin >> i;if(prime(i)) cout << i << “是質數.” << endl;else cout << i << “不是質數.” << 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;} 程序運行輸出: 請輸入一個整數:1151 1151是質數.3-10 編寫函數求兩個整數的最大公約數和最小公倍數。 解: 源程序: #include int fn1(int i,int j);//求最大公約數的函數 void main(){ int i,j,x,y;cout << “請輸入一個正整數:”;cin >> i;cout << “請輸入另一個正整數:”;cin >> j; x = fn1(i,j);y = i * j / x;cout << i << “和” << j << “的最大公約數是:” << x << endl;cout << i << “和” << j << “的最小公倍數是:” << 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;} 程序運行輸出: 請輸入一個正整數:120 請輸入另一個正整數:72 120和72的最大公約數是:24 120和72的最小公倍數是:360 3-11 什么叫作嵌套調用?什么叫作遞歸調用? 解: 函數允許嵌套調用,如果函數1調用了函數2,函數2再調用函數3,便形成了函數的嵌套調用。 函數可以直接或間接地調用自身,稱為遞歸調用。 3-12 在主程序中提示輸入整數n,編寫函數用遞歸的方法求1 + 2 + ? + n的值。 解: #include int fn1(int i); void main(){ int i; cout << “請輸入一個正整數:”;cin >> i; cout << “從1累加到” < 3-13 編寫遞歸函數GetPower(int x,int y)計算x的y次冪,在主程序中實現輸入輸出。 解: 源程序: #include long GetPower(int x,int y){ if(y == 1)return x;else return(x * GetPower(x,y-1));} 程序運行輸出: Enter a number: 3 To what power? 4 3 to the 4th power is 81 3-14 用遞歸的方法編寫函數求Fibonacci 級數,公式為fib(n) = fib(n-1)+ fib(n-2),n>2; fib(1)= fib(2)= 1;觀察遞歸調用的過程。 解: 源程序見“實驗指導”部分實驗三 3-15 用遞歸的方法編寫函數求n階勒讓德多項式的值,在主程序中實現輸入、輸出; 解: #include float p(int n, int x); void main(){ int n,x; cout << “請輸入正整數n:”;cin >> n; cout << “請輸入正整數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;} 程序運行輸出: Area: 3000 Upper Left X Coordinate: 20 4-10 設計一個用于人事管理的People(人員)類。考慮到通用性,這里只抽象出所有類型人員都具有的屬性:number(編號)、sex(性別)、birthday(出生日期)、id(身份證號)等等。其中“出生日期”定義為一個“日期”類內嵌子對象。用成員函數實現對人員信息的錄入和顯示。要求包括:構造函數和析構函數、拷貝構造函數、內聯成員函數、帶缺省形參值的成員函數、聚集。 解: 本題用作實驗四的選做題,因此不給出答案。 4-11 定義一個矩形類,有長、寬兩個屬性,有成員函數計算矩形的面積 解: #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 << “請輸入矩形的長度:”;cin >> length; cout << “請輸入矩形的寬度:”;cin >> width; Rectangle r(length, width); cout << “長為” << length << “寬為” << width << “的矩形的面積為:” << r.GetArea()<< endl;} 程序運行輸出: 請輸入矩形的長度:5 請輸入矩形的寬度:4 長為5寬為4的矩形的面積為:20 4-12 定義一個“數據類型” datatype類,能處理包含字符型、整型、浮點型三種類型的數據,給出其構造函數。解: #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 << “浮點型: ” << f << endl;break;} } void main(){ datatype A('c'), B(12), C(1.44F); A.print();B.print();C.print();} 程序運行輸出: 字符型: c 整型: 12 浮點型: 1.44 4-13 定義一個Circle類,有數據成員半徑Radius,成員函數GetArea(),計算圓的面積,構造一個Circle的對象進行測試。 解: #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 << “請輸入圓的半徑:”;cin >> radius;Circle p(radius); cout << “半徑為” << radius << “的圓的面積為:” << p.GetArea()<< endl;} 程序運行輸出: 請輸入圓的半徑:5 半徑為5的圓的面積為:78.5 4-14 定義一個tree類,有成員ages,成員函數grow(int years)對ages加上years,age()顯示tree對象的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 << “這棵樹的年齡為” << ages << endl;} void main(){ Tree t(12); t.age();t.grow(4);} 程序運行輸出: 這棵樹的年齡為12 這棵樹的年齡為16 第 五 章 C++程序的基本結構 5-1 什么叫做作用域?有哪幾種類型的作用域? 解: 作用域討論的是標識符的有效范圍,作用域是一個標識符在程序正文中有效的區域。C++的作用域分為函數原形作用域、塊作用域(局部作用域)、類作用域和文件作用域.5-2 什么叫做可見性?可見性的一般規則是什么? 解: 可見性是標識符是否可以引用的問題; 可見性的一般規則是:標識符要聲明在前,引用在后,在同一作用域中,不能聲明同名的標識符。對于在不同的作用域聲明的標識符,遵循的原則是:若有兩個或多個具有包含關系的作用域,外層聲明的標識符如果在內層沒有聲明同名標識符時仍可見,如果內層聲明了同名標識符則外層標識符不可見。 5-3 下面的程序的運行結果是什么,實際運行一下,看看與你的設想有何不同。#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”;} 解: 程序運行輸出: 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 假設有兩個無關系的類Engine和Fuel,使用時,怎樣允許Fuel成員訪問Engine中的私有和保護的成員? 解: 源程序: 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 什么叫做靜態數據成員?它有何特點? 解: 類的靜態數據成員是類的數據成員的一種特例,采用static關鍵字來聲明。對于類的普通數據成員,每一個類的對象都擁 有一個拷貝,就是說每個對象的同名數據成員可以分別存儲不同的數值,這也是保證對象擁有自身區別于其它對象的特征的需要,但是靜態數據成員,每個類只要一個拷貝,由所有該類的對象共同維護和使用,這個共同維護、使用也就實現了同一類的不同對象之間的數據共享。 5-6 什么叫做靜態函數成員?它有何特點? 解: 使用static關鍵字聲明的函數成員是靜態的,靜態函數成員屬于整個類,同一個類的所有對象共同維護,為這些對象所共享。靜態函數成員具有以下兩個方面的好處,一是由于靜態成員函數只能直接訪問同一個類的靜態數據成員,可以保證不會對該類的其余數據成員造成負面影響;二是同一個類只維護一個靜態函數成員的拷貝,節約了系統的開銷,提高程序的運行效率。 5-7 定義一個Cat類,擁有靜態數據成員HowManyCats,記錄Cat的個體數目;靜態成員函數GetHowMany(),存取HowManyCats。設計程序測試這個類,體會靜態數據成員和靜態成員函數的用法。 解: 源程序: #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”;} 程序運行輸出: 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 什么叫做友元函數?什么叫做友元類? 解: 友元函數是使用friend關鍵字聲明的函數,它可以訪問相應類的保護成員和私有成員。友元類是使用friend關鍵字聲明的類,它的所有成員函數都是相應類的友元函數。 5-9 如果類A是類B的友元,類B是類C的友元,類D是類A的派生類,那么類B是類A的友元嗎?類C是類A的友元嗎?類D是類B的友元嗎? 解: 類B不是類A的友元,友元關系不具有交換性; 類C不是類A的友元,友元關系不具有傳遞性; 類D不是類B的友元,友元關系不能被繼承。 5-10 靜態成員變量可以為私有的嗎?聲明一個私有的靜態整型成員變量。 解: 可以,例如: private: static int a; 5-11 在一個文件中定義一個全局變量n,主函數main(),在另一個文件中定義函數fn1(),在main()中對n賦值,再調用fn1(),在fn1()中也對n賦值,顯示n最后的值。 解: #include void main(){ n = 20;fn1(); cout << “n的值為” < // fn1.h文件 extern int n; void fn1(){ n=30;} 程序運行輸出: n的值為30 5-12 在函數fn1()中定義一個靜態變量n,fn1()中對n的值加1,在主函數中,調用fn1()十次,顯示n的值。 解: #include void fn1(){ static int n = 0;n++;cout << “n的值為” << n < void main(){ for(int i = 0;i < 10;i++)fn1();} 程序運行輸出: n的值為1 n的值為2 n的值為3 n的值為4 n的值為5 n的值為6 n的值為7 n的值為8 n的值為9 n的值為10 5-13 定義類X、Y、Z,函數h(X*),滿足:類X有私有成員i,Y的成員函數g(X*)是X的友元函數,實現對X的成員i加1,類Z是類X的友元類,其成員函數f(X*)實現對X的成員i加5,函數h(X*)是X的友元函數,實現對X的成員i加10。在一個文件中定義和實現類,在另一個文件中實現main()函數。 解: #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 程序運行輸出:無 5-14 定義Boat與Car兩個類,二者都有weight屬性,定義二者的一個友元函數totalWeight(),計算二者的重量和。 解: 源程序: #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;} 程序運行輸出: 9 5-15 如果在類模板的定義中有一個靜態數據成員,則在程序運行中會產生多少個相應的靜態變量? 解: 這個類模板的每一個實例類都會產生一個相應的靜態變量。 第 六 章 數組、指針與字符串 6-1 數組A[10][5][15]一共有多少個元素? 解: 10×5×15 = 750 個元素 1-2 在數組A[20]中第一個元素和最后一個元素是哪一個? 解: 第一個元素是A[0],最后一個元素是A[19]。 6-3 用一條語句定義一個有五個元素的整型數組,并依次賦予1~5的初值。 解: 源程序: int IntegerArray[5] = { 1,2,3,4,5 };或:int IntegerArray[] = { 1,2,3,4,5 }; 6-4 已知有一個數組名叫oneArray,用一條語句求出其元素的個數。 解: 源程序: nArrayLength = sizeof(oneArray)/ sizeof(oneArray[0]); 6-5 用一條語句定義一個有5×3個元素的二維整型數組,并依次賦予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 運算符*和&的作用是什么? 解: *稱為指針運算符,是一個一元操作符,表示指針所指向的對象的值;&稱為取地址運算符,也是一個一元操作符,是用來得到一個對象的地址。 6-7 什么叫做指針?指針中儲存的地址和這個地址中的值有何區別? 解: 指針是一種數據類型,具有指針類型的變量稱為指針變量。指針變量存放的是另外一個對象的地址,這個地址中的值就是另一個對象的內容。 6-8 定義一個整型指針,用new語句為其分配包含10個整型元素的地址空間。 解: 源程序: int *pInteger = new int[10]; 6-9 在字符串”Hello,world!”中結束符是什么? 解: 是NULL字符。 6-10 定義一個有五個元素的整型數組,在程序中提示用戶輸入元素值,最后再在屏幕上顯示出來。 解: 源程序: #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;} 程序運行輸出: 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 引用和指針有何區別?何時只能使用指針而不能使用引用? 解: 引用是一個別名,不能為NULL值,不能被重新分配;指針是一個存放地址的變量。當需要對變量重新賦以另外的地址或賦值為NULL時只能使用指針。 6-12 聲明下列指針:float類型變量的指針pFloat,char類型的指針pString和struct customer型的指針prec。 解: float *pfloat;char *pString; struct customer *prec; 6-13 給定float類型的指針fp,寫出顯示fp所指向的值的輸出流語句。 解: cout << “Value == ” << *fp; 6-14 程序中定義一個double類型變量的指針。分別顯示指針占了多少字節和指針所指的變量占了多少字節。 解: double *counter; cout << “nSize of pointer == ”sizeof(counter);cout << 'nSize of addressed value == “< 6-15 const int * p1 和 int * const p2的區別是什么?解: const int * p1 聲明了一個指向整型常量的指針p1,因此不能通過指針p1來改變它所指向的整型值;int * const p2聲明了一個指針型常量,用于存放整型變量的地址,這個指針一旦初始化后,就不能被重新賦值了。 6-16 定義一個整型變量a,一個整型指針p,一個引用r,通過p把a的值改為10,通過r把a的值改為5 解: void main(){ int a;int *p = &a;int &r = a;*p = 10;r = 5;} 6-17 下列程序有何問題,請仔細體會使用指針時應避免出現這個的問題。 #include 解: 指針p沒有初始化,也就是沒有指向某個確定的內存單元,它指向內存中的一個隨機地址,給這個隨機地址賦值是非常危險的。 6-18 下列程序有何問題,請改正;仔細體會使用指針時應避免出現的這個問題。#include int Fn1(){ int * p = new int(5);return *p;} 解: 此程序中給*p分配的內存沒有被釋放掉。改正: #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 聲明一個參數為整型,返回值為長整型的函數指針;聲明類A的一個成員函數指針,其參數為整型,返回值長整型。 解: long(* p_fn1)(int);long(A::*p_fn2)(int); 6-20 實現一個名為SimpleCircle的簡單圓類,其數據成員int *itsRadius為一個指向其半徑值的指針,設計對數據成員的各種操作,給出這個類的完整實現并測試這個類。 解: 源程序: #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;}程序運行輸出: CircleOne: 5 CircleTwo: 9 6-21 編寫一個函數,統計一個英文句子中字母的個數,在主程序中實現輸入、輸出。 解: 源程序: #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 << ”輸入一個英語句子:“ << endl;gets(text); cout << ”這個句子里有“ << count(text)<< ”個字母。“ << endl;} 程序運行輸出: 輸入一個英語句子: It is very interesting!這個句子里有19個字母。 6-22 編寫函數int index(char *s,char *t),返回字符串t 在字符串s中出現的最左邊的位置,如果在s中沒有與t匹配的子串,就返回-1。 解: 源程序: #include int index(char *s, char *t){ int i,j,k; for(i = 0;s[i]!= '
主站蜘蛛池模板:
巨胸喷奶水视频www免费网站|
国产啪精品视频网站丝袜|
久久国产精品人妻丝袜|
人妻无码手机在线中文|
伦人伦xxx国产对白|
国内精品国产成人国产三级|
久久综合久久综合九色|
亚洲中文波霸中文字幕|
亚洲色成人网站www永久小说|
国产精品 高清 尿 小便 嘘嘘|
乌克兰粉嫩xxx极品hd|
欧美巨大另类极品videosbest|
中文字幕亚洲欧美专区|
亚洲愉拍99热成人精品|
亚洲国产综合精品一区|
亚洲s色大片在线观看|
欧美成人精品三级网站|
午夜在线a亚洲v天堂网2018|
制服丝袜av无码专区完整版|
中出人妻中文字幕无码|
成人国内精品久久久久一区|
亚洲国产精品无码久久一线|
少妇无码一区二区二三区|
东京热人妻中文无码av|
精精国产xxxx视频在线播放|
国产精品爽爽久久久久久无码|
精品免费人成视频网|
国产日韩精品一区二区三区在线|
欧洲人免费视频网站在线|
欧美不卡一卡二卡三卡|
免费国产线观看免费观看|
国产在线午夜卡精品影院|
国产av无码专区亚洲草草|
国产三级aⅴ在在线观看|
成年美女黄的视频网站|
国产乱子夫妻xx黑人xyx真爽|
国产亚洲综合aa系列|
国产综合久久久久鬼色|
性激烈的欧美三级视频|
亚洲日本va中文字幕人妖|
国产精品自产拍在线观看免费|