華工C++課后習(xí)題及其解答(第3版))

華工C++課后習(xí)題及其解答(第3版))

ID:83046009

大?。?37.99 KB

頁數(shù):138頁

時間:2023-09-20

上傳者:無敵小子
華工C++課后習(xí)題及其解答(第3版))_第1頁
華工C++課后習(xí)題及其解答(第3版))_第2頁
華工C++課后習(xí)題及其解答(第3版))_第3頁
華工C++課后習(xí)題及其解答(第3版))_第4頁
華工C++課后習(xí)題及其解答(第3版))_第5頁
華工C++課后習(xí)題及其解答(第3版))_第6頁
華工C++課后習(xí)題及其解答(第3版))_第7頁
華工C++課后習(xí)題及其解答(第3版))_第8頁
華工C++課后習(xí)題及其解答(第3版))_第9頁
華工C++課后習(xí)題及其解答(第3版))_第10頁
資源描述:

《華工C++課后習(xí)題及其解答(第3版))》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

。習(xí)題1及其解答1.1選擇題1.一個最簡單的C++程序,可以只有一個(C)。(a)庫函數(shù)(b)自定義函數(shù)(c)main函數(shù)(d)空函數(shù)2.用C++語棄編制的源程序要變?yōu)槟繕?biāo)程序必須要經(jīng)過(d)。(a)解釋⑹匯編(c)編輯(d)編譯3.C++程序中的簡單語句必須以(b)結(jié)束。(a)冒號(b)分號(c)空格(d)花括號4.有說明inta=0;doublex=5.16;以下語句中,(c)屬于編譯錯誤。(a)x=a/x;(b)x=x/a;(c)a=a%x;(d)x=x*a;5.執(zhí)行C++程序時出現(xiàn)的“溢出”錯誤屬于(c)錯誤。(a)編譯(b)連接(c)運行(d)邏輯6.下列選項中,全部都是C++關(guān)鍵字的選項為(c)。(a)whileIFStatic(b)breakchargo(c)sizeofcaseextern(d)switchfloatinteger7.按C++標(biāo)識符的語法規(guī)定,合法的標(biāo)識符是(a(a)_abc(b)new(c)n(d)"age"8.C++語句中,兩個標(biāo)識符之間(a)不熊作為C++的分隔符。(a)數(shù)字(b);(c):(d)+9.卜列正確的八進(jìn)制整型常量表示是(b).(a)OaO(b)015(c)080(d)0x1010.下列錯誤的十六進(jìn)制整型常量表示是(c)(.(a)0x11(b)Oxaf(c)Oxg(d)OxlfH.在下列選項中,全部都合法的浮點型數(shù)據(jù)的選項為(b)o(b)-le3.515.2e-4(b)12.34-le+50.IE-12(c)0.2e-2-12345.e-5(d)5.0e(l+4)0.18e+212.卜列正確的字符常量為(d)?(a)"a"(b)'name'(c)a(d)*\101,13.下列選項中,(d)不能交換變量a和b的值。(a)t=b;b=a;a=t;(b)a=a+b;b=a-b;a=a-b;(c)t=a;a=b;b=t;(d)a=b;b=a;14.關(guān)丁下列語句敘述錯誤的是(ainti=10,*p=4i;(a)p的值為10(b)p指向整型變量i(c)*「表示變量i的值(d)p的值是變量i的地址15.有以下變量說明,下面不正確的賦值語句是(b)。inta=5,b=10,c;int*pl=&a,*p2=&b;(b)pl=a:(a)*p2=b:

1(c)p2=pl:16.有以下變最說明,下面正確的語句是(inta=10,b;int&pa=a,&pb=b;(a)&pb=a;(b)pb=pa;17.執(zhí)行卜.面語句序列后,a和b的值分別為(inta=5,b=3,t;int&ra=a;int&rb=b;t=ra;ra=rb;rb=t;(a)3和318.在下列運算符中,((a)<=(b)3和5d)優(yōu)先級最高。(b)?=19.在下列運和符中,(d)優(yōu)先級最低。(a)!(b)&&20.設(shè)inti=l,j=2;則表達(dá)式i+++j的值為((a)1(b)2(c)321.設(shè)inti=l,j=2;則表達(dá)式++i+j的值為((a)1(b)2(c)322.在卜列表達(dá)式選項中,(c)是正確。(a)++(a++)(b)a++b(d)c=*pl?(*p2);b)”(c)pb=&pa;b).(c)5和3(c)+(c)!=c)o(d)4d).(d)4(c)a+++b(d)*pb=*pa(d)5和5(d)*(d)?:(d)a++++b23.已知inti=0,j=l,k=2;則邏輯表達(dá)式++i|-j&&++k的值為(b).(a)0(b)124.執(zhí)行下列語句后,x的值是((c)23y的值是(c).(d)3intx,y;x=y=1;++x||++y;(a)不確定(b)0(c)1(d)225.設(shè)x為整型變量,不般正確表達(dá)數(shù)學(xué)關(guān)系L=5)26.已知intx=5;執(zhí)行下列語句后,x的值為(c)。x+=x-=x*x;(a)25(b)40(c)-40(d)2027.設(shè)inta=l,b=2,c=3,d=4:則以下條件表達(dá)式的值為(a).a

21.2把下列數(shù)學(xué)表達(dá)式寫成C++算術(shù)表達(dá)式1.12.x{x[x(ax+b)+c]+d}+e11+r~1+x+y3.In<1+|a|10)4.Ji-i--cos48"a-bV21—25.cot/-)6.lg(a2+ab+b2)1+X2【解答】1.1/(1+1/(1+l/(x+y)))2.x*(x*(x*(a*x+b)+c)+d)+e3.log(1+pow(fabs((a+b)/(a-b)),10)4.sqrt(1+3.14159/2?cos(48?3.14159/180))5.l/tan((1-x*x)/(1+x*x))或者cos((I-x*x)/(1+x*x))/sin((1-x*x)/(1+x*x))6.Iogl0(a*a+a*b+b*b)1.3用邏輯表達(dá)式表示下列條件Li被j整除2.n是小于正整數(shù)k的偶數(shù)3.lWx<104.x,y其中有一個小于z5.y-[-100,-10],并且y任[10,100]6.坐標(biāo)點(x,y)落在以(10,20)為圓心,以35為半徑的圓內(nèi)7.三條邊a,b和c構(gòu)成三角形8.年份Year能被4整除,但不能被100整除或者能被400整除【解答】1.i%j=02.(n=-100&&y<=-10)&&!(y>=10&&y<=100)6.sqrt(pow((x10),2)+pow((y-20),2))<357.a+b〉c&&b+c>a&&c+a>b8.(year%4==0)&&(year%100!=0)11(year%400=0)1-4閱讀下列程序,寫出執(zhí)行結(jié)果1.#includeusingnamespacestd;intmain()(inta=1,b=2:boolx,y頭文件——標(biāo)準(zhǔn)輸入輸出因為頭文件iostream所以命名空間有局限性只能使用std主程序入口定義整型常量ab定義布爾值

3cout?(a++)+(++b)<b;y=a-&&b;cout?x?endl;cout?y?endl;)【解答】4201#includeusingnamespacestd:intmain(){intx,y,z,f;x=y=z=1;f=xIIy-&&z++;cout?*x=*?x?endl;cout?*y=*?y<#includeusingnamespacestd:intmainO{inta=123;int&ra=a;int*pa=&a;cout<

41.什么叫數(shù)據(jù)類型?變量的類型定義有什么作用?【解答】數(shù)據(jù)“類型”是對數(shù)據(jù)的抽象。類型相同的數(shù)據(jù)有相同的表示形式、存儲格式以及相關(guān)的操作。定義一個變量時,計和機(jī)根據(jù)變量的類型分配存儲空間,并以該類型解釋存放的數(shù)據(jù)。2.普通數(shù)據(jù)類型變量和指針類型變量的定義、存儲、使用方式上有何區(qū)別?請編寫一個程序驗證之?!窘獯稹孔兞款愋投x存儲使用方式數(shù)據(jù)類型標(biāo)識符數(shù)據(jù)值通過名訪問即宜接訪問對變量內(nèi)容操作指針類型*標(biāo)識符地址值通過指針變量的地址值間址訪問對象驗證程序:ttincludeusingnamespacestd;intmainO{inta,b,c;cout<<*a,b,c=*;cin?a?b?c;〃對普通數(shù)據(jù)類型變量賦值int*pa=&a,*pb=&b,*pc=&c;〃用變量地址值初始化指針變量cout?*a,b,c=*<usingnamespacestd;intmain(){inta;cout<<*a=*:

5cin?a;int*pa=&a;cout?*a的值:*?a?endl;cout?*a的地址:*?&a?endl;cout<<"ra的值:*?ra?endl;cout?*ra的地址:*?&ra?endl;cout?”pa所指向的變局的值:*?*pa<usingnamespacestd;intmainO{inta;cout?*a=*;〃名訪問〃輸出變量地址〃地址訪問,輸出變量值〃說明指針變量,指向變量a〃間址訪問,輸出變量值〃ra是a的引用〃引用訪問,輸出變量a的值cin?a;a=a+5;cout?&a?endl;cout<<*(&a)<

6(1)如果運算符左右操作數(shù)類型相同,運算結(jié)果也是相同類型。(2)如果運算符左右操作數(shù)類型不同,首先把類型較低(存儲要求,示數(shù)能力較低)的數(shù)據(jù)轉(zhuǎn)換成類型較高的數(shù)據(jù),然后運笄。(3)賦值表達(dá)式的類型由被賦值變成的類型決定。當(dāng)把一個表達(dá)式的值賦給一個變量時,系統(tǒng)首先強(qiáng)制把運算值轉(zhuǎn)換成變量的類型,然后執(zhí)行寫操作。6個值等于true的表達(dá)式:(1)b>a&&a>x(2)(a+b)!=x(3)a||(b+x)(4)a==(b*x)(5)a-busingnamespacestd;intmain(){inta=10,b=20;int*p=&a,*q=&b;*p=*p**q;int&ra=a:ra=a;int?&rt=q;*rt=30;cout<<

7b=*<

8*p=*<<*p<<**

9*q=*?*q?*

10ra=*<

11*rt=*?*rt?endl;)【解答】字符和的意義見程序中添加的注擇。4includeusingnamespacestd:intmainO{inta=10,b=20;int*p=&a,*q=&b;//是指針類型說明符,是取址運算符*P=*P**q;〃第1、2、4個是間址訪問符,第3個算術(shù)乘運算符int&ra=a:〃"&”是引用說明符ra=a:int?&rt=q;//是指針類型說明符,“&”是引用說明符

12*rt=30;//是間址訪問符〃輸出語句中的是間址訪問符cout?*a=>?a?*

13b=*?b?*

14*p=*?*p?*

15*q=*?*q<<*

16ra=*?ra?*

17*rt=*?*rt<usingnamespacestd;intmain(){intx,i,j,k;cout?”pleaseinputx:*;cin?x;i=x/100;j=x/10%10;k=x%IO;cout?k?j?i?endl;)2.輸入平面上某點橫坐標(biāo)x和縱坐標(biāo)y,若該點在由圖3.1表示的方塊區(qū)域內(nèi),則輸出1:否則,輸出0。圖1.11正方形【解答】

18習(xí)題2及其解答2.1選擇題1.已知inti=0,x=l,y=0;(a)if(x&&y)i++;(c)if(x||y)i++;-12.設(shè)有函數(shù)關(guān)系為01(a)y=1;if(x>=0)if(x==0)y=0;elsey=-1;(c)if(x<=0)if(x<0)y=-1;elsey=0:elsey=1;usingnamespacestd;intmain(){doublex,y,b;cout?.pleaseinputx,y:*;cin?x?y;b=(-2<=x)&&(x<=2)&&(-2<=y)&&(y<=2);cout?b?endl;)2.輸入三個整數(shù),求出其中最小數(shù)(要求使用條件表達(dá)式)?!窘獯稹?includeusingnamespacestd;intmainO{inta,b,c,temp,min;cout?”pleaseinputa,b,c:*:cin?a?b?c;temp=(a0(b)y=-1;if(x!=0)if(x>0)y=1:elsey=0;(d)y=-1;if(x<=0)if(x<0)y=-1:elsey=1;3.假設(shè)i=2,執(zhí)行下列語句后i的值為(bswitch(i)

19{case1:i++;case2:i—;case3:++i;break;case4:—i;default:i++;)(a)1(b)2(c)3(d)44.已知inti=0,x=0;下面while語句執(zhí)行時循環(huán)次數(shù)為(d).while(!x&&i<3){x++;i++;}(a)4(b)3(c)2(d)15.已知inti=3;卜.面dowhile語句執(zhí)行時循環(huán)次數(shù)為(b)。do{i—;cout?i<=0);(c)inta=5;while(a){a一;};(d)inti=3;for(;i;i—);2.2閱讀下列程序,寫出執(zhí)行結(jié)果1.#includeusingnamespacestd;intmain()(inta,b,c,d,x;a=c=0;b=1;d=20;if(a)d=d-10;elseif(!b)if(!c)x=15:elsex=25;cout?d?endl;}

20【解答】201.#includeusingnamespacestd;intmain(){inta=0,b=1;switch(a){case0:switch(b){case0:cout〈<"a=b=*?b?endl;break;case1:CQUt<<"a="<〈a<<"b=*?b?endl;break:}case1:a++;b++:cout<<*a=*<usingnamespacestd;intmain()(inti=1;while(i<=10)if(++i%3!=1)continue;elsecout?i?endl;}【解答】47104.#includeusingnamespacestd;intmain()

21{inti=0,j=5;do{ifj-;if(i>3)break;}while(j>0);cout?"i="?i?*\t*?*j=*?j?endl;}【解答】i=4j=1#include\t*?j<usingnamespacestd;intmainO(inti,s=0;for(i=0;i<5;i++)switch(i){case0:s+=i;break;case1:s+=i;break:case2:s+=i;break:default:s+=2;)cout<<

22usingnamespacestd;intmain()(inti,j,x=0;for(i=0;i<=3;i++){x++;for(j=0;j<=3;j++)(if(j%2)continue;x++;}x++;}cout?*x=*?x?endl;)【解答】x=162.3思考題1.C++中有什么形式的選擇控制語句?歸納它們語法形式、應(yīng)用場合。根據(jù)一個實際問題使用不同的條件語句編程。【解答】語句使用方式使用場合if語句if(表達(dá)式)語句1;else語句2;需要對給定的條件進(jìn)行判斷,并根據(jù)判斷的結(jié)果選擇不同的操作。適用于復(fù)雜的條件表達(dá)式判斷。switch語句switch(表達(dá)式){case常量表達(dá)式1:語句1;case常量表達(dá)式2:語句2;case常量表達(dá)式n;語句n;[default:語句n+1;])根據(jù)整型表達(dá)式的不同值決定程序分支的情況。適用于判斷表達(dá)式簡單,需要多個分支處理的情況。演示程序:程序(1)〃此程序用if輸出等級對應(yīng)的分?jǐn)?shù)段//A->=90,B-(90,80],C-(80,70],D-(70,60],,E-<60#includeusingnamespacestd;intmainO{chargd;cout<<*Enterthegrade:*;

23cin?gd;〃直到輸入有效等級,否則程序不繼續(xù)運行while(!((gd>=*A*&&gd<=E*)I|(gd>=*a*&&gd<='e')))(cout?*Invalidgrade!Pleaseretry:*;cin?gd;)if(gd=*A*||gd==,a*)cout?*

24Scored90-100!

25*;elseif(gd=='B'||gd=='b')cout?*

26Scored80-89!

27*;elseif(gd==,C,||gd==,c,)cout?*

28Scored70-79!

29*;elseif(gd—*D*|gd=='d')cout?*

30Scored60-69!

31*;elseif(gd==*E*||gd=*e*)cout?*

32Scoreunder60!

33*;elsecout?*Unexpecterror!

34*;〃防止意外錯誤}程序(2)〃此程序用switch輸出等級對應(yīng)的分?jǐn)?shù)段//A->=90,B-(90,80],C-(80,70],D-(70,60],,EY60#includeusingnamespacestd;intmainO{chargd;cout?*Enterthegrade:*;cin?gd;〃直到輸入有效等級,否則程序不繼續(xù)運行while(!((gd>=,A'&&gd<=,E*)||(gd>=,a*&&gd<=,e*))){cout?*lnvalidgrade!Pleaseretry:*;cin>>gd;switch(gd)casea*:cout?*

35Scored90T00!

36”;break;casecasecaseb':cout?*

37Scored80-89!

38*;break;:cout?*

39Scored70-79!

40*;break:d*:cout?*

41Scored60-69!

42*;break;:cout?*

43Scoreunder60!

44*;break;

45default:cout?*Unexpecterror!

46*;〃防止意外錯誤2.什么叫循環(huán)控制?歸納比較C++中各種循環(huán)控制語句的語法、循環(huán)條件和循環(huán)結(jié)束條件的表示形式及執(zhí)行流程?!窘獯稹垦h(huán)控制是在特定的條件下,程序重復(fù)執(zhí)行一些特定動作。語句語法執(zhí)行流程使用場合while語句while(表達(dá)式)循環(huán)體;循環(huán)條件:表達(dá)式值為非0(真)循環(huán)結(jié)束條件:表達(dá)式值為0(假)-><11truealse1程序中常用于根據(jù)條件執(zhí)行操作而不需關(guān)心循環(huán)次數(shù)的情況。先判斷形式循環(huán),條件不成立時不進(jìn)入循環(huán)體。循環(huán)體rwhile語句的執(zhí)行流程程序中常用于根據(jù)條件執(zhí)行語句循環(huán)體while(表達(dá)式);循環(huán)條件:表達(dá)式值為非0(真)循環(huán)結(jié)束條件:表達(dá)式值為0(假)n1操作而不需關(guān)心循環(huán)次數(shù)。后判斷形式循環(huán),至少執(zhí)行1次循環(huán)體。-一般情況,while語句和dowhile語句可以互換使用。循環(huán)體|falsedo_while語句執(zhí)行流程for語句for([表達(dá)式1];[表達(dá)式2];[表達(dá)式3])循環(huán)體;(1)表達(dá)式1稱為初始化表達(dá)式,不是循環(huán)體執(zhí)行部分。(2)表達(dá)式3稱為后置表達(dá)式,作為循環(huán)體的最后一個執(zhí)行表達(dá)式。(3)循環(huán)條件:表達(dá)式2值為非0(真)循環(huán)結(jié)束條件:表達(dá)式2值為0(假)for語句稱為步長循環(huán)語句,通常用于確定循環(huán)次數(shù)的情況。由于語句的3個表達(dá)式均可以缺省,也可以用丁?條件循環(huán),即循環(huán)次數(shù)不確定的情況。表達(dá)式1falsen循環(huán)體表達(dá)式Sfor語句的執(zhí)行流程3.根據(jù)?個實際問題,用不同的循環(huán)語句編程,分析其優(yōu)缺點?!窘獯稹扛?。4.用if語句和goto語句組織循環(huán),改寫思考題的第3小題編寫的程序。分析在什么情況卜可以適當(dāng)使用got。語句。【解答】在不破壞程序基本流程控制的情況下,可以適當(dāng)使用got。語句實現(xiàn)從語句結(jié)構(gòu)內(nèi)部向外的必要跳轉(zhuǎn),即按特定條件結(jié)束結(jié)構(gòu)語句塊的執(zhí)行。

47程序略。2.有以F程序#includeusingnamespacestd;intmainO{charc;cin?c;if(c==,y,I|c='Y')inta=l;elseinta=0;cout?*a=*<usingnamespacestd:intmainO{charc:inta;cin?c:if(c=='y'||c='Y')a=l;elsea=0:cout?*a=*?a?endl;)3.有以下程序,希望判斷兩個輸入的整數(shù)是否相等。程序通過編譯,但不能達(dá)到預(yù)期結(jié)果。請分析程序能夠通過C++編譯而不能得到期望結(jié)果的原因。#includeusingnamespacestd;intmainO{inta,b:cout<<*a:*;cin?a;

48cout<<usingnamespacestd:intmainO(doub1escore;cout?*pleaseinputscore:*:cin?score;if(score>=85)cout?”Verygood!*;elseif(score>=60)cout?*Good!*;elsecout?”Nogood!*;}2.輸入三個整數(shù),按從小到大的順序輸出它們的值。【解答】#includeusingnamespacestd;intmainO(inta,b,c,t;cout?*a,b,c=>:cin?a?b?c;if(a>b){t=a:a=b;b=t;}

49if(a>c){t=a;a=c:c=t:)if(b>c){t=b;b=c;c=t;}cout?a?b?'\t'?c?endl;1.輸入三角形的三條邊,判別它們能否形成三角形,若能,則判斷是等邊、等腰、還是一般三角形。【解答】#includeusingnamespacestd:intmain()(doublea,b,c;cout?"a,b,c=*;cin?a?b?c;if(a+b>c&&b+c>a&&c+a>b){if(a==b&&b==c)cout<<”等邊三角形!*?endl;elseif(a==b||a=c|Ib=c)cout?”等腰三角形!"?endI;elsecout?*?般三角形!"?endl;elsecout?*不能形成三角形!"?endl;}2.輸入百分制成績,并把它轉(zhuǎn)換成五級分制,轉(zhuǎn)換公式為:A(優(yōu)秀)B(良好)90-10080-89grade(級別)={C(中等)70-79D(合格)E(不合格)60-690-59【解答】#includeusingnamespacestd;intmain(){doublescore;chargrade;cout?*score=*;cin?score;if(score>=0&&score<=100){switch(int(score)/10){case10:case9:grade='a';break;case8:grade=*b*;break;case7:grade='c';break;case6:grade='d';break;case5:

50case4:case3:case2:case1:case0:grade=*e,;break;|}else{cout<<“數(shù)據(jù)輸入錯誤!”《endl;gotoend:)cout<usingnamespacestd;intmainO{charfirst,second;cout?"Firstinput(s,rorp)cin?first;cout?.Secondinput(s,rorpcin?second;switch(first){case's':switch(second){case's':cout?*Scissortiesscissor.*?endl;gotoend;case'r':cout?”Scissoriscrushedbyrock.*?endl;gotoend;case'p':cout?”Scissorcutspaper.*?endl;gotoend;default:cout?*secondinputerror!*?endl;gotoend;case'r:switch(second){case's':cout?*Rockcrushesscissor.*?endl;gotoend;case'r':cout?”Rocktiesrock.*?endl;gotoend;case'p':cout?”Rockiswrappedbypaper.*?endl;gotoend;

51default:cout?”secondinputerror!*?endl;gotoend:1case,p':switch(second){case,s*:cout?.Paperiscutbyscissor.*?endl:gotoend;case'r':cout?,Paperwrapstherock.*<usingnamespacestd;intmainO(intm,i=2:cout?,pleaseinputm:*;cin?m;while(i<=m)if(m%i==0){cout?i?*,*;m=m/i;}elseif}6.使用迭代公式七+I=(%+a/x“)/2(n=0,1,2,/=a/2)編程序求某一正整數(shù)a的平方根?!窘獯稹?include#includeusingnamespacestd;intmain(){constdoubleeps=le-8;doublea,xO,x;cout?*pleaseinputa:";cin?a;xO=a/2;x=(xO+a/xO)/2;

52while(fabs(x-xO)>eps){xO=x;x=(xO+a/xO)/2;)cout?x?endl;)8.已知X=0°,10°,20°,???,180°,求sin*,cos*和tan*的值?!窘獯稹?inc1ude#includettincludeusingnamespacestd:intmain(){constdoublepi=3.14159265;inti;doublex,yl,y2,y3;cout<usingnamespacestd;intmainO{inti;for(i=100;i<=2OO;i++){if((i%3==2)&&(i%5=3)&&(i%7=2))cout<

53為水仙花數(shù)。【解答】#includeusingnamespacestd;intmainO{inti,j,s;for(i=l;i<=1000;i++){s=0;for(j=l:jusingnamespacestd;

54intmainO{inti,j,k,n;charch;cout?*llowmanylines?

55*;cin?n;cout<<*Whatcharacter?

56";cin?ch;for(i=l;i<=n:i++){for(k=l;k<=n-i;k++)cout?**;for(j=l:j<=2*i-l;j++)cout?ch;cout?endl;})11.已知XYZ+YZZ=532,其中X,Y和Z為數(shù)字,編一程序求出X,Y和Z的值。【解答】#includeusingnamespacestd;intmainO{intx,y,z,i;for(x=l;x<=9;x++)for(y=l;y<=9;y++)for(z=0:z<=9;z++){i=100*x+10*y+z+100*y+10*z+z;if(i==532)cout<<"x="<<<*z=*?z?endl;

57習(xí)題3及其解答3.1選擇題1.以F正確的函數(shù)原型為(d)。(a)fl(intx;inty);(b)voidfl(x,y);(c)voidfl(intx,y);(d)voidfl(int,int);2.有函數(shù)原型voidfun2(int);下面選項中,不正確的調(diào)用是(c)。(a)inta=21;fun2(a);(b)inta=15;fun2(a*3);(c)intb=100;fun2(&b);(d)fun2(256);3.有函數(shù)原型voidfun3(int?);下面選項中,正確的調(diào)用是(c).(a)doublex=2.17;fun3(&x);(b)inta=15;fun3(a*3.14);(c)intb=100;fun3(&b);(d)fun3(256);4.有函數(shù)原型voidfun4(int&);下面選項中,正確的調(diào)用是(c)。(a)inta=2.17;fun4(&a):(b)inta=15;fun4(a*3.14);(c)intb=100;fun4(b);(d)fun4(256);5.有聲明voidfun5(int*&);inta,*p=&a;下面選項中,正確的調(diào)用是(b)o(a)fun5(&a);(b)fun5(p);6.有聲明intfun6(int),(*pf)(int)=fun6;下面選項中,正確的調(diào)用是(c)o(a)inta=15;intn=fun6(&a);(b)(c)cout?(*pf)(256);(d)7.在VC中,若定義一個函數(shù)的返回類型為void,(a)函數(shù)返回值需要強(qiáng)類型傳換(c)函數(shù)本身沒有返回值8.函數(shù)參數(shù)的默認(rèn)值不允許為(c).(a)全局常量(b)直接常量9.使用重載函數(shù)編程序的目的是(a)<.(a)使用相同的函數(shù)名調(diào)用功能相似的函數(shù)(c)提高程序的運行速度10.下列的描述中(b)是錯誤的。(a)(b)(c)(d)(c)fun5(*a);(d)fun5(*pinta=15:cout?(&pf)(a);cout?*pf(256);以下敘述1E確的是(c).(b)函數(shù)不執(zhí)行任何操作(d)函數(shù)不能修改實際參數(shù)的值(c)局部變量(d)函數(shù)調(diào)用(b)共享程序代碼(d)節(jié)省存貯空間使用全局變量可以從被調(diào)用函數(shù)中獲取多個操作結(jié)果局部變量可以初始化,若不初始化,則系統(tǒng)默認(rèn)它的值為0當(dāng)函數(shù)調(diào)用完后,靜態(tài)局部變量的值不會消失全局變量若不初始化,則系統(tǒng)默認(rèn)它的值為011.下列選項中,(c)的具有文件作用域。

58(d)靜態(tài)變量(a)語句標(biāo)號(b)局部變量(c)全局變量3.2閱讀下列程序,寫出執(zhí)行結(jié)果1.#includeusingnamespacestd;#includeintf(int);intmain()(inti:for(i=0;i<3;i++)cout?f(i)?endl;intf(inta){intb=0,c=1;b++;c++;returnint(a+pow(double(b),2)+c);)【解答】3452.#includeusingnamespacestd;voidfunc(inta,intb,intc=3,intd=4);intmainO(func(10,15,20,30);func(10,11,12);func(12,12);}voidfunc(inta,intb,intc,intd)(cout<\t*?b<<*\t*?c?*\V?d?endl;}【解答】10152030101112412123.#includeusingnamespacestd;

59voidfunc(int,int,int*);intmain()(intx,y,z;func(5,6,&x):func(7,x,&y);func(x,y,&z);cout?x?*,*?y?*,*?z?endl;}voidfunc(inta,intb,int*c){b+=a;*c=b-a;)【解答】6,6,6#inc1udeusingnamespacestd;voidfunc(int,int,int&);intmain(){intx=0,y=l,z=2;func(1,2,x);func(x+y,y,y);func(z,x+y,z);cout?x?*,*?y?*,“<usingnamespacestd;voidfunc(int*,int*,int*&)intmainO(inta=10,b=20;int*p=&a,*q=&b;func(p,q,p);cout?**p=*?*p<<",*q=*?*q?endl;}voidfunc(int*tl,int*t2,int*&rt)(*tl+=5;*t2+=5;

60rt=tl;?rt+=5;cout<usingnamespacestd:intf2(int,int);intfl(inta,intb){intc;a+=a:b+=b;c=f2(a+b,b+1);returnc;}intf2(inta,intb)(intc;c=b%2;returna+c;}intmain(){inta=3,b=4;cout?fl(a,b)<usingnamespacestd;intage(intn)(intf;

61if(n=1)f=10;elsef=age(n-l)+2;returnf;}intmain(){cout?*age:*?age(5)?endl:)【解答】age:18#includeusingnamespacestd;intfl(inta,intb){returna+b;}intf2(inta,intb){returna-b;}intf3(int(*t)(int,int),inta,intb){return()(a,b);}intmainO{int(*p)(int,int);P=fl;cout?f3(p,4,8)?endl;p=f2;cout?f3(p,8,4)?endl;}【解答】124#inc1udeusingnamespacestd;intsub(int,int);inta=1;intmain(){intm=1,n=2,f;f=sub(m,n);cout?a?*\t*?f?endl;f=sub(m,n);cout?a?'\t'?f?endl;}intsub(intc,intd){staticintm=2,n=5;cout?m?*\t*?n?'\t'?endl;

62a=++a;c=m++;d=n++;returnc+d;}【解答】252736393.3思考題1.函數(shù)的作用是什么?如何定義函數(shù)?什么叫函數(shù)原型?【解答】函數(shù)的兩個重要作用:(D任務(wù)劃分,把一個或雜任務(wù)劃分為若干小任務(wù),便于分工處理和驗證程序正確性:(2)軟件重用,把一些功能相同或相近的程序段,獨立編寫成因數(shù),讓應(yīng)用程序隨時調(diào)用,而不需要編寫雷同的代碼。函數(shù)的定義形式:類型函數(shù)名([形式參數(shù)表]){語句序列)函數(shù)原型是函數(shù)聲明,告訴編譯器函數(shù)的接口信息:函數(shù)名、返回數(shù)據(jù)類型、接收的參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序,編譯器根據(jù)函數(shù)原型檢查函數(shù)調(diào)用的正確性。2.什么叫函數(shù)值的返回類型?什么叫函數(shù)的類型?如何通過指向函數(shù)的指針調(diào)用一個已經(jīng)定義的函數(shù)?請寫一個驗證程序說明?!窘獯稹浚?)函數(shù)的返回類型是函數(shù)返回的表達(dá)式的值得類型:(2)函數(shù)類型是指函數(shù)的接口,包括函數(shù)的參數(shù)定義和返回類型:<3)若有functionTypefunctionName;〃functionType是已經(jīng)定義的函數(shù)類型functionType*functionPointer=functionName;//定義函數(shù)指針并獲取函數(shù)地址則可以通過函數(shù)指針調(diào)用函數(shù):(?functionPointer)(argumentList);或functionPointer(argumentList):其中argumentList是實際參數(shù)表。驗證程序:#includeusingnamespacestd;

63intmainO{typedefintmyfunc(int,int);myfuncf,*fp:inta=10,b=6;fp=f;cout?*Usingf(a):*?f(a,b)?endl;〃函數(shù)名調(diào)用函數(shù)cout?*Usingfp(a):*?fp(a,b)?endl;〃函數(shù)指針調(diào)用函數(shù)cout?*Using(*fp)(a):*?(*fp)(a,b)?endl;〃函數(shù)指針調(diào)用函數(shù)return0;)intf(inti,intj){returni*j;}2.什么叫形式參數(shù)?什么叫實際參數(shù)?C++函數(shù)參數(shù)有什么不同的傳遞方式?請寫一個驗證程序說明?!窘獯稹繀?shù)是調(diào)用函數(shù)與被調(diào)用函數(shù)之間交換數(shù)據(jù)的通道。函數(shù)定義首部的參數(shù)稱為形式參數(shù),調(diào)用函數(shù)時使用的參數(shù)稱為實際參數(shù)。C++有三種參數(shù)傳遞機(jī)制:值傳遞(值調(diào)用):指針傳遞(地址調(diào)用):引用傳遞(引用調(diào)用).驗證程序:#includeusingnamespacestd;voidfuncA(inti){i=i+10;}voidfuncB(int*j){*j=*j+20;}voidfuncC(int&k){k=k+30;}intmainO{inta=l;funcA(a);cout?*a=*?a?endl;funcB(fta);cout?>a=*<

64【解答】C++首先計算表達(dá)式的值,然后把該值賦給函數(shù)返P1類型的匿名對象,通過這個對象,把數(shù)值帶回調(diào)用點,維續(xù)執(zhí)行后續(xù)代碼。當(dāng)函數(shù)返回指針類型時,返回的地址值所指對象不能是局部變量。因為局部變量在函數(shù)運行結(jié)束后會被銷毀,返回這個指針是亳無意義的。返回引用的對象不能是局部變量,也不能返回表達(dá)式。算術(shù)表達(dá)式的值被儲存在匿名空間中,函數(shù)運行結(jié)束后會被銷毀,返回這個變量的引用也是無意義的。2.變量的生存期和變量作用域有什么區(qū)別?請舉例說明?!窘獯稹孔兞康纳嫫谑侵赋绦蜻\行后,變量占有內(nèi)存的時間;變量作用域指的是指變量聲明之后,在程序正文中有效的那部分區(qū)域。例如,定義函數(shù):voidcount0{staticintn=0;)該函數(shù)中n被定義為static變量,生存期是整個程序運行時期;但作用域只在count函數(shù)中。3.靜態(tài)局部變量有什么特點?編寫?個應(yīng)用程序,說明靜態(tài)局部變量的作用?!窘獯稹快o態(tài)局部變量的生存期是全程的,作用域是局部的。程序開始執(zhí)行時就分配和初始化存儲空間(默認(rèn)初始化值為0)。定義靜態(tài)局部變量的函數(shù)退出時,系統(tǒng)保持其存儲空間和數(shù)值。下次調(diào)用這個函數(shù)時,static變量還是上次退出函數(shù)時的值。直至整個程序運行結(jié)束,系統(tǒng)才收回存儲空間。程序略。4.在一個語句塊中能否訪問一個外層的同名局部變量?能否訪問一個同名的全局變量?如果可以,應(yīng)該如何訪問?請寫一個驗證程序說明。【解答】一個語句塊中不能訪問外層的同名局部變量。可以訪問一個同名的全局變量。驗證程序:#includeusingnamespacestd:inta=0:〃全局變量aintmainO{inta=l;〃外層局部變量a{inta=2:〃內(nèi)層局部變量acout?*Localais*?a<

65f(a);有人說,因為n是a的引用,在函數(shù)f中訪問n相當(dāng)丁?訪問a,所以,可以在f的函數(shù)體內(nèi)直接使用變量名a。這種說法正確嗎?為什么?請你寫個驗證程序?!窘獯稹啃问絽?shù)n的作用域是f函數(shù),實際參數(shù)a的作用域是調(diào)用「函數(shù)的模塊(例如main函數(shù)),所以在f函數(shù)中可見n而不可見a。因此,這種說法不正確。f函數(shù)內(nèi)不能直接使用變量名a,只能通過別名n訪問a。驗證程序:#includeusingnamespacestd:voidf(int&n);intmainO{inta=1;f(a);cout<<*a=*?a?endl;}voidf(int&n)(a++;〃錯誤,直接使用an++;〃正確)產(chǎn)生編譯錯誤:errorC2065:“a”:未聲明的標(biāo)識符2.有函數(shù)原型doublefunction(int,double);函數(shù)function的返回值類型是什么?函數(shù)的類型是什么?請用lypedef定義函數(shù)的類型。若有函數(shù)調(diào)用語句x=function(10,(2*(0.314+5));其中的括號“()”與函數(shù)原型中括號有什么語義區(qū)別?【解答】函數(shù)function的返回值類型是double函數(shù)類型是:double(int,double)可以定義為:typedefdoub1efunType(int,double);函數(shù)調(diào)用function(K),(2*(0.314+5))中,外層括號表示調(diào)用函數(shù)匹配的實際參數(shù)表,里面的兩層括號是表達(dá)式運算:。3.請分析以下各語句的意義。

66int?fun():int?(*pf)();fun();pf=fun;pf0;【解答】int*fun();〃函數(shù)原型聲明。fun是返回int*類型,沒有參數(shù)的函數(shù)int*(*pf)0;〃聲明指針變量。pf是指向函數(shù)的指針,函數(shù)類型為int*()fun();〃調(diào)用函數(shù)語句pf=fun;〃向指針變量賦值。函數(shù)指針pf指向函數(shù)funpfO;〃用指針變量間址調(diào)用函數(shù)3.4編程題1.已知V=s/i(l+shx),其中sh為雙曲正弦函數(shù),即sh(t)=e'e-.編一程序,輸入x的值,求y的值.sh2x+sh3x2【解答】#include#includeusingnamespacestd;doublesh(doublet);intmain(){doublex,y;cout<<"x=";cin?x;y=sh(1+sh(x))/(sh(2*x)+sh(3*x));cout<<*y=>n?p;fl=f(Lm):f2=f(3,n):f3=f(5,p);if(fl&&f2&&f3){s=(fl+f2)/f3;cout?"s="?s?endl;

67}elsecout<<"溢出!、n”;)doublef(longk,longnum){longi;doub1esum=0:for(i=l;i<=num&&sum<2147483647;i++){sum=sum+pow(double(i),double(k));)if(i<=num)return0;〃溢出時返回returnsum;)3.輸入a,b和c的值,編寫一個程序求這三個數(shù)的最大值和最小值。要求把求最大值和最小值編寫成一個函數(shù),并使用指針或引用作為形式參數(shù)把結(jié)果返忸I(lǐng)main函數(shù)?!窘獯稹?1)使用指針參數(shù)#includeusingnamespacestd;voidfmaxmin(double,double.double,double?,doub1e?);intmain(){doublea,b,c,max,min;cout?*a,b,c=cin?a?b?c;fmaxmin(a,b,c,&max,&min);cout?*max=*?max?endl;cout?"min="?min?endl:)voidfmaxmin(doublex,doubley,doublez,double*pl,double*p2){doubleu,v;if(x>y){u=x;v=y;}else{u=y;v=x;};if(z>u)u=z;if(zusingnamespacestd;

68voidfmaxmin(double,double,double,double&,doubled);intmainO{doublea,b,c,max,min;cout?*a,b,c=”;cin?a?b?c;fmaxmin(a,b,c,max,min);cout?*max=*?max<y){u=x;v=y;}else{u=y;v=x;};if(z>u)u=z;if(z

69”;cin?answer;if(answer==,N'Ianswer=*n*)break:

70while(l){cout?”請輸入難度(1或2cin?w;if(w!=1&&w?=2)cout?"輸入難度錯誤,重新輸入!"?endl;elsebreak;}while(l){cout?”請輸入運算類型;cin?op;if(op!='+'&&.op&&op!='*'&&op!='/')cout?”輸入運算符錯誤,重新輸入!“?endl;elsebreak;)〃出10道題,每題10分t=0:for(i=l;i<=10;i++){while⑴{if(w=1){a=Rand(0,10);b=Rand(0,10);}elseif(w=2){a=Rand(10,100);b=Rand(10,100);)if(op=)if(a

71{cout?"你算對了,加10分!"?endl;t=t+10;}elsecout?"你算錯了!"?endl;}cout?"你的成績是:*?t?"分"?endl;})intRand(intm,intn){staticintr;//靜態(tài)變量保留上一個隨機(jī)數(shù)do{r=(25173*r+13849)%65536;}while(r=n);returnr;}4.已知勒讓德多項式為1w=0Pn(x)=,Xn=\((2n-l)prt.1(x)-(n-l)pn_2W)/nn>\編一程序,從健盤上輸入x和n的值,使用遞歸函數(shù)求p〃(x)的值。【解答】#includeusingnamespacestd;doublep(doublex,intn);intmain(){intn;doublex;cout?*pleaseinputxandn:*;cin?x?n:cout?*p(*?x?*,*?n?*)=*?p(x,n)?endl;)doublep(doublex,intn){doubletl,t2;if(n==0)return1;elseif(n==1)returnx;else{tl=(2*n-l)*p(x,n-1);

72t2=(n-l)*p(x,n-2);return(tl-t2)/n:})6.把以下程序中的print。函數(shù)改寫為等價的遞歸函數(shù)。#includeusingnamespacestd;voidprint(intw){for(inti=1;i<=w;i++){for(intj=1;j<=i;j++)cout?i?**;cout?endl;})intmain(){print(5);)運行顯示:122333444455555【解答】#includeusingnamespacestd;voidprint(intw){inti;if(w){print(w-1);for(i=l;i<=w;i++)cout?w?*cout?endl;}}voidmainO{print(5);)

737.已知用梯形法求積分的公式為:=h(f(a)+f(b))I〃£/(01汾),其中h=(b-a)/n,n為積分區(qū)間的等分?jǐn)?shù),編程序求如卜.枳分的值。要求把求枳分公式編寫成一個函數(shù),并使用函數(shù)指針作為形式參數(shù)。調(diào)用該函數(shù)時,給定不同的被枳函數(shù)作為實際參數(shù)求不同的積分。①②【解答】#include#includeusingnamespacestd;doublefl(doublex){return4/(1+x*x);)doublef2(doub1ex){returnsqrt(1+x*x);}doublef3(doublex){returnsin(x);}doubletrap(double(*fun)(doublex),doublea,doubleb,longn){doublet,h;inti;t=((*fun)(a)+(*fun)(b))/2.0;h=(b-a)/n;for(i=l;i<=n-l;i++)t+=(*fun)(a+i*h);t?=h;returnt;}intmainO{doub1etl,t2,t3;tl=trap(fl,0,1,10000);cout?*tl=*?tl?endl;t2=trap(f2,1,2,10000);cout?*t2=*?t2?endl;t3=trap(sin,0,3.14159265/2,10000);cout?*t3=*?t3?endl;)8.編寫一個程序,包含三個重載的display函數(shù)和一個主函數(shù)。要求第一個函數(shù)輸出double值,前面用字符串“adouble:引導(dǎo),第二個函數(shù)輸出?個int值,前面用字符串“aint:”引導(dǎo),第:個函數(shù)輸出?個char字符值,前面用字符串"achar:引導(dǎo),在主函數(shù)中分別用double、int和char型變量作為實參調(diào)用display函數(shù)。

74【解答】itincludeusingnamespacestd;voiddisplay(doubled){cout<<*adoub1e:*?d?endl;)voiddisplay(inti){cout<<"aint:*?i?endl;)voiddisplay(charc){cout?*achar:*<usingnamespacestd;voidsort(doublex,doubley);voidsort(doublex,doubley,doublez);intmain(){sort(5.6,79);sort(0.5,30.8,5.9);)voidsort(doublex,doubley){if(x>y)cout?x?'\t'?y?endl;elsecout?y?*\t*?x?endl;)voidsort(doublex,doubley,doublez){doublet;if(y

75if(x\t*?z?*\t*?endl:)8.給定求組合數(shù)公式為:c”=加.編?程序,輸入m和n的值,求C:的值.注意優(yōu)化算法,降低溢出可mnl(m-n)!能。要求主函數(shù)調(diào)用以下函數(shù)求組合數(shù):intFabricate(intm,intn);〃返回C:的值Fabricate函數(shù)內(nèi)乂須調(diào)用Multi函數(shù):intMu11i(intm,intn);//返回zzrxzff-7x...xn程序由4個文件組成。頭文件存放函數(shù)原型作為調(diào)川接LI:其他3個cpp文件分別是main、Fabricate和Muiti函數(shù)的定義?!窘獯稹?/Fabricate,httifndefFABRICATE』ttdefineFABRICATE_HintFabricate(intm,intn);intMulti(intm,intn);#endif//main,cpp#includeusingnamespacestd:-include"Fabricate,h”intmain()(intm,n;cout?*inputmandn:*;cin?m?n;cout?”Fabricate/?m<<","<

76for(i=n;i<=m;i++)t=t?i;returnt;習(xí)題4及其解答4.1選擇題1.以下對一維數(shù)組a的正確定義是(c).(a)intn=5,a[n];(b)inta(5);(c)constintN=5;inta[N];(d)intn;cin?n;inta[n];2.下列數(shù)組定義語句中,不合法的是(a)。(a)inta[3]={0,1,2,3);(b)inta[]={0,1,2);(c)inta[3]={0,1,2);(d)inta[3]={0};3.已知inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a;則不熊表示數(shù)組a中元素的式子是(c).(a)*a(b)*p(c)a(d)a[p-a]4.已知inta[]={0,2,4,6,8,10},*p=a+1;其值等于0的表達(dá)式是(d).(a)*(p++)(b)*(++p)(c)*(p―)(d)?(—p)5.以下不能對二維數(shù)組a進(jìn)行正確初始化的語句是(c)?(a)inta[2][3]={0};(b)inta口⑶={{0,1},{0});(c)inta[2][3]={{0,1},{2,3},{4,5}};(d)inta[][3]={0,1,2,3,4,5};6.已知inta[][3]={{0,1},{2,3,4},{5,6},{7}};則的值是(c)。(a)0(b)2(c)6(d)77.已知inta[3][3]={1,2,3,4,5,6,7,8,9);則不能表示數(shù)組元素a[2][1]的地址是(b)。(a)&a[2][l](b)?(a[2]+l)(c)a[2]+l(d)*(a+2)+l8.已知char*a[]={"fortran","basic","pascal”,MjavaM,Mc++M};則cout?a[3];的顯示結(jié)果是(c)。

77(a)t(b)一個地址值(c)java(d)javac++1.若用數(shù)組名作為調(diào)用函數(shù)的實參,則傳遞給形參的是(a).(a)數(shù)組存貯首地址(b)數(shù)組的第一個元素值(c)數(shù)組中全部元素的值(d)數(shù)組元素的個數(shù)2.設(shè)有char*sl="ABCDE”,*s2="ABCDE”,*s3=sl;卜列表達(dá)式中值等于true的是(d).(a)sl=s2(b)sl==s3(c)s2=s3(d)strcrap(si,s3)=03.設(shè)char*sl,*s2;分別指向兩個字符串。判斷字符串si和s2是否相等的表達(dá)式為(d).(a)sl=s2(b)sl=s2(c)strcpy(sl,s2)=0(d)strcmp(sl,s2)==04.設(shè)char*sl,*s2;分別指向兩個字符中,判斷字符串si是否大于字符串s2的表達(dá)式為(c).(a)sl>s2(b)strcmp(sl,s2)==0(c)strcmp(sl,s2)>0(d)strcmp(s2,sl)>04.2閱讀下列程序,寫出執(zhí)行結(jié)果1,ttincludeusingnamespacestd:intmainO{inti,count=0,sum=0;doubleaverage;inta[]={1,2,3,4,5,6,7,8,9,10};for(i=0;i<10;i++){if(a[i]%2=0)continue;sum+=a[i];count++;}average=sum/count;cout?*count=*?count?'\t,?*average=*?average?endl;}【解答】conut=5average=52,#includeusingnamespacestd;intmainO{inta[9]={1,2,3,4,5,6,7,8,9);int*p=a,sum=0;for(;p

78}【解答】sum=20#includettincludeusingnamespacestd;constintN=5;intmainO{inta[N][N]={0},i,j,k;for(k=l,i=0;i=0;j—,k++)a[j][i-j]=k;for(i=0;iusingnamespacestd:intf(int[],int):intmainO(inta[]={-1,3,5,-7,9,-11);cout?f(a,6)?endl;)intf(inta[],intsize){inti,t=l:for(i=0:i0)t?=a[i];returnt;}

79【解答】135i.#includeusingnamespacestd;intf(int[][3],int,int);intmainO{inta[][3]={0,1,2,3,4,5,6,7,8}cout?f(a,3,3)?endl;}intf(inta[][3],introw,intcol){inti,j,t=l;for(i=0;iusingnamespacestd;voidtestl(int*al)(al=newint(5);cout?**al="<<*al?endl;}voidtest2(int*&a2){a2=newint(5);cout?**a2=*?*a2<

80cout?*test2:*p2=*<<*p?endl;}【解答】*al=5testl:*pl=1*a2=5test2:*p2=57.#includeusingnamespacestd:intmainO{chars[]="abccda”;inti;charc;for(i=1;(c=s[i])!='\0';i++){switch(c){case,a,:cout?,%*;continue;case'b':cout?*$';break;case'c':cout?'*';break;case'd':continue;)cout<<'?endl;))【解答】$#%8.#includeusingnamespacestd;intmainO{char*str[]={"c++”,"basic","pascal"};char**p;inti:str

81for(i=0;i<3;i++)cout??(p+i)?endl;}【解答】c++basicpascal7.*includeusingnamespacestd;intmainO{charsi[]-"Fortran",s2[]=*Foxpro*;char*p,*q;P=si;q=s2:while(*p&&*q){if(*p=*q)cout<<*p;P++;q++;)cout?endl;}【解答】For8.#include#includeusingnamespacestd;intmain(){charstr[][10]=「vb","pascal”,7++”},s[10];strcpy_s(s,(strcmp(str[0],str[l])<0?str[0]:str[l]));if(strcmp(str[2],s)<0)strcpy_s(s,str[2]);cout?s?endl;}【解答】C++4.3思考題1.數(shù)組說明語句要向編譯器提供什么信息?請寫出?維數(shù)組、二維數(shù)組說明語句的形式?!窘獯稹?/p>

82數(shù)組說明語句要向編譯器提供數(shù)組名(標(biāo)識符),數(shù)組元素的類型、數(shù)組維數(shù)、數(shù)組長度(元素的個數(shù))等信息。一維數(shù)組說明語句為:類型數(shù)組名[表達(dá)式]二維數(shù)組說明語句為:類型數(shù)組名[表達(dá)式J[表達(dá)式2]1.數(shù)組名、數(shù)組元素的區(qū)別是什么?歸納一維數(shù)組元素地址、元素值不同的表示形式。若有說明intaa[3],*pa=aa;請使用aa或pa,寫出3個以上與aa[2]等價的表達(dá)式。【解答】數(shù)組名是一個標(biāo)識符,執(zhí)行代碼中代表數(shù)組的地址,即指向數(shù)組起始位置的指針:而數(shù)組元素是卜標(biāo)變量,性質(zhì)相當(dāng)于普通變量。對一維數(shù)組aa第i個元素的地址可以表示為:&aa[i]aa+i;對一維數(shù)組aa第i個元素的值可以表示為:a[i]*(a+i);與aa[2]等價的表達(dá)式:*(aa+2)*(&a[2])?(pa+2)pa[2]2.要把一維數(shù)組inta[m*n]的元素傳送到二維數(shù)組intb[m][n]中,即在程序中要執(zhí)行b[i][j]=a[k];請寫出k-?i,j的卜標(biāo)變換公式,并用程序驗證?!窘獯稹哭D(zhuǎn)換公式:i=k/nj=k%n驗證程序:#includeusingnamespacestd:intmain(){constintM=3,N=4:intk,a[M*N]={l,2,3,4,5,6,7,8,9,10,11,12},b[M][N];inti,j;cout?*arraya:*?endl;for(k=0;k\t*;cout<\t*;cout?endl:)3.有以卜.函數(shù)voidquery(){int*p;p=newint[3]:

83delete[]p:p=newdouble[5];//……delete[]p;}出現(xiàn)了編譯錯誤。請分析錯誤的原因,并把上述程序補(bǔ)充完整,上機(jī)驗證你的判斷?!窘獯稹吭谡Z句p=newdoubled];中企圖把動態(tài)浮點型數(shù)組的地址寫入整型指針p,造成錯誤。錯誤為errorC2440:“一:無法從“double*"轉(zhuǎn)換為“int。改正方法:增加?個double*q指針。voidquery(){int*p;p=newint[3];delete[]p;//……double*q;q=newdouble[5];//……delete[]q;}1.有以下程序根據(jù)輸入值,設(shè)計功能是調(diào)用函數(shù)create建立并初始化動態(tài)數(shù)組,令但該程序運行后不能得到期曳結(jié)果,請分析程序的錯誤原因并修改之。#includeusingnamespacestd;voidcreate(int?,int);intmainO{int*a=NULL,len;cin?len;create(a,len);for(inti=0:i

84函數(shù)create中,指針參數(shù)int*ap是傳地址值的參數(shù)。調(diào)用函數(shù)時接受實際參數(shù)a的值(地址值)作為初始值。ap僅是局部變量,ap=newint[n]獲得新的地址值,函數(shù)執(zhí)行完畢返回,ap被釋放,完全。實際參數(shù)a無美。程序沒有編譯錯誤,但main不能獲得動態(tài)數(shù)組。修改方法是把a(bǔ)p改為指針引用參數(shù)。voidcreate(int*&,int);〃函數(shù)原型聲明,使用引用參數(shù)voidcreate(int*&ap,intn)〃函數(shù)定義{ap=newint[n]:for(inti=0;i#includeusingnamespacestd;voidaveMsd(double口,int,double&,double&);〃求平均值和均方差值函數(shù)intmainO{doubles[]={76,85,54,77,93,83,90,67,81,65);doubleave,msd;inti,n;n=sizeof(s)/sizeof(double);〃求數(shù)組元素的個數(shù)cout<<"學(xué)生成績:*:for(i=0;i

85for(i=0;ittinclude#include#includeusingnamespacestd;intmainO{inta[10],i,j;srand(int(time(0))):〃為隨機(jī)數(shù)生成器設(shè)置種子值for(i=0;i<10;i++)(1:a[i]=randO;〃產(chǎn)生隨機(jī)數(shù)存放到數(shù)組中if(a[i]<10||a[i]>=100)〃獲取指定范圍數(shù)據(jù)goto1;for(j=0;jm)cout?a[i]?*)cout?.是素數(shù)!"<

86usingnamespacestd;intmainO{inta[]={38,6,29,1,25,20,6,32,78,10};intindex[10];〃記錄卜標(biāo)的數(shù)組inti,j,temp;for(i=0:i<10:i++)indexti]=i:for(i=0;i<=8:i++)for(j=i+l;j<=9:j++)if(a[i]

87flag=l;〃判斷標(biāo)志i=0;j=k-l;〃設(shè)置指示下標(biāo)的指針while(iusingnamespacestd:voidmerge(constinta[],intna,intmain()(inta[4]={1,2,5,7);intb[8]={3,4,8,8,9,10,intc[12];inti;merge(a,4,b,8,c,12);for(i=0;i<12;i++)cout?c[i]?**;cout?endl:)voidmerge(constinta[],intna,(inti,j,k;i=j=k=0;while(ib[j])Ic[k]=b[j];k++;j++;)else{c[k]=a[i];k++;i++;}while(i

88【解答】#includeusingnamespacestd;intmainO{char*weekday[7]=("Sunday”,*monday*,*tuesday*,“Wednesday*,*thursday*,“friday",*Saturday*};intd;cout?”pleaseinputweekday:cin?d;if(d>=0&&d<=6)cout?d?*-一"??(weekday+d)?endl;elsecout<<*inputerror!*?endl;)1.編寫函數(shù):(1)在一個二維數(shù)組中形成如以下形式的n階矩陣:’11111、211113211143211,54321)(2)去掉靠邊元素,生成新的n-2階矩陣:(3)求矩陣上對角線下元素之和:(4)以方陣形式輸出數(shù)組。在main函數(shù)中調(diào)用以上函數(shù)進(jìn)行測試?!窘獯稹?includeusingnamespacestd;voidcreate(int*&app,intn);voiddel(int*&app,int*&bpp,intn):intmaindiagonal(int*&app,intn);voidoutput(int*&app,int);intmainO{int*ap=NULL,*bp=NULL,n;cout?”輸入矩陣的階:”;cin?n;create(ap,n);cout?*

89形成矩陣:

90*;output(ap,n):cout?”去掉靠邊元素生成的矩陣:

91”;del(ap,bp,n);output(bp,n-2);

92cout?”主對角線元素之和:*?maindiagonal(ap,n)<

93〃以方陣的形式輸出數(shù)組函數(shù)voidoutput(int*&app,intn){inti,j;for(i=0;iusingnamespacesld;intmainO{longs[][3]={{300,250,150},{200,240,200},{280,210,180)};longp[]={3500,3300,3800};inti,j;doublesum;for(i=0;i<3;i++)(sum=0;for(j=0:j<3;j++)sum+=s[i][j]*p[j];cout?"第"?i+1?.百貨公司的電視機(jī)營業(yè)額:*?sum?endl;}}2.設(shè)計函數(shù)求整型數(shù)組的最小元素及其卜.標(biāo)。在主函數(shù)中定義和初始化該整型數(shù)組,調(diào)用該函數(shù),并顯示最小元素值和下標(biāo)值。【解答】#includeusingnamespacestd;

94intfmin(int[],int);intmain(){inta[]=<73,85,62,95,77,56,81,66,90,80};intindex;index=fmin(a,sizeof(a)/sizeof(int));cout?*Theminnumnumberis:*?a[index]?endl;cout?*Theindexis:*?index<usingnamespacestd;voidinsert(inta[],int,int);intmain(){inta[]={10,12,23,25,48,48,53,58,60,78};intx,n,i;cout?*pleaseinputinsertdata:cin?x;n=sizeof(a)/sizeof(int);〃求數(shù)組長度insert(a,n,x);〃插入元素for(i=0;i

95{p=i:break;)for(j=n-l;j>=p;j—)〃后移元素,擠出最大值a[j]=a[j-l];a[p]=x;〃插入元素)}1.編寫程序,按照指定長度生成動態(tài)數(shù)組,用隨機(jī)數(shù)對數(shù)組元素賦值,然后逆置該數(shù)組元素。例如,對數(shù)組A[5],初值為{6,3,7,8,2},逆置后的位是[2,8,7,3,6)。程序輸出逆置前、后的數(shù)組元素序列?!窘獯稹縯tinclude#includeusingnamespacestd:voidprintarray(int*p,intn):voidadverse(int*p,intn);intmain(){int*p,n,i;cout<<”請輸入數(shù)組長度:”;//產(chǎn)生動態(tài)數(shù)組〃產(chǎn)生隨機(jī)數(shù)并存放到動態(tài)數(shù)組中//輸出動態(tài)數(shù)組//對數(shù)組逆置//輸出逆置數(shù)組cin?n;p=newint[n];srand(time(O));for(i=0;i

96//對數(shù)組逆置函數(shù)voidadverse(int*p,intn){inti,t;for(i=0;iusingnamespacestd:intmainO(intp,i,j,k;charsi[40],s2[40],s3[80];cout?*sl=*;cin>>si;cout?*s2=*;cin?s2;cout?*inputinsertposition:*;cin?p;〃輸入插入位置for(i=0;i

97{charname[5][20]=[*liming*.”zhangqing*,*1iuxiaoping*,*wangying*,*lupei*);longnum[5]={20030001,20030002,20030005,20030007,20030010);inti;longsnumber;cout?*pleaseinputstudentnumber:*:cin?snumber;for(i=0;i<5;i++){if(num[i]==snumber){cout?*Found!Thenameis:*?name[i]?endl;break;t)if(i==5)cout?"Can\'tfound!*<#includeusingnamespacestd;intmainO{charstring[10];charstr[][10]={"while","break","if","extern","void","auto",long,static.do,const);inti:strcpy(string,str[0]);for(i=0;i<10;i++)if(strcmp(str[i],stringXO)strcpy(string,str[i]);cout?"Theminimumstringis:*?string?endl;)2.使用指針函數(shù)編寫程序,把兩個字符串連接起來?!窘獯稹?includeusingnamespacestd;char*strcat(char*strl,char*str2){char*p=strl;while(*p!='\0')p++;

98*p=*str2;do{p++;str2++;*p=*str2;}while(*str2!='\0');return(strl);)intmainO{charstrl[80],str2[80];cout?*inputstrl:*:cin?strl;cout?*inputstr2:*;cin?str2;cout?*strl+str2=*?strcat(strl,str2)?endl;)1.使用string類,寫一個簡單文本編輯程序,能夠?qū)崿F(xiàn)基本的插入、刪除、查找、替換等功能?!窘獯稹柯浴A?xí)題5及其解答5.1選擇題1.有說明structpoint{intx:inty;}p;正確的賦值語句是(c)?(a)point,x=1;point,y=2;(b)point={1,2};(c)p.x=1;p.y=2;(d)p={1,2};2.已知有職工情況結(jié)構(gòu)變量emp定義為:structDate{intyear;intmonth;intday;);strnctEmployee{charname[20];longcode;Datebirth};Employeeemp下列對emp的birth的1E確賦值方法是(d).(a)year=1980;month=5;day=l;

99(a)birth.year=1980;birth.month=5;birth.day=l;(b)emp.year=1980;emp.month=5;emp.day=1;(c)emp.birth.year=1980;emp.birth.month=5;emp.birth.day=l;1.假定有以下說明語句,則下面引用形式錯誤的是(b)ostructStudent{intnum;doub1escore;);Studentstu[3]={{1001,80},{1002,75},(1003,91}},*p=stu;(a)p->num(b)(p++).num(c)(p++)->num(d)(*p).num2.若有以下說明語句,則下列錯誤的引用是(d)ostructWorker{intno;charname[20];):Workerw,*p=&w;(a)w.no(b)p->no(c)(*p).no(d)*p.no5.si和s2是兩個結(jié)構(gòu)類型變量,若要賦值sl=s2合法,則它們的說明應(yīng)該是(c)?(a)si只能接受相同類型的數(shù)據(jù)成員(b)結(jié)構(gòu)中的成員相同(c)同一結(jié)構(gòu)類型的變量(d)存儲字節(jié)長度一樣的變量5.2閱讀下列程序,寫出執(zhí)行結(jié)果.1.^includeusingnamespacestd;structData{intn;doublescore;):intmainO{Dataa[3]={1001,87,1002,72,1003,90),*p=a;cout?(p++)->n?endl;cout?(p++)->n?endl;cout?p->n++?endl;cout?(*p).n++?endl;}【解答】10011002100310042.

100#includeusingnamespacestd:structEmployee{charname[20];charsex;};voidfun(Employee*p){if((*p).sex='m')cout?(*p).name<usingnamespacestd;structNode{char*s;Node*q;};intmainO{Nodea[]={{*Mary*ta+1),{"Jack”,a+2),{"Jim",a}};Node*p=a;cout?p->s?endl;cout?p->q->s<q->q->s?endl:cout?p->q->q->q->s?endl;【解答】MaryJackJimMary5.3思考題

1011.分析以下說明結(jié)構(gòu)的語句structNode{intdata;Nodeerror;〃錯誤Node*ok;〃正確};eiror和。k分別屬于什么數(shù)據(jù)類型?有什么存儲要求?。門'or出錯的原因是什么?【解答】error是Node結(jié)構(gòu)類型數(shù)據(jù)成員,錯誤。原因是結(jié)構(gòu)定義的數(shù)據(jù)成員若為本身的結(jié)構(gòu)類型,是一種無窮遞歸。ok是指向Node類型的指針,定義正確,占4字節(jié)。2.本章例5-5中用輔助數(shù)組對結(jié)構(gòu)數(shù)組做關(guān)鍵字排序,有定義person*index[100]:index數(shù)組存放結(jié)構(gòu)數(shù)組元素的地址。如果把index定義改為intindex[100];用于存放結(jié)構(gòu)數(shù)組元素的下標(biāo)??梢詫崿F(xiàn)對結(jié)構(gòu)數(shù)組的索引排序嗎?如何修改程序?請你試一試?!窘獯稹靠梢?。關(guān)鍵是通過整型索引數(shù)組元素作為下標(biāo)訪問結(jié)構(gòu)數(shù)組。表示為:al1[pi[i]].nameall[pi[i]].idall[pi[i]].salary有關(guān)程序如下:#includeusingnamespacestd;structperson〃說明結(jié)構(gòu)類型{charname[10];unsignedintid;doublesalary:);voidInput(person[],constint);voidSort(person[],int[],constint);voidOutput(constperson[],int[],constint);intmainO{personallone[100]:〃說明結(jié)構(gòu)數(shù)組intindex[100]://說明索引數(shù)組inttotal;for(inti=0;i<100;i++)//索引數(shù)組元素值初始化為結(jié)構(gòu)數(shù)組元索卜標(biāo)index[i]=i;cout<<"輸入職工人數(shù):”;cin?total;cout?”輸入職工信息:

102*;Input(allone,total);cout?”以工資做關(guān)鍵字排序

103”;Sort(allone,index,total);cout<<“輸出排序后信息:

104*;Output(allone,index,total);)

105voidInput(personall[],constintn){inti;for(i=0:i>all[i].name;cout<<“編號:*;cin?all[i].id;cout<<“工資:”;cin?all[i].salary;))voidSort(personal1[],intpi[],constintn){inti,j;intt;〃交換用中間變量for(i=l;iall[pi[j+l]].salary)//通過索引數(shù)組訪問結(jié)構(gòu)數(shù)組元素{t=pi[j];〃交換索引數(shù)組元素值pi[j]=pi[j+U:Pi[j+1]=t;))}voidOutput(constpersonall[],intpi[],constintn)//輸出排序后數(shù)據(jù){for(inti=0;idate<<'

106*;head++;))【解答】head++錯誤,原因是動態(tài)鏈表的結(jié)點存放不是連續(xù)順序的內(nèi)存空間,它們是逐個結(jié)點通過new建立的,所以不能用++做地址偏移運算。

107應(yīng)該用:head=head->next5.4編程題1.使用結(jié)構(gòu)類型表示復(fù)數(shù)“設(shè)計程序輸入兩個復(fù)數(shù),可以選擇進(jìn)行復(fù)數(shù)的+、一、X或+運算,并輸出結(jié)果。【解答】^includettincludeusingnamespacestd;structcomp1ex(doublere,im;);intmain()(complexa,b,c;charoper;cout?”輸入復(fù)數(shù)a的實部和虛部:”;cin?a.re?a.im;cout?"輸入復(fù)數(shù)b的實部和虛部:“;cin?b.re?b.im;cout<<"輸入運算符:”:cin?oper;switch(oper){case':c.re=a.re+b.re;c.im=a.im+b.im:break;case':c.re=a.re-b.re;c.im=a.im-b.itn:break;case':c.re=a.re*b.re-a.im*b.im;c.im=a.im*b.re+a.re*b.im;break;case':c.re=(a.re*b.re+a.im*h.im)/(b.re*b.re+b.im*b.im);1.im=(a.im*b.re-a.re*b.im)/(b.re*b.re+b.im*b.im);break;default:cout?”inputerror!*?endl;return0;)cout?,c=*?c.re;cout?setiosflags(ios:rshowpos);cout?c.im?"i"?endl:return0;}2.把一個班的學(xué)生姓名和成績存放到一個結(jié)構(gòu)數(shù)組中,尋找和輸出最高分者。

108【解答】#includemax)max=a[i].score;for(i=0:i^includeusingnamespacestd;structpoint{doublex;doubley;};doubled(pointpl.pointp2){returnsqrt(pow(pl.x_p2.x>2)+pow(pl.y-p2.y,2));}intmainO{inti;pointp[5];for(i=l;i<=4:i++){cout?“輸入第"?i?”個頂點的橫坐標(biāo)和縱坐標(biāo):Lcin?p[i].x?p[i].y;}if(fabs(d(p[l],p[2])-d(p[3],p[4]))<=le-8

109&&fabs(d(p[l],p[4])-d(p[2],p[3]))<=le-8&&fabs(d(p[l]rp[3])-d(p[2],p[4]))<=le-8)if(fabs(d(p[l],p[2])-d(p[2],p[3]))usingnamespacestd;structemployee{intnum;intage;charsex;employee*next;);employee?head,*headl;〃建立單向鏈表employee*create(){employee*head,*p,*pend;charch:head=NULL;cout?輸入數(shù)據(jù)?(y/n)cin?ch;if(ch=*y,)(p=newemployee;cout?”\t編號:";cin?p->num;cout?*\t年齡:";cin?p->age:cout?性別:";cin?p->sex;

110gotoLO;while(ch=='y')head=p;{if(head==NULLelsepend->next=p;pend=p;cout?輸入數(shù)據(jù)?(y/n)";cin?ch;if(ch='y'){p=newemployee;cout?”\t編號:";cin?p->num;cout<<"\t年齡:”;cin?p->age;cout<<"\t性別:";cin?p->sex;})pend->next=NULL;LO:;returnhead:)〃顯示他向鏈表中全部職工信息voidshow(employee*head){employee*p=head;if(!head){cout?”\t空鏈表!"?endl;gotoLI;}cout?”\t處表中的數(shù)據(jù)是:

111*;while(p){cout<<'\t'<num?"?p->age?"?p->sex?endl;p=p->next;)LI:;)〃統(tǒng)計男女職工人數(shù)voidcount(employee*head){employee*p=head;intm,f;m=0;f=0;whi1e(p){if(p->sex='m')m++;elsef++;p=p->next;)cout?*\t男職工人數(shù):*?in?endl;cout?”\t女職工人數(shù):”《f<

112}〃在鏈表尾部插入新結(jié)點employee*insert(){employee*pend=head,*p;//在空鏈表尾部插入新結(jié)點if(!head){p=newemployee;cout?”\t編號:";cin?p->num;cout?”\t年齡:“;cin?p->age;cout?"\t性別:“;cin?p->sex;head=p;p->next=NULL:returnhead;)〃在鏈表尾部插入新結(jié)點while(pend->next!=NULL){pend=pend->next;)p=newemployee;cout?編號:*;cin?p->num;cout?”\t年齡:“;cin?p->age;cout?”\t性別:";cin?p->sex;pend->next=p;pend=p;pend->next=NULL;returnhead;〃刪除指定編號的結(jié)點employee*del(intbh){employee*p,*q;if(!head){cout?”\t空鏈表!"?endl;gotoL2;)〃刪除鏈?zhǔn)捉Y(jié)點if(head->num==bh){p=head:head=head->next;

113deletep:cout?”\t結(jié)點已被刪除!“<next!=NULL){if(q->next->num=bh){p=q->next:〃待刪除結(jié)點q->next=p->next;deletep;cout?*\l結(jié)點已被刪除!"?endl;gotoL2;}q=q->next;}cout?找不到需刪除結(jié)點!"?endl:L2:;return(head);)〃刪除指定年齡段的結(jié)點,并把被刪除結(jié)點保存在另一鏈表中employee*delcreate(){employee*p,*pd,*pl,*q;intflag;〃建立新鏈表if(head==NULL){cout?”\t空鏈表!"?endl;gotoL3;)headl=NULL;pd=newemployee:p-head;flag=0;while(p!=NULL){if(p->age>=55&&p->age<=60){pd->num=p->num;pd->age=p->age;pd->sex=p->sex;

114if(headl=NULL)headl=pd;elsepl->next=pd;pl=pd;pd=newemployee;flag=1;)p=p->next;)if(flag=0){cout?沒有需刪除的結(jié)點!"?endl;gotoL3;}pl->next=NULL;〃顯示新鏈表cout<<*\t新鏈表中的數(shù)據(jù)是:

115”;p=headl;while(p){cout?*\t*?p->num?“?p->age?"?p->sex?endl;p=p->next;}〃刪除指定年齡的結(jié)點p=head;q=P;while(p!=NULL){if(p->age>=55&&p->age<=60)if(head->age-p->age){pd=head;〃待刪除結(jié)點head=head->next;deletepd;p=head;continue;elseif(p->next=NULL){pd=p;〃待刪除結(jié)點q->next=NULL;deletepd;gotoL3;}else{pd=p:〃特刪除結(jié)點

116q->next-p->next;deletepd:p=q->next:continue;)q=p;p=p->next;}L3:return(head);)intmain(){intchoice,bh;L:cout?"

117\t\t請鍵入操作選擇

118"?endl;cout?*\t1建立單向鏈表"?endl;cout?*\t2--顯示單向鏈表中全部職工信息“?endl;cout?*\t3-統(tǒng)計男女職工人數(shù)"?endl:cout?*\t4—在職工尾部插入新結(jié)點"?endl;cout?*\t5—刪除指定編號的結(jié)點"?endl;cout?*\t6--刪除指定年齡的結(jié)點,并把被刪除結(jié)點保存在另一鏈表中"?endl;cout?*\t0退出"?endl;cout?*\t\t*;cin?choice;switch(choice){case1:head=create0:gotoL:case2:show(head);gotoL;

119case3:count(head);gotoL;case4:head=insert();gotoL;case5:cout?"\t輸入需刪除結(jié)點編號:“;cin?bh;head=del(bh);gotoL;case6:head=delcreateO;gotoL:1ase0:cout?*\t退出程序的運行!

120*?end1;break;default:cout?”\t輸入錯誤,請重新輸入!

121"?endl;gotoL;))5.輸入一行字符,按輸入字符的反序建立一個字符結(jié)點的單向鏈表,并輸出該鋅表中的字符?!窘獯稹?includeusingnamespacestd:structnode{charch;node*next:};voidshow(node*head);intmain(){node*head,*p;charc;head=NULL:〃輸入一行字符〃建立新結(jié)點〃插入表頭〃輸出鏈表while((c=getchar0)!=*

122*){p=newnode:p->ch=c;p->next=head:head=p;)show(head);)voidshow(node+head){node*p=head;cout?”鏈表中的字符是:

123”;whi1e(p){cout?p->ch;p=p->next;

124cout?endl;5.設(shè)有說明語句:structList{intdata;List*next;};List*head;head是有序單向鏈表的頭指針。請編寫函數(shù):voidCount(List*head);計算并輸出鏈表數(shù)據(jù)相同值的結(jié)點及個數(shù)。例如,若數(shù)據(jù)序列為:233345566667899則輸出結(jié)果:datanumber33526492請用本章例5-8的程序生成有序鏈表,測試你的函數(shù)?!窘獯稹柯粤?xí)題6及其解答6.1選擇題1.若有以下說明,在類外使用對象。bjX成員的正確語句是(c)oclassX{inta;voidfunl();public:voidfun20;):(d)X::funl():XobjX;(a)objX.a=0;(b)objX.funl();(c)objX.fun2();2.若有以下說明,對n的正確訪問語句是(b).classY{//......;public:staticintn;):intY::n;YobjY;

125(b)Y::n=l;(c)objY::n=l;(d)Y->n(a)n=l;2.若有以卜類Z說明,函數(shù)「Static中訪問數(shù)據(jù)a錯誤的是(c)。classZ{staticinta;public:staticvoidfStaticO:):intZ::a=0;ZobjZ;(a)voidZ::fStaticO{objZ.a=1;}(b)voidZ::fStaticO{a=1;}(c)voidZ::fStaticO{lhis->a=0;}(d)voidZ::fStaticO{Z::a=0;}3.若有以下類訴說明,函數(shù)fConst的正確定義是(a).classW{inta;public:voidfConst(int)const:);(a)voidW::fConst(intk)const{k=a;}(b)voidW::fConst(intk)const{k=a++;}(c)voidW::fConst(intk)const{cin?a;)(d)voidW::fConst(intk)const{a=k;}4.若有以下類T說明,函數(shù)「Friend的錯誤定義是(c)。classT(inti:friendvoidfFriend(T&,int);};(a)voidfFriend(T&objT,intk){objT.i=k;}(b)voidfFriend(TAobjT,intk){k=objT.i;}(c)voidT::fFriend(TAobjT,intk){k+=objT.i;}(d)voidfFriend(T&objT,intk){objT.i+=k:}5.在類定義的外部,可以被訪問的成員有(c).(a)所有類成員(c)public的類成員7.關(guān)于this指針的說法正確的是((a)this指針必須顯式說明(c)成員函數(shù)擁有this指針(b)private或protected的類成員(d)public或private的類成員c)°(b)定義一個類后.this指針就指向該類(d)靜態(tài)成員函數(shù)擁有this指針8.說明一個類的對象時,系統(tǒng)自動調(diào)用(b);撤消對象時,系統(tǒng)自動調(diào)用(c)?(a)成員函數(shù)(b)構(gòu)造函數(shù)(c)析構(gòu)函數(shù)(d)友員函數(shù)9.下面對■構(gòu)造函數(shù)的不正確描述是(b)o

126(a)系統(tǒng)提供默認(rèn)的構(gòu)造函數(shù)(b)構(gòu)造函數(shù)可以有參數(shù),所以也可以有返回值(c)構(gòu)造函數(shù)可以重載(d)構(gòu)造函數(shù)可以設(shè)置默認(rèn)參數(shù)9.卜面對析構(gòu)函數(shù)的正確描述是(c)。(a)系統(tǒng)不提供默認(rèn)的析構(gòu)函數(shù)(b)析構(gòu)函數(shù)必須由用戶定義(c)析構(gòu)函數(shù)沒有參數(shù),也沒有返回值(d)析構(gòu)函數(shù)可以設(shè)置默認(rèn)參數(shù)10.關(guān)乎類的靜態(tài)成員的不正確描述是(d)0(a)靜態(tài)成員不屬于某個對象,是類的共享成員(b)靜態(tài)數(shù)據(jù)成員要在類外定義和初始化(c)靜態(tài)成員函數(shù)不擁有this指針,需要通過類參數(shù)訪問對象成員(d)只有靜態(tài)成員函數(shù)可以操作靜態(tài)數(shù)據(jù)成員11.下面選項中,(c)不是類的成員函數(shù)。(a)構(gòu)造函數(shù)(b)析構(gòu)函數(shù)(c)友元函數(shù)(d)豆制構(gòu)造函數(shù)12.下面對友員的錯誤敘述是(d).(a)關(guān)鍵字friend用于聲明友員(b)一個類中的成員函數(shù)可以是另一個類的友員(c)友員函數(shù)訪問對象的成員不受訪問特性影響(d)友員函數(shù)通過ihis指針訪問對象成員14.若classB中定義了一個classA的類成員Aa,關(guān)于類成員的正確敘述是(c)。(a)在類B的成員函數(shù)中可以訪問A類的私有數(shù)據(jù)成員(b)在類B的成員函數(shù)中可以訪問A類的保護(hù)數(shù)據(jù)成員(c)類B的構(gòu)造函數(shù)可以調(diào)用類A的構(gòu)造函數(shù)做數(shù)據(jù)成員初始化(d)類A的構(gòu)造函數(shù)可以調(diào)用類B的構(gòu)造函數(shù)做數(shù)據(jù)成員初始化152閱讀下列程序,寫出執(zhí)行結(jié)果1.#include

127intmainO{Aa;a.setx(10);a.sety(5);cout?a.getxO?'\t'?a.getyO?endl:cout?a.fl()?'\t'?a.f2()?endl;}【解答】105105155#includeusingnamespacestd;classT{public:T(intx,inty){a=x;b=y;cout?"調(diào)用構(gòu)造函數(shù)."?endl;cout?a?*\t*?b<

12848調(diào)用構(gòu)造函數(shù)2.4820調(diào)用析構(gòu)函數(shù).調(diào)用析構(gòu)函數(shù).3.#includeusingnamespacestd;classT{public:T(intx){a=x:b+=x:};staticvoiddisplay(Tc){cout?*a=usingnamespacestd;#includeclassPoint{public:Point(doublex,doubley){a=x:b=y;cout?"點("<

129intmainO{Pointpl(2,3);cout?"到";Pointp2(4,5);cout?”的距離是:*?d(pl,p2)?endl;}【解答】點(3,4)到點(4,5)的距離是:2.828433.#includeusingnamespacestd;classA{public:AO{a=5;}voidprintaO{cout?*A:a=*<

130display2:a=4A:a=53.#includeusingnamespacestd;classA{public:A(intx):a(x){}voidgetA(int&A){A=a;}voidprintA0{cout?*a=*?a?endl:}private:inta;};classB{public:B(intx,inty):aa(x){b=y:}voidgetAB(int&A,int&outB){aa.getA(A);outB=b;)voidprintAB(){aa.printAO;cout?*b=*?b?endl;}private:Aaa;intb;};intmain(){AobjA(5);intm;objA.getA(m);cout<

131*;BobjB(12,56);objB.printABO;

132}【解答】objA:a=5objB:a=12b=566.3思考題1.結(jié)構(gòu)和類有什么區(qū)別?如果把程序中定義結(jié)構(gòu)的關(guān)鍵字struct直接改成class,會有什么問題?用教材上的一個例程試一試,想一想做什么修改能使程序正確運行?【解答】結(jié)構(gòu)是數(shù)據(jù)的封裝,類是數(shù)據(jù)和操作的封裝。可以把結(jié)構(gòu)看成是類的特例。結(jié)構(gòu)和類都可以用關(guān)鍵字struct或class定義。區(qū)別是,struct定義的結(jié)構(gòu)或類的全部成員都是公有的,用class定義的結(jié)構(gòu)或類不做聲明的成員是私有的。若把struct改成class,只需要把全部成員定義為public就可以了。2.有說明classA{inta;doublex;public:funMember(););Aal,a2.a3;編譯器為對象al、a2和a3開辟了什么內(nèi)存空間?它們有各自的funMember函數(shù)的副本嗎?C++通過什么機(jī)制調(diào)用類的成員函數(shù)?【解答】開辟的存儲空間有al.a,al.x,a2.a,a2.x,a3.a,a3.x。各對象沒有funMember函數(shù)的副本,C++通過this指針調(diào)用成員函數(shù)。3.C++提供了默認(rèn)版本的構(gòu)造函數(shù),為什么還需要用戶自定義構(gòu)造函數(shù)?編寫一個驗證程序,說明自定義構(gòu)造函數(shù)的必要性。【解答】類的默認(rèn)構(gòu)造函數(shù)可以建立基本類型數(shù)據(jù)成員的存儲空間。基丁?以下兩個原因,需要用戶定義構(gòu)造函數(shù):(1)對數(shù)據(jù)成員的值做指定初始化;(2)類的數(shù)據(jù)是由指針管理的堆。程序略。4.試從定義方式、訪問方式、存儲性質(zhì)和作用域分析類的一般數(shù)據(jù)成員和靜態(tài)數(shù)據(jù)成員的區(qū)別,并編寫一個簡單程序驗證它?!窘獯稹慷x方式訪問方式存儲性質(zhì)作用域??般數(shù)據(jù)成員類中定義對象.數(shù)據(jù)成員局部數(shù)據(jù)由訪問屬性public,protected,

133private決定靜態(tài)數(shù)據(jù)成員類中聲明,類外定義為象.數(shù)據(jù)成員類::數(shù)據(jù)成員全局?jǐn)?shù)據(jù)程序略。1.試從定義方式、調(diào)用方式分析常成員函數(shù)、靜態(tài)成員函數(shù)和友員函數(shù)的區(qū)別。考察教材的例6T5,若classGoods的指針域Goods*next:被聲明為私有(private)成員,程序會出現(xiàn)什么錯誤?做什么最小修改能使程序正確運行?請你試一試。【解答】定義方式調(diào)用方式常成員函數(shù)函數(shù)原型以const做后綴this指針被約束為指向常量的常指針與一般成員函數(shù)調(diào)用形式相同時數(shù)據(jù)成員只讀靜態(tài)成員函數(shù)以static做函數(shù)原型前綴沒有this指針通過類或?qū)ο笳{(diào)用用于操作靜態(tài)數(shù)據(jù)成員友員函數(shù)以friend做函數(shù)原型前綴沒有this指針通過參數(shù)訪問對象可以訪問對象的不同屬性的成員在例6T5中,若把next聲明為私有數(shù)據(jù)成員,只須把有關(guān)指針操作的函數(shù)定義為友員函數(shù)就可以了:friendvoidpurchase(Goods?&f,Goods*&r,intw):friendvoidsale(Goods*&f,Goods*&r);2.設(shè)有classM{inta;};classN{Mm;intb;voidfun(){/*?/}};intmainO(Nn;N*p=&n;/**/)描述在N::fun中如何訪問M類的數(shù)據(jù)成員a:在main函數(shù)中又如何訪問對象n的全部數(shù)據(jù)成員?【解答】在N::fun中訪問M類的數(shù)據(jù)成員a的形式是:m.a在main函數(shù)中訪問M類的數(shù)據(jù)成員的形式是:n.b,n.m.a6.3編程題1.定義一個Book(圖書)類,在該類定義中包括數(shù)據(jù)成員:bookname(書名)、price(價格)和number(存書數(shù)量):成員函數(shù):display。顯示圖書的情況:borrow。將存書數(shù)量減1,并顯示當(dāng)前存書數(shù)量:restore。將存書數(shù)量加1,并顯示當(dāng)前存V數(shù)量。在main函數(shù)中,要求創(chuàng)建某一種圖書對象,并對該圖竹進(jìn)行簡單的顯示、借閱和歸還管理。【解答】#includeusingnamespacestd;classBook{public:voidseiBook(char*,double,int);voidborrow();

134voidrestore();voiddisplay();private:charbookname[40]:doubleprice;intnumber;);〃在類外定義Book類的成員函數(shù)voidBook::setBook(char*name,doublepri,intnum){strcpy(bookname,name);price=pri;number=num;)voidBook::borrow(){if(number==0){cout?”已沒存書,退出!"?endl;abort();)number=number-1;cout?”借一次,現(xiàn)存"量為:*<

135cin?flag;switch(flag){case'b':computer,borrow();break;case'r':computer,restore();)cout?”是否繼續(xù)?(y/n)*;cin?ch;}computer,display();)1.定義一個Box(盒子)類,在該類定義中包括數(shù)據(jù)成員:length(長)、width(寬)和height(高):成員函數(shù):構(gòu)造函數(shù)Box,設(shè)置盒子長、寬和高一:個初始數(shù)據(jù);用函數(shù)volume計算并輸出盒子的體積。在main函數(shù)中,要求創(chuàng)建Box對象,并求盒子的體枳。【解答】#includeusingnamespacestd;classBOX(public:BOX(double1,doublew,doubleh){length=1;width=w;height=h;}voidvolume(){cout?”volume—?length*width*height?endl;}private:doublelength,width,height;);intmainO(BOXbox1(1,3,5);boxl.volume();BOXbox2(2,4,6):box2.volume();2.定義個Student類,在該類定義中包括:一個數(shù)據(jù)成員score(分?jǐn)?shù))及兩個靜態(tài)數(shù)據(jù)成員total(總分)和學(xué)生人數(shù)count:成員函數(shù)

136scoretotalcount(doubles)用于設(shè)置分?jǐn)?shù)、求總分和累計學(xué)生人數(shù):靜態(tài)成員函數(shù)sum()用于返回總分:靜態(tài)成員函數(shù)average。用于求平均值。在main函數(shù)中,輸入某班同學(xué)的成績,并調(diào)用上述函數(shù)求全班學(xué)生的總分和平均分。【解答】#includeusingnamespacestd;classstudent{public:voidscoretotalcount(doubles){score=s;total=total+score:count++;}staticdoublesum(){returntotal;1staticdoubleaverage0{returntotal/count;}private:doub1escore;staticdoubletotal:staticdoublecount;);doublestudent::total=0;doublestudent::count=0;intmainO{inti,n;doubles;cout?”請輸入學(xué)生人數(shù):”;cin?n;studentstu;for(i=l;i<=n;i++){cout?“請輸入第"?i<<”個學(xué)生的分?jǐn)?shù):cin>>s;stu.scoretotalcount(s):)cout?"總分:"?student::sum()?endl;cout?"平均分:*?student::average()?endl;1.定義一個表示點的結(jié)構(gòu)類型Point和一個由直線方程y=ax+b確定的直線類Line。結(jié)構(gòu)類型Point有x和y兩個成員,分別表示點的橫坐標(biāo)和縱坐標(biāo)。Line類有兩個數(shù)據(jù)成員a和b,分別表示直線方程中的系數(shù)。Line類有一個成員函數(shù)print用于顯示直線方程:友員函數(shù)setPoinMLineftll.Line&12)用于求兩條直線的交點。在main函數(shù)中,建立兩個直線對象,分別調(diào)用print函數(shù)顯示兩條直線的方程,并調(diào)用函數(shù)

137setPoint求這兩條直線的交點?!窘獯稹?includeusingnamespacestd;structpoint{doublex;doubley;);classline{public:1ine(doub1eu,doublev){a=u;b=v;}voidprint(){cout?

138setp=setpoint(11,12);cout<<“直線11和直線12的交點:("<usingnamespacestd;classT{publie:TO{a=0;b=0;c=0;}T(inti,intj,intk){a=i:b=j:c=k;}voidget(int&i,int&j,int&k){i=a;j=b;k=c;}

139Toperator*(Tobj);private:inta,b,c;);TT::operator*(Tobj){Ttempobj;tempobj.a=a*obj.a;tempobj.b=b*obj.b;tempobj.c=c*obj.c:returntempobj;}intmainO{Tobj1(1,2,3),obj2(5,5,5),obj3;inta,b,c:obj3=objl?obj2;obj3.get(a,b,c);cout?*(objl*obj2):"<<"a=*?a?>\t,?*b==*?c?\t*?endl;(obj2*obj3).get(a,b,c);cout<<*(obj2*obj3):"<<"a=*<\t*?*b="<\t*?endl;}【解答】(objl?obj2):a=5b=10c=15(obj2?obj3):a=25b=50c=75#includeusingnamespacestd;classVector{public:Vector(){}Vector(intitintj){x=i;y=j;)friendVectoroperator+(Vectorvl,Vectorv2){VectortempVector;tempVector.x=vl.x+v2.x;tempVector.y=vl.y+v2.y;returntempVector;

140voiddisplay(){cout?*(*<必須要用友員函數(shù)而教的運算符??程序略。

1411.類類型對象之間,類類型和基本類型對象之間用什么函數(shù)進(jìn)行類型轉(zhuǎn)換?歸納進(jìn)行類型轉(zhuǎn)換的構(gòu)造函數(shù)和類型轉(zhuǎn)換函數(shù)的定義形式、調(diào)用形式和調(diào)用時機(jī)?!窘獯稹繕?gòu)造函數(shù)可以把基本類型、類類型數(shù)據(jù)轉(zhuǎn)換成類類型數(shù)據(jù):類類型轉(zhuǎn)換函數(shù)可以在類類型和基本數(shù)據(jù)類型之間做數(shù)據(jù)轉(zhuǎn)換。定義形式調(diào)用形式調(diào)用時機(jī)構(gòu)造函數(shù)ClassX::ClassX(arg,argl=El,....argn=En):隱式調(diào)用建立對象、參數(shù)傳遞時類類型轉(zhuǎn)換函數(shù)ClassX::operatorTypeO:用類型符顯式調(diào)用:自動類型轉(zhuǎn)換時隱式調(diào)用需要做數(shù)據(jù)類型轉(zhuǎn)換時7.3編程題1.分別使用成員函數(shù)和友員函數(shù)編寫程序重載運算符“+”,使該運算符能實現(xiàn)兩個字符串的連接。【解答】(1)使用成員函數(shù)-include#includeusingnamespacestd;classs{public:s(){*str=''0';}s(char*pstr){strcpy(str,pstr);)char*gets(){returnstr;)soperator+(sobj);private:charstr[10]:};ss::operator+(sobj){strcat(str,obj.str);returnstr;〃或return*this}intmainO{sobjl("Visual"),obj2("C++”),obj3;obj3=objl+obj2;cout?obj3.getsO?endl;(2)使用友員函數(shù)

142Sinclude#includeusingnamespacestd;classs{public:s(){*str=''0';}s(char*pstr){strcpy(str,pstr);)char*gets(){returnstr:)friendsoperator-*-(sobjl,sobj2):private:charstr[100];};soperator+(sobjl,sobj2){stempobj;strcat(tempobj.str,objl.str);strcat(tempobj.str,obj2.str):returntempobj:)intmainO{sobjl("Visual"),obj2("C++*),obj3;obj3=objl+obj2;cout?obj3.getsO?endl;)2.定義一個整數(shù)計算類Integer,實現(xiàn)短整數(shù)+,-,*,/基本算術(shù)運算。要求可以進(jìn)行數(shù)據(jù)范圍檢查(-32768?32767,或自行設(shè)定),數(shù)據(jù)溢出時顯示錯誤信息并中斷程序運行。【解答】#includeusingnamespacestd;classInteger{private:

143shorta;public:Integer(shortn=0){a=n;}Integeroperator+(Integer);Integeroperator-(Integer);Integeroperator*(Integer);Integeroperator/(Integer);Integeroperator=(Integer);voiddisplay(){cout?a<32767){cout?*Dataoverflow!*<32767){cout?*Dataoverflow!*?endl:abort();}temp.a=a-x.a;returntemp;)IntegerInteger::operator*(Integerx){Integertemp;if(a*x.a<-32768|a*x.a>32767){cout<<*Dataoverflow!*?endl;abort();}temp.a=a*x.a;returntemp;)IntegerInteger::operator/(Integerx){Integertemp;if(a/x.a<-3276811a/x.a>32767){cout?*Dataoverflow!*?endl;abort0;}temp.a=a/x.a;

144returntemp;

145IntegerInteger::operator=(Integerx)(a=x.a;return*this;}intmain0{IntegerA(90),B(30),C;cout?*A=*:A.display();cout?*B=*;B.display();C=A+B;cout?*C=A+B=*;C.display();C=A-B;cout?*C=A-B=*:C.display();C=A*B:cout?*C=A*B=*;C.display0;C=A/B:cout?*C=A/B=*;C.display();)2.定義?個實數(shù)計算類Real,實現(xiàn)單精度浮點數(shù)基木算術(shù)運算。要求可以進(jìn)行數(shù)據(jù)范圍(-3.4、10"?3.4><10必,或自行設(shè)定)檢查,數(shù)據(jù)溢出時顯示錯誤信息并中斷程序運行。【解答】#includeusingnamespacestd;classReal{private:doublea;public:Real(doubler=0){a=r;}Realoperator+(Real);Realoperator-(Real);Realoperator*(Real);Realoperator/(Real);Realoperator=(Real);voiddisplay(){cout?a<

146};RealReal::operator+(Realx){Realtemp;if(a+x.a<-1.7e3081|a+x.a>l.7e308){cout?*Dataoverflow!*?endl:abort();}temp.a=a+x.a;returntemp;}RealReal::operator-(Realx){Realtemp:if(a-x.a<-1.7e3081|a-x.a>l.7e308){cout<<*Dataoverflow!*?endl;abort();}temp.a=a-x.a;returntemp;}RealReal::operator*(Realx){Realtemp:if(a*x.a<-1.7e308||a*x.a>l.7e308){cout<<*Dataoverflow!*<l.7e308){cout?*Dataoverflow!*?endl;abort();}temp.a=a/x.a;returntemp;)RealReal::operator=(Realx){a=x.a;return*this;)intmainO{RealA(l.l),B(1.2)tC;cout?*A=*;A.displayO:cout?*B=*;B.displayO;C=A+B;cout?*C=A+B=*:C.displayO;

147C=A-B;cout?*C=A-B=*:C.displayO:C=A*B;

148cout?*C=A*B=*;C.displayO;C=A/B;cout?*C=A/B=*:C.displayO;I2.設(shè)向量4=(打,無,,,…,局)和y=(力,力,…,%),它們之間的加、減和乘法分別定義為:X+Y=(X/+//,必+力,…,局+%)X-Y=(xt-yltx2-x?-y?)X*Y=m*%+力+,*%編程序定義向量類Vector,垂載運算符“+和“=",實現(xiàn)向量之間的加、減、乘、賦值運算;重載運算符“>>"、“<<”做向量的輸入、輸出操作。注意檢測運算的合法性?!窘獯稹?includeusingnamespacestd;classVector{private:doubIe*v;intlen:public:Vector(intsize);Vector(double*,int);'Vector0;double&operator[](inti);Vector&operator=(Vector&);friendVectoroperator+(Vector&,Vector&);friendVectoroperator-(Vector&,Vector&):frienddoubleoperator*(Vector&,Vector&);friendostream&operator?(ostream&output,Vector&);friendistream&operator>>(istream&input,Vector&););Vector::Vector(intsize){if(size<=0||size>=2147483647){cout?*Thesizeof*?size?*isoverflow!

149*;abort();)v=newdoub1e[size]:for(inti=0;i

150Vector::Vector(double?€,intsize){if(size<=0size>=2147483647){cout?*Thesizeof*<

151*?endl;abort():)v=newdouble[size]:len=size:for(inti=0;i=0&&i

152*;abort();})Vector&Vector::operator=(Vector&C){if(len==C.len){for(inti=0;i

153*;abort():))Vectoroperator+(Vector&A,Vector&B)//向量相加{intsize=A.len;double*T=newdouble[size];if(size==B.len){for(inti=0;i

154else{cout?*Operator+fail!

155*;abort():))Vectoroperator-(Vector&A,Vector&B)〃向量相減{intsize=A.len:double*T=newdoubletsize];if(size==B.len){for(inti=0;i

156*:abort();}}doubleoperator?(Vector&A,Vector&B)//向量相乘{(lán)intsize=A.len;doubles=0:if(size==B.len){for(inti=0;i

157*:abort();})ostream&operator?(ostream&output,Vector&A)〃輸出{inti;output?*C;for(i=0;i>A[i];returninput;

158)intmainO{intkl,k2,k3;doublet;cout?*InputthelengthofVectorA:

159*;cin?kl;VectorA(kl);cout?*InputtheelementsofVectorA:\rT;cin?A;cout?*InputthelengthofVectorB:

160*;cin?k2:VectorB(k2):cout?*InputtheelementsofVectorB:

161*;cin?B;cout?*InputthelengthofVectorC:

162*;cin?k3;VectorC(k3);cout?*A=*<?C?endl;C=A-B;cout?*A-B=*?A?*-*?B?*=>?C?endl;t=A*B;cout?*A*B=*?A?***?B?*=*?t?endl;)2.定義一個類nauticalmile_kilometer,它包含兩個數(shù)據(jù)成員kilometer(「米)和meter(米還包含一個構(gòu)造函數(shù)對數(shù)據(jù)成員初始化:成員函數(shù)print用于輸出數(shù)據(jù)成員kilometer和meter的值;類型轉(zhuǎn)換函數(shù)double。實現(xiàn)把千米和米轉(zhuǎn)換為海里(1海里=1.852千米)。編寫main函數(shù),測試類nauticalmilekilometer?!窘獯稹?includeusingnamespacestd;constdoublen=1.852;//定義海里與千米和米的轉(zhuǎn)換系數(shù)(1海里=1.852千米)classnauticalmile_kilometer{public:nauticalmilekilometer(intkm,doublem)(kilometer=km;meter=m;)

163voidprint(){cout?*kilometer=*?kilometer?,\t*?*meter=*?meter<

164(b)在基類定義的protected成員在私仃繼承的派生類中可見。(c)在基類定義的公有靜態(tài)成員在私有繼承的派生類中可見。(d)訪問聲明可以在公有繼承派生類中把基類的public成員聲明為private成員。7.在C++中,可以被派生類繼承的函數(shù)是(a).(a)成員函數(shù)(b)構(gòu)造函數(shù)(c)析構(gòu)函數(shù)(d)友員函數(shù)8.在創(chuàng)建派生類對象時,構(gòu)造函數(shù)的執(zhí)行順序是(d).(a)對象成員構(gòu)造函數(shù)一基類構(gòu)造函數(shù)一派生類本身的構(gòu)造函數(shù)(b)派生類本身的構(gòu)造函數(shù)一基類構(gòu)造函數(shù)一對■象成員構(gòu)造函數(shù)(c)基類構(gòu)造函數(shù)一派生類本身的構(gòu)造函數(shù)一對象成員構(gòu)造函數(shù)(d)基類構(gòu)造函數(shù)一對象成員構(gòu)造函數(shù)一派生類本身的構(gòu)造函數(shù)9.當(dāng)不同的類具有相同的間接基類時,(c)。(a)各派生類無法按繼承路線產(chǎn)生自己的基類版本(b)為了建立惟一的間接基類版本,應(yīng)該聲明間接基類為虛基類(c)為「建'工惟?的間接基類版木,應(yīng)該聲明派生類虛繼承基類(c)一旦聲明虛繼承,基類的性質(zhì)就改變了,不能再定義新的派生類8.2閱讀下列程序,寫出執(zhí)行結(jié)果1.#includeusingnamespacestd;classBase{public:voidget(inti,intj,intk,int1)(a=i;b=j;x=k:y=1;)voidprint(){cout?*a=*?a?*\t*?*b=*?b?>\t*?*x=*?X?>\t*?*y=*?y?endl;)inta,b;protected:intx,y;};classA:publicBase{public:voidget(inti,intj,intk,int1){Baseobj3;obj3.get(50,60,70,80);obj3.print():a=i;b=j;x=k;y=1;

165u=a+b+obj3.a;v=y-x+obj3.b;)voidprint(){cout?*a=*?a?*\t*?*b=*?b<<*\t*?=*?X<<'\t'?*y=*?y?endl;cout?*u=*?u?'\t'?*v=*?v?endl;}private:intu,v;);intmainO{Baseobjl;Aobj2;objl.get(10,20,30,40);obj2.get(30,40,50,60);objl.print0;obj2.print0;)【解答】a=50b=60x=70y=80a=10b=20x=30y=40a=30b=40x=50y=60u=120v=70#includeusingnamespacestd;classBasel{public:Basel(inti){cout?”調(diào)用基類Basel的構(gòu)造函數(shù):"?i?endl;)};classBase2{public:Base2(intj){cout?"調(diào)用基類Base2的構(gòu)造函數(shù):"?j?endl;}

166);classA:publicBasel,publicBase2{public:A(inta,intb,intc,intd):Base2(b),Basel(c),b2(a),bl(d)(cout?”調(diào)用派生類A的構(gòu)造函數(shù):*?a+b+c+d?endl;}private:Baselbl;Base2b2;);intmain(){Aobj(1,2,3,4);}【解答】調(diào)用基類BASE1的構(gòu)造函數(shù):3調(diào)用基類BASE2的構(gòu)造函數(shù):2調(diào)用基類BASE1的構(gòu)造函數(shù):4調(diào)用基類BASE2構(gòu)造函數(shù):1調(diào)用派生類A的構(gòu)造函數(shù):10k#includeusingnamespacestd;classA{public:A(inti,intj){a=i;b=j;}voidAdd(intx,inty){a+=x;b+=y;)voidshow(){cout?*(*?a<<*)\t(*?b<<*)

167*;}private:inta,b;);classB:publicA{public:B(inti,intj,intm,intn):A(i,j),x(m),y(n){}voidshow(){cout?*(*?x?*)\t(*?y?*)

168*;}voidfun(){Add(3,5);)voidff(){A::show();}private:intx,y;};{Aa(1,2);a.show();Bb(3,4,5,6);

169a.fun();b.A::show();c.show0;d.ffO;)【解答】(1)(2)(6)(9)(5)(6)(6)(9)L#includeusingnamespacestd;classA{public:A(constchar*s){cout?s?endl;}"(){}1;classB:virtualpublicA{public:B(constchar*sl,constchar*s2):A(si){cout?s2?endl;}};classC:virtualpublicA{public:C(constchar*sl,constchar*s2):A(sl){cout?s2?endl;}};classD:publicB,publicC{public:D(constchar*sl,constchar*s2,constchar*s3,constchar*s4):B(si,s2),C(si,s3),A(si){cout?s4?endl;}};

170{D*ptr=newD("classA*,"classB”,*classC”,*classD"):deleteptr;【解答】classAclassBclassCclassD8.3思考題1.函數(shù)和類兩種程序模塊都可以實現(xiàn)軟件重用,它們之間有什么區(qū)別?【解答】函數(shù)是基于參數(shù)集的功能抽象模塊,以調(diào)用方式實現(xiàn)軟件重用,函數(shù)之間沒有邏輯關(guān)系。類是數(shù)據(jù)屬性與操作的封裝,以繼承方式實現(xiàn)軟件重用,類之間構(gòu)成有向無回圖的類格。2.請按照類成員的訪問特性、類層次的繼承特點,做出一張表格,總結(jié)各種類成員在基類、派生類中的可見性和作用域?!窘獯稹縙基類成員派生類繼protectedprivatepublic在派生類中訪問特性不變。派生類和類外均可見,有作用域。在派生類中訪問特性不變。類體系中可見。基類私有成員,僅在基類中可見。protected成為派生類保護(hù)段成員。在整個類體系中可見。private成為派生類私有成員。僅在派生類和基類中可見。派生類不論以何種方式繼承基類,基類所有成員在整個類體系有作用域。3.若有以下說明語句:classA{private:intal;public:inta2;doublex;/*...?/);classB:privateA{private:intbl:publicintb2;doublex;/?...?/);Bb;對象b將會生成什么數(shù)據(jù)成員?與繼承關(guān)系、訪問特性、名字有關(guān)嗎?【解答】對皴b生成的數(shù)據(jù)成員有ala2A::xblb2B::x,共六個數(shù)據(jù)成員。數(shù)據(jù)成員的建立和繼承關(guān)系、訪問特性、名字無關(guān)。4.若有以下說明語句:

171classA{/*...?/public:voidsameFunO;};classB:publicA{/?...*/public:voidsameFunO;};voidcomFun()(Aa;Bb;/?...?/)(1)若在B::sameFun中要調(diào)用A::sanieFun,語句形式如何?它將在什么對象上操作?(2)在comFun中可以用什么方式調(diào)用A::sameFun和B::sameFun?語句形式如何?它們將可以在什么對年上操作?【解答】(1)若要在B::sameFun中調(diào)用A::sameFun,語句形式應(yīng)為:A::samefun0;〃域作用符說明調(diào)用基類函數(shù)調(diào)用的A::samefun將在B類對象上進(jìn)行操作。(2)在comFun中調(diào)用B::sameHun和A::saneFun的方式有:a.A::sameFunO;〃通過A類對象調(diào)用A::sameFun,在a類對象上操作。b.sameFunO;〃通過B類對象調(diào)用B::sameFun,在b類對象上操作。c.A::sameFunO;〃通過B類對象調(diào)用A::sameFun〃在b類對象上(對由基類繼承下來的數(shù)據(jù)成員)操作。4.有人定義一個教師類派生一個學(xué)生類。他認(rèn)為“姓名”和“性別”是教師、學(xué)生共有的屬性,聲明為public,“職稱”和“工資”是教師特有的,聲明為private。在學(xué)生類中定義特有的屬性“班級”和“成績”。所以有classteacher(public:charname[20];charsex;//……Private:chartitle[20];doublesalary;);classstudent:publicteacher{//……private:chargrade[20];intscore:};你認(rèn)為這樣定義合適嗎?請做出你認(rèn)為合理的類結(jié)構(gòu)定義。【解答】不合適,這樣導(dǎo)致數(shù)據(jù)冗余。合理的結(jié)構(gòu)是提取它們共有的數(shù)據(jù)和操作定義一個基類,然后分別定義teacher和student

172作為派生類。classperson{protected:charname[20];charsex;〃……);classteacher:publicteache{//……private:chartitle[20];doublesalary;};classstudent:publicteacher{//……private:chargrade[20];intscore;):4.在第6章的例6-21中,定義Student類包含了Date類成員??梢杂美^承方式把Student類定義為Date類的派生類嗎?如何改寫程序?請你試?試。【解答】可以用繼承方式改寫。程序略。5.“虛基類”是通過什么方式定義的?如果類A有派生類B、C,類A是類B虛基類,那它也一定是類C的虛基類嗎?為什么?【解答】虛基類是在聲明派生類時,指定繼承方式時聲明的,聲明虛基類的一般形式為:class派生類名:virtual繼承方式基類名若類A是類B和類C的虛基類,但不?定是類D的虛基類,原因在于“虛基類”中的“虛”不是基類本身的性質(zhì)。而是派生類在繼承過程中的特性。關(guān)鍵字virtual只是說明該派生類把基類當(dāng)作虛基類繼承,不能說明基類其他派生類繼承基類的方式.6.在具有虛繼承的類體系中,建立派生類對象時以什么順序調(diào)用構(gòu)造函數(shù)?請用簡單程序驗證你的分析。【解答】在具有虛繼承的類體系中,建立派生類對象時先調(diào)用間接基類構(gòu)造函數(shù),再按照派生類定義時各個直接基類繼承的順序調(diào)用直接基類的構(gòu)造函數(shù),最后再對派生類對象自身構(gòu)造函數(shù)。另外,C++為了保證虛基類構(gòu)造函數(shù)只被建M對象的類執(zhí)行?次,規(guī)定在創(chuàng)建對象的派生類構(gòu)造函數(shù)中只調(diào)用虛基類的構(gòu)造函數(shù)和進(jìn)行(執(zhí)行)自身的初始化。參數(shù)表中的其他調(diào)用被忽略,即宜接基類的構(gòu)造函數(shù)只調(diào)用系統(tǒng)自帶的版本,或調(diào)用自定義版本但不對虛基類數(shù)據(jù)成員初始化。程序略。

1738.4編程題1.定義?個Rectangle類,它包含兩個數(shù)據(jù)成員length和width;以及包含用于求長方形面積的成員函數(shù)。再定義Rectangle的派生類Rectangular,它包含一個新數(shù)據(jù)成員height和用來求長方體體枳的成員函數(shù)。在main函數(shù)中,使用兩個類,求某個長方形的面枳和某個長方體的體積?!窘獯稹?includeusingnamespacestd;classrectangle{public:rectangle(double1,doublew){length=1:width=w;}doublearea(){return(length*width);)doublegetlength(){returnlength;}doub1egetwidthO{returnwidth;}private:doublelength;doublewidth;};classrectangular:publicrectangle{public:rectangular(doub1e1,doub1ew,doubleh):rectangle(1,w){height=h;)doublegetheight()(returnheight;}doublevolume(){returnarea()*height;}private:doubleheight;};intmainO{rectangleobjl(2,8);rectangularobj2(3,4,5);cout?*length=*?objl.getlength()?*\t*?*width=*?objl.getwidthO?endl;cout?*rectanglearea=*?objl.area()?endl;cout?*length=*?obj2.getlength()?*\t*?*width=*?obj2.getwidthO;

174cout?*\t*<<*height=*<name和salary,以及用于輸入編號和姓名的構(gòu)造函數(shù)。由Employee類派生Salesman類,再由Salesman類派生Salesmanager類。Salesman類包含兩個新數(shù)據(jù)成員commrate和sales,還包含用于輸入銷售額并計兌銷售員工工資的成員函數(shù)pay和用于輸出的成員函數(shù)print。Salesmanager類包含新數(shù)據(jù)成員monthlypay,以及用于輸入銷售額并計算銷售經(jīng)理工資的成員函數(shù)pay、用丁輸出的成員函數(shù)print。。在main函數(shù)中,測試你的類結(jié)構(gòu),求若干個不同員工的工資。【解答】#includeusingnamespacestd;classemployee{public:employee()(cout?”編號:*:cin?number;cout<<"姓名:";cin?name;salary=0:}protected:charnumber[5];charname[10]:doublesalary;};classsalesman:publicemployee{public:salesman(){commrate=0.005:}voidpay(){cout,<

175};classsalesraanager:publicsalesman{public:salesmanagerO{monthlypay=8000;commrate=0.005;}voidpay(){cout<

1761.使用Integer類,定義派生類Vector類:classInteger{//......protected:};

177classVector:publicInteger{//.protected:int*v;};其中數(shù)據(jù)成員v用于建立向量,n為向量長度。要求類的成員函數(shù)可以實現(xiàn)向量的基本算術(shù)運算。【解答】略。6.用包含方式改寫第5題中的Vector類,使其實現(xiàn)相同的功能。classVectorprotected:Integer*v;Integersize;};7.使用Vector類,定義派生類Matrix,實現(xiàn)矩陣的基本算術(shù)運算?!窘獯稹柯?。8.用包含方式改寫第7題的Matrix類,使其實現(xiàn)相同的功能?!窘獯稹柯浴A?xí)題9及其解答9.1選擇題1.在C++中,要實現(xiàn)動態(tài)聯(lián)編,必須使用(d)調(diào)用虛函數(shù)。(a)類名(b)派生類指針(c)對象名(d)基類指針2.卜列函數(shù)中,不能說明為虛函數(shù)的是(c)<,(a)私有成員函數(shù)(b)公有成員函數(shù)(c)構(gòu)造函數(shù)(d)析構(gòu)函數(shù)3.在派生類中,重載一個虛函數(shù)時,要求函數(shù)名、參數(shù)的個數(shù)、參數(shù)的類型、參數(shù)的順序和函數(shù)的返回值(a)。(a)相同(b)不同(c)相容(d)部分相同4.中,根據(jù)(d)識別類層次中不同類定義的虛函數(shù)版本。(a)參數(shù)個數(shù)(b)參數(shù)類型5.虛析構(gòu)函數(shù)的作用是(c).(a)虛基類必須定義虛析構(gòu)函數(shù)(c)delete動態(tài)對■象時釋放資源(c)函數(shù)名(d)this指針類型(b)類對象作用域結(jié)束時釋放資源(d)無意義6.下面函數(shù)原型中,(b)聲明了fun為純虛函數(shù)。(a)voidfun()=0;(b)virtualvoidfun()=0;

178(c)virtualvoidfun();(d)virtualvoidfun(){):6.若?個類中含有純虛函數(shù),則該類稱為(c)。(a)基類(b)純基類(c)抽象類(d)派生類8.假設(shè)Aclass為抽象類,卜列正確的說明語句是(b)..(a)Aclassfun(int);(b)Aclass*p;(c)intfun(Aclass);(d)AclassObj:9.下面描述中,正確的是(d)。(a)虛函數(shù)是沒有實現(xiàn)的函數(shù)(c)抽象類是只有純虛函數(shù)的類10.構(gòu)造異質(zhì)鏈表的意義是(d)o(a)用數(shù)組組織類對皴(c)用抽象類指針指向派生類對象9.2閱讀下列程序,寫出執(zhí)行結(jié)果1.4includeusingnamespacestd;classBe1ass{public:Bclass(inti,intj){xvirtualintfun(){return(b)純虛函數(shù)是返回值等ro的函數(shù)(d)抽象類指針可以指向不同的派生類(b)用鏈表組織類對象(④用抽皴類指針構(gòu)造派生類對象鏈表i;y=j;};)protected:intx,y;};classIclass:publicBelass(public:Iclass(inti,intj,intk):Belass(i,j){z=k;}intfunO{return(x+y+z)/3;}private:intz;};intmainO{Iclassobj(2,4,10);Belasspl=obj;cout<fun()?endl;

179【解答】0505!.引includeusingnamespacestd;classBase{public:virtualvoidgetxy(inti,intj=0){x=i;y=j;virtualvoidfun()=0;protected:intx,y;);classA:publicBase{public:voidfun(){cout?*x=*?x?>\t*?*y=x?x=*<getxy(10);pb->fun();pb=&obj2;pb->getxy(100,20):

180pb->funO;【解答】x=10y=x*x=100x=100y=20y=x/y=59.3思考題1.在C++中,使用類體系依靠什么機(jī)制實現(xiàn)程序運行時的多態(tài)?【解答】在C++中,基類指針可以指向派生類對象,以及基類中擁有虛函數(shù),是支持多態(tài)性的前提。程序通過用同?個基類指針訪向不同派生類的虛函數(shù)重載版本實現(xiàn)程序運行時的多態(tài)。C++的虛特性負(fù)貴自動地在程序運行時把基類指針的美聯(lián)類型轉(zhuǎn)換成當(dāng)前指向?qū)ο蟮呐缮愵愋?。另外,抽象類機(jī)制提供了軟件抽象和可擴(kuò)展性的手段,實現(xiàn)運行時的多態(tài)性。2.如果一個類的虛函數(shù)被聲明為私有成員函數(shù),會有語法錯誤嗎?當(dāng)它作為基類時,可以在應(yīng)用類體系時實現(xiàn)動態(tài)聯(lián)編嗎?請你驗證一下?!窘獯稹繘]有語法錯誤。但在應(yīng)用類體系時無法實現(xiàn)動態(tài)編聯(lián)和多態(tài)。因為私有成員函數(shù)只在類內(nèi)可見,在類外無法調(diào)用,無法在類外通過基類指針實現(xiàn)多態(tài)。程序略。3.虛函數(shù)和純虛函數(shù)的區(qū)別是什么?【解答】虛函數(shù)定義時冠以關(guān)鍵字virtual,本身有實現(xiàn)代碼,作用是引導(dǎo)基類指針根據(jù)指向?qū)ο笳{(diào)用類體系中不同重載版本函數(shù)。純虛函數(shù)是指在說明時代碼“為0”的虛函數(shù),即純虛函數(shù)本身并沒有實現(xiàn)代碼,必須通過它的派生類定義實現(xiàn)版本。4.一個非抽象類的派生類是否可以為抽象類?利用例971進(jìn)行驗證,從Hex_type類派生一個Hex_format類,其中包含一個純虛函數(shù)Show_format,然后定義Hex_format的派生類定義實現(xiàn)Showformat0【解答】一個非抽象類的派生類可以為抽象類,即在派生類中定義了純虛函數(shù)。程序略。94編程題I.使用虛函數(shù)編寫程序求球體和圓柱體的體積及表面積。由于球體和圓柱體都可以看做由圓繼承而來,所以可以把圓類Circle作為基類。在Circle類中定義一個數(shù)據(jù)成員radius和兩個虛函數(shù)area和volume,由Circle類派生Sphere類和Column類。在派生類中對虛函數(shù)area和volume重新定義,分別求球體和圓柱體的體積及表面積?!窘獯稹?includeusingnamespacestd:constdoublePI=3.14159265;classcircle

181{public:circle(doubler){radius=r;}virtualdoublearea(){return0.0;}virtualdoublevolume(){return0.0;1protected:doubleradius:);classsphere:pub1iccircle{public:sphere(doubler):circle(r){}doublearea(){return4.0*PI*radius*radius;}doublevolume(){return4.0*PI*radius*radius*radius/3.0;});classcolumn:pubIiccircle{public:colunin(doubler,doubleh):circle(r){height=h;}doublearea(){return2.0?PI*radius?(height+radius);}doublevolumeO{returnPI*radius?radius*height;}private:doubleheight;};intmain(){circle*p;spheresobj(2);p-&sobj;cout?"球體:"?endl;cout?”體積=*?p->volume()?endl;cout?”表面積=*?p->area()?endl;columncobj(3,5);P=&cobj;cout?“圓柱體:"?endl;cout?"體枳=*?p->volume()?endl;cout?"表面積=>?p->area()?endl;2.某學(xué)校對教師每月工資的計算規(guī)定如下:固定工資+課時補(bǔ)貼。教授的固定工資為5000元,每個課時補(bǔ)貼50元。副教授的固定工資為3000

182元,每個課時補(bǔ)貼30元。講師的固定工資為2000元,每個課時補(bǔ)貼20元.定義教師抽象類,派生不同職稱的教師類,編寫程序求若干個教師的月工資?!窘獯稹?includeusingnamespacestd;classteacher{public:teacher(chartname[],inttime){strcpy(name,tname);coursetime=time;}virtualintpay()=0;virtualvoidprint0=0;char*getname()(returnname;)intgetcoursetime0{returncoursetime;}protected:charname[30];intcoursetime;};classprofessor:publicteacher{public:professor(charpname[],inttime):teacher(pname,time){}intpay(){return5000+coursetime*50;}voidprint(){cout<<"教授:*?getname0;});classassociateprofessor:pub1icteacher{public:associateprofessor(charpname[],inttime):teacher(pname,time){}intpay(){return3000+coursetime*30;}voidprint(){cout?"副教授:"?getnameO:)};classlecturer:publicteacher{public:lecturer(charpname[],inttime):teacher(pname,time){}intpay0{return2000+coursetime*20;}voidprint()

183{cout?"講師:"<\t*<<"工資:"?pobj.pay()?endl;associateprofessorapobj(“王芳芳",56);apobj.print0;cout<<'\t'<<"工資:*?apobj.pay()?endl;lecturerlobj("何大建”,72);lobj.print();cout?>\t*<<“工資:"?lobj.pay()?endl;}3.使用習(xí)題9.4.2題中定義的教師類體系,程序輸入某月各種職稱教師的工資信息,建立異質(zhì)鏈表,輸出每位教師匚資條、統(tǒng)計當(dāng)月的總工資、平均工資、最高工資和最低工資?!窘獯稹柯?。4.改寫第8章習(xí)題8.4第3題,把Shape類定義為抽象類,提供共同操作界面的純虛函數(shù)。TwoDimShape類和ThreeDimShape類仍然抽象類,第3層具體類才能提供全部函數(shù)的實現(xiàn)。在測試函數(shù)中,使用基類指針實現(xiàn)不同派生類對象的操作?!窘獯稹柯?。習(xí)題10及其解答10.1選擇題1.關(guān)于函數(shù)模板,描述錯誤的是(a)。(a)函數(shù)模板必須由程序員實例化為可執(zhí)行的函數(shù)模板(b)函數(shù)模板的實例化由編譯器實現(xiàn)(c)?個類定義中,只要有?個函數(shù)模板,則這個類是類模板(d)類模板的成員函數(shù)都是函數(shù)模板,類模板實例化后,成員函數(shù)也隨之實例化2.卜列的模板說明中,正確的是(c)o(a)template(b)template

184(c)template(d)template(typedefTl,typedefT2)3.假設(shè)有函數(shù)模板定義如卜.:templateMax(Ta,Tb,T&c)(c=a+b;}下列選項正確的是(b)0(a)intx,y:charz;Max(x,y,z);(c)intx,y;floatz;Max(x,y,z);4.關(guān)于類模板,描述錯誤的是((b)doublex,y,z;Max(x,y,z);(d)floatx;doubley,Max(x,y,z);a)?(a)(b)(c)(d)5.(a)一個普通基類不能派生類模板類模板可以從普通類派生,也可以從類模板派生根據(jù)建立對象時的實際數(shù)據(jù)類型,編譯器把類模板實例化為模板類函數(shù)的類模板參數(shù)需生成模板類并通過構(gòu)造函數(shù)實例化建立類模板對象的實例化過程為(c)?;悺放缮?c)模板類)對象6.在C++中,容器是一種(d)<,(a)標(biāo)準(zhǔn)類(b)標(biāo)準(zhǔn)對象10.2閱讀下列程序,寫出執(zhí)行結(jié)果1.includeusingnamespacestd;templatevoidfun(T&x,T&y)(Ttemp;temp=x;x=y;y=temp;(b)構(gòu)造函數(shù))對象(d)模板類分模板函數(shù)(c)標(biāo)準(zhǔn)函數(shù)(d)標(biāo)準(zhǔn)類模板)intmain(){inti,j;i=10;j=20;fun(i,j);cout?*i=*?i?'\t'?=*?j?endl:doublea,b:a=1.1;b=2.2:

185fun(a,b);cout?*a=*?a<<'\t'?*b=*?b?endl;}【解答】i=20j=10a=2.2b=l.12.#includeusingnamespacestd:templateclassBase{public:Base(Ti,Tj){x=i:y=j;}Tsum(){returnx+y;}private:Tx,y;};intmain(){Baseobj2(3.3,5.5);cout?obj2.sum()?endl;Baseobj1(3,5);cout?objl.sum()?endl;}【解答】8.8810.3思考題1.抽象類和類模板都是提供抽象的機(jī)制,請分析它們的區(qū)別和應(yīng)用場合。【解答】抽象類至少包含一個純虛函數(shù),純虛函數(shù)抽象了類體系中一些類似操作的公共界面,它不依賴于數(shù)據(jù),也沒有操作定義。派生類必須定義實現(xiàn)版本。抽象類用于程序開發(fā)時對功能的統(tǒng)一策劃,利用程序運行的多態(tài)性自動匹配實行不同版本的函數(shù)。類模板抽象了數(shù)據(jù)類型,稱為類屬參數(shù)。成員函數(shù)描述了類型不同,邏輯操作相同的功能集。編譯器用建立對象的數(shù)據(jù)類型參數(shù)實例化為模板類,生成可運行的實體。類模板用于抽象數(shù)據(jù)對象類型不同,邏輯操作完全相同類定義。這種數(shù)據(jù)類型的推導(dǎo)必須在語言功能的范疇之內(nèi)的。2.類屬參數(shù)可以實現(xiàn)類型轉(zhuǎn)換嗎?如果不行,應(yīng)該如何處理?【解答】

186類屬參數(shù)不可以實現(xiàn)類型轉(zhuǎn)換。為了解決參數(shù)陶式類型轉(zhuǎn)換的問題,可以用類型參數(shù)把函數(shù)模板重載為非模板函數(shù)。1.類模板能夠聲明什么形式的友員?當(dāng)類模板的友員是函數(shù)模板時,它們可以定義不同形式的類屬參數(shù)嗎?請你寫個驗證程序試一試?!窘獯稹款惸0蹇梢月暶鞯挠褑T形式有:普通函數(shù)、函數(shù)模板、普通類成員函數(shù)、類模板成員函數(shù)以及普通類、類模板。當(dāng)類模板的友員是函數(shù)模板時,它們可以定義不同形式的類屬參數(shù)。程序略。2.類模板的靜態(tài)數(shù)據(jù)成員可以是抽象類型嗎?它們的存儲空間是什么時候建立的?請你用驗證程序試一試?!窘獯稹款惸0宓撵o態(tài)數(shù)據(jù)成員可以是抽象類型。它們的存儲空間在生成具體模板類的時候建立,即每生成一個模板類同時建立靜態(tài)儲存空間并做一次文件范圍的初始化。程序略。10.4編程題1.使用函數(shù)模板實現(xiàn)時不同類型數(shù)組求平均值的功能,并在main函數(shù)中分別求一個整型數(shù)組和一個單精度浮點型數(shù)組的平均值?!窘獯稹?includeusingnamespacestd;templatedoubleaverage(T*array,intsize){Tsum=0;for(inti=0;iusingnamespacestd;template

187classList{public:List(Tx){data=x;}voidappend(List*node){node->next=this;next=0;}List*getnext(){returnnext;}TgetdataO{returndata;}private:Tdata;List*next:};intmainO(inti,idata,n,fdata:cout<<.輸入結(jié)點的個數(shù):cin?n;cout<<"輸入結(jié)點的數(shù)據(jù)域:“;cin?fdata;Listheadnode(fdata);List*p,*last;last=&headnode;for(i=l;i(idata);p->append(last);last=p;)cout?”鏈表已經(jīng)建立!*?endl;cout?"鏈表中的數(shù)據(jù)為:*?endl;p=&headnode;while(p){cout<getdata()?endl:p=p->getnext();}}1.定義類模板TCounter實現(xiàn)基本類型數(shù)據(jù)的=,?,?運算:類模板TVector實現(xiàn)向量運算:類模板TMatrix實現(xiàn)矩陣運算。請分析使用類模板建立TCounter?TVector,TMatrix對象和使用類繼承體系建立IneReal?Vector,Matrix對象(見第8章習(xí)題8.4第4、5、7小題)的語法區(qū)別和運算功能區(qū)別?!窘獯稹?/p>

188略。1.學(xué)習(xí)MSDNLibrary中VisualC++的STL,應(yīng)用容器和算法,實現(xiàn)?個簡單的人員信息管理系統(tǒng)?!窘獯稹柯?習(xí)題11及其解答11.1選擇題I.下列流類中可以用于處理文件的是(d).(a)ios(b)iostream(c)strstream(d)fstream2.在下列選項中(b)是istream類的對象。(a)cerr(b)cin(c)clog(d)cout3.用于處理字符串流的是(a)?(a)strstream(b)ios(c)fstream(d)iosteam4.能夠從輸入流中提取指定長度的字節(jié)序列的函數(shù)是(c)。(a)get(b)getline(c)read(d)cin5.能夠把指定長度的字節(jié)序列插入到輸出流中的函數(shù)是(b)。(a)put(b)write(c)cout(d)print6.getline函數(shù)的功能是從輸入流中讀取(c).(a)一個字符(b)當(dāng)前字符(c)一行字符(d)指定若F個字節(jié)7.卜列選項中,用于清除基數(shù)格式位設(shè)置以十六進(jìn)制輸出的語句是(b).(a)cout?setf(ios::dec,ios::basefield)(b)cout?setf(ios::hex,ios::basefield)(c)cout?setf(ios::oct,ios::basefield)(d)cin>>setf(ios::hex,ios::basefield)8.下列格式控制符,既可以用丁輸入,又可以用于輸出的是(a)。(a)setbase(b)setfill(c)setprecision(d)setw9.要求打開文件D:\file.dat,并能夠?qū)懭霐?shù)據(jù),正確的語句是(d).(a)ifstreaminfile("D:\\file.dat",ios::in);(b)ifstreaminfile("D:\\file.dat",ios::out);(c)ofstreamoutfile(MD:\\file.dat",ios::in);(d)fstreaminfile(MD:\\file.dat",ios::in|ios::out);10.能實現(xiàn)刪除文件數(shù)據(jù)的語句是(a(a)ofstreamfs("date.dat",ios::trunc);(b)ifstreamfs("date.dat",ios::trunc);(c)ofstreamfs("date,dat-,ios::out):(d)ifstreamfs("date.dat",ios::in);11.設(shè)已定義浮點型變量data,以二進(jìn)制方式把data的值寫入輸出文件流對象outfile中去,正確的語句是(c).(a)outfile.write((double?)&data.sizeof(double));(b)outfile.write((double?)&data,data);(c)outfile.write((char*)&data,sizeof(double));(d)outfile.write((char*)&data,data);

1898.二進(jìn)制文件流fdat讀指針移到文件頭的語句是(a)。(a)fdat.seekg(0,ios::beg);(b)fdat.tellg(0,ios::beg);(c)fdat.seekp(0,ios::beg):(d)fdat.tellp(0,ios::beg);11.2閱讀下列程序,寫出執(zhí)行結(jié)果Lttincludeusingnamespacestd;intmain0{doublex=123.456;cout.width(10);cout.setf(ios::dec,ios::basefield):cout?x?endl;cout.setf(ios::left);cout?x?endl;cout.width(15);cout.setf(ios::right,ios::left);cout?x?endl;cout.setf(ios::showpos);cout?x?endl;cout<<_x?endl;cout.setf(ios::scientific);cout<

190cout.setf(ios::showpos);cout?x?endl;cout.setf(ios::scientific);cout?x?endl;)【解答】#123.457123.46+123.46+1.23457e+0022.#includettincludeusingnamespacestd;intmainO{doublex=123.456789;cout?setiosflags(ios::fixedIios::showpos)?x<#includeusingnamespacestd;intmainO{inti:ofstreamftxtl;ftxtl.open(*d:\\f1.txt*,ios::out);for(i=l;i<10;i++)ftxtl<

191{ftxt2?i?i;cout?i?endl;}}【解答】246894.以卜程序使用了11.2.4題中生成的文件d:\fl.txt。寫出程序運行后屏幕顯示的結(jié)果。#include#includeusingnamespacestd;intmain(){inti:ifstreamfl(*d:\\fl.txt*,ios::in);fstreamf2;f2.open(*d:\\f2.dat*,ios::out|ios::binary);while(!fl.eof()){fl?i;i=i*5;f2.write((char*)&i,sizeof(int));)fl.close();f2.close();f2.open(*d:\\f2.dat*,ios::in|ios::binary):do(f2.read((char*)&i,sizeof(int));cout?i<<

192}while(i<30);cout<usingnamespacestd;intmain()

193{intx;doublea;cout?*xsin(x)cos(x)tg(x)*?endl;//輸出表頭for(x=l;x<=10;x++){a=x?3.14159265/180:〃角度轉(zhuǎn)換為弧度cout<#includeusingnamespacestd;intmainO{charfilename[20]:fstreamoutfile:cout?*Pleaseinputthenameoffile:

194”;cin?fi1ename;outfile.open(filename,ios::out);if(loutfile)(cerr?”Filecouldnotbeopen.*?endl;abort();)outfile?”Thisisafileofstudents

195*;outfile?*Inputthenumber,name,andscore.

196*;outfile?*EnterCtrl-Ztoendinput?*;outfile.close();)2.把由習(xí)題11.4第2小題建立的文本文件讀出,顯示在屏幕上并統(tǒng)計該文件的行數(shù)?!窘獯稹?/p>

197★includeusingnamespacestd;intmainO{charfilename[20];fstreaminfile;cout?*Pleaseinputthenameoffile:

198*;cin?filename:infile.open(fi1ename,ios::in):if(linfile){cerr?”Filecouldnotbeopen.*?endl;abort();}chartextline[80];inti=0;while(!infile.eof0){infile.getline(textline,sizeof(textline)):cout?text1ine?endl;++i;}infile,close();cout?*i=*<#includeusingnamespacestd;structtxrec{charno[6];charname[20];chartel[9];charpostc[7];charaddr[30];

199};intmain(){intn,i;structtxrecgzrec;charfilename[20];「streamoutfile;cout?”請輸入通訊錄文件名:”;cin?filename:outfile.open(filename,ios::outIios::binary);if(loutfile){cerr?"文件不能打開!"?endl;abort();}cout??請輸入職工人數(shù):“;cin?n;for(i=l;i<=n;i++)(cout<<“請輸入第"<#includeusingnamespacestd;structtxrec

200{charno[6];charname[20];chartel[9];

201charpostc[7];charaddr[30];);intmainO(structtxrecgzrec;inti;charfilename[2O],num[6];fstreaminfile:cout?”請輸入通訊錄文件名:”;cin?fi1ename;infile.open(filename,ios::inIios::binary);if(!infile){cerr?”文件不能打開!*?endl;abort();)infile.seekg(0,ios::end);longposend=infile.tellp();infile.seekg(0,ios::beg);cout?"請輸入職工編號:“;cin?num;do{infile.read((char*)&gzrec,sizeof(txrec));}while(strcmp(gzrec.no,num)!=0&&long(infile.tellpO)!=posend);if(strcmp(gzrec.no,num)=0){cout?”該職工的記錄找到了!"?endl:cout?"編號:"?gzrec.no?endl;cout?"姓名:"?gzrec.name?endl:cout?"電話號碼:"<

202usingnamespacestd;intmain(){intdalal,data2;fstreaminfilel,infile2,outfile;infilei.open(*d:\\vc\\f.dal*,ios::inios::binary);if(linfilel){cerr<<"文件不能打開!*<

203}cout?”文件合并已完成!"?endl;infilel.closeO;infile2.closeO;outfile.closeO:)1.編寫一個函數(shù),使用數(shù)據(jù)文件測試在第10章習(xí)題10.4第3小題完成的T_Counter類體系。即準(zhǔn)備好一個文件inputdat用于輸入數(shù)據(jù),把程序運行結(jié)果顯示在屏幕并且寫入文件outputdato【解答】略。習(xí)題12及其解答12.1閱讀下列程序,寫出執(zhí)行結(jié)果1.#include=10)throwi;returna[i];)【解答】數(shù)組下標(biāo)越界!S=55ttincludeusingnamespacestd;voidf();classT{public:TO(cout?”constructor"?endl;try

204{throw“exception”;}catch(char*){cout?*exceptionl*?endl;}throw.exception”;}-TO{cout?"destructor”;});intmainO{cout?”mainfunction*?endl;try{f();}catch(char?)(cout?”exception2"?endl:}cout?*mainfunction"?endl:)voidf(){Tt;}【解答】mainfunctionconstructorexceptionlexception2mainfunction12.2思考題1.?個應(yīng)用是否?定設(shè)計異常處理程序?異常處理的作用是什么?【解答】一個應(yīng)用不一定要設(shè)計異常處理程序。異常處理以結(jié)構(gòu)化思想把異常檢測與異常處理分離,增加了程序的可讀性,便于大型軟件的開發(fā).2.什么叫拋出異常?catch可以獲取什么異常參數(shù)?是根據(jù)異常參數(shù)的類型還是根據(jù)參數(shù)的值處理異常?請編寫測試程序驗證?!窘獯稹緾++異常處理通過三個關(guān)鍵字實現(xiàn):throw、try和catch。被調(diào)用函數(shù)按指定條件檢測到異常條件的存在,用throw-個數(shù)值,稱為拋出一個異常。這個函數(shù)僅僅做了throw,而不去處理錯誤。在上層調(diào)用函數(shù)中使用try語句檢測函數(shù)調(diào)用是否引發(fā)異常,被檢測到的各種異常由catch語句捕獲并作相應(yīng)的處理。catch只是根據(jù)異常參數(shù)的類型(不管具體數(shù)值)處理異常。3.什么叫不喚醒機(jī)制?這種機(jī)制有什么好處?請舉例說明?!窘獯稹坎粏拘褭C(jī)制是指拋出異常后,調(diào)用鏈上的所有模塊都終止執(zhí)行,不返回異常拋出點。這種機(jī)制的好處是把函數(shù)的正常功能設(shè)計和異常處理設(shè)計分離,便于結(jié)構(gòu)化處理。程序略。12.3編程題1.從鍵盤上輸入x和y的值,計算y=ln(2x-y)的值,要求用異常處理“負(fù)數(shù)求對數(shù)”的情況?!窘獯稹縤tinclude^includeusingnamespacestd;

205doublef(doublex,doubley);intmain()1doublex,y;try{cout?.輸入x和y的值:”;cin?x?y;cout?f(x,y)?endl:)catch(char?)Icout?"負(fù)數(shù)不能求對數(shù)!"?endl;))doublef(doublex,doubley){if(2*x-y<0)throw“error*;elsereturnlog(2*x-y);I2.程序中典型的異常有:內(nèi)存不足以滿足new的請求、數(shù)組卜標(biāo)越界、運算溢出、除數(shù)為0或無效函數(shù)參數(shù)等。簡單描述程序應(yīng)該如何用異常處理的方法處理這些情況?!窘獯稹柯?。3.把本章12.2.4節(jié)列示的代碼補(bǔ)充成完整的測試程序運行?!窘獯稹柯?。

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。
關(guān)閉