《華工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 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 3cout?(a++)+(++b)< 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)識符地址值通過指針變量的地址值間址訪問對象驗證程序:ttinclude 5cin?a;int*pa=&a;cout?*a的值:*?a?endl;cout?*a的地址:*?&a?endl;cout<<"ra的值:*?ra?endl;cout?*ra的地址:*?&ra?endl;cout?”pa所指向的變局的值:*?*pa< 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-b 7b=*< 8*p=*<<*p<<** 9*q=*?*q?* 10ra=*< 11*rt=*?*rt?endl;)【解答】字符和的意義見程序中添加的注擇。4include 12*rt=30;//是間址訪問符〃輸出語句中的是間址訪問符cout?*a=>?a?* 13b=*?b?* 14*p=*?*p?* 15*q=*?*q<<* 16ra=*?ra?* 17*rt=*?*rt< 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á)式)?!窘獯稹?include 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< 20【解答】201.#include 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 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#include 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#include 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程序#include 48cout<< 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.輸入三角形的三條邊,判別它們能否形成三角形,若能,則判斷是等邊、等腰、還是一般三角形。【解答】#include 50case4:case3:case2:case1:case0:grade=*e,;break;|}else{cout<<“數(shù)據(jù)輸入錯誤!”《endl;gotoend:)cout< 51default:cout?”secondinputerror!*?endl;gotoend:1case,p':switch(second){case,s*:cout?.Paperiscutbyscissor.*?endl:gotoend;case'r':cout?,Paperwrapstherock.*< 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 53為水仙花數(shù)。【解答】#include 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的值。【解答】#include 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.#include 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#inc1ude 60rt=tl;?rt+=5;cout<*tl?”,*t2=*?*t2?”,*rt=*<<*rt?endl;)【解答】*tl=20,*t2=25,*rt=20?p=20,*q=25#include 61if(n=1)f=10;elsef=age(n-l)+2;returnf;}intmain(){cout?*age:*?age(5)?endl:)【解答】age:18#include 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ù)表。驗證程序:#include 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)用).驗證程序:#include 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)該如何訪問?請寫一個驗證程序說明。【解答】一個語句塊中不能訪問外層的同名局部變量。可以訪問一個同名的全局變量。驗證程序:#include 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。驗證程序:#include 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 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ù)#include 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< 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 72t2=(n-l)*p(x,n-2);return(tl-t2)/n:})6.把以下程序中的print。函數(shù)改寫為等價的遞歸函數(shù)。#include 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 74【解答】itinclude 75if(x 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,ttinclude 78}【解答】sum=20#include 79【解答】135i.#include 80cout?*test2:*p2=*<<*p?endl;}【解答】*al=5testl:*pl=1*a2=5test2:*p2=57.#include 81for(i=0;i<3;i++)cout??(p+i)?endl;}【解答】c++basicpascal7.*include 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驗證程序:#include 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é)果,請分析程序的錯誤原因并修改之。#include 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 85for(i=0;i 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(i 88【解答】#include 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;i 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< 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 96//對數(shù)組逆置函數(shù)voidadverse(int*p,intn){inti,t;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!*< 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.^include 100#include 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)程序如下:#include 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 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é)果。【解答】^include 108【解答】#include 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])) 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'< 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é)點已被刪除!“< 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é)點的單向鏈表,并輸出該鋅表中的字符?!窘獯稹?include 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#include 12848調(diào)用構(gòu)造函數(shù)2.4820調(diào)用析構(gòu)函數(shù).調(diào)用析構(gòu)函數(shù).3.#include 129intmainO{Pointpl(2,3);cout?"到";Pointp2(4,5);cout?”的距離是:*?d(pl,p2)?endl;}【解答】點(3,4)到點(4,5)的距離是:2.828433.#include 130display2:a=4A:a=53.#include 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)行簡單的顯示、借閱和歸還管理。【解答】#include 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對象,并求盒子的體枳。【解答】#include 136scoretotalcount(doubles)用于設(shè)置分?jǐn)?shù)、求總分和累計學(xué)生人數(shù):靜態(tài)成員函數(shù)sum()用于返回總分:靜態(tài)成員函數(shù)average。用于求平均值。在main函數(shù)中,輸入某班同學(xué)的成績,并調(diào)用上述函數(shù)求全班學(xué)生的總分和平均分。【解答】#include 137setPoint求這兩條直線的交點?!窘獯稹?include 138setp=setpoint(11,12);cout<<“直線11和直線12的交點:("< 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#include 140voiddisplay(){cout?*(*< 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 142Sinclude 143shorta;public:Integer(shortn=0){a=n;}Integeroperator+(Integer);Integeroperator-(Integer);Integeroperator*(Integer);Integeroperator/(Integer);Integeroperator=(Integer);voiddisplay(){cout?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ù)溢出時顯示錯誤信息并中斷程序運行。【解答】#include 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!*< 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)向量之間的加、減、乘、賦值運算;重載運算符“>>"、“<<”做向量的輸入、輸出操作。注意檢測運算的合法性?!窘獯稹?include 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 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 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: 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.#include 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#include 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#include 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#include 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ù)中,使用兩個類,求某個長方形的面枳和某個長方體的體積?!窘獯稹?include 174cout?*\t*<<*height=*< 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.4include 179【解答】0505!.引include 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重新定義,分別求球體和圓柱體的體積及表面積?!窘獯稹?include 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元.定義教師抽象類,派生不同職稱的教師類,編寫程序求若干個教師的月工資?!窘獯稹?include 183{cout?"講師:"< 184(c)template 185fun(a,b);cout?*a=*?a<<'\t'?*b=*?b?endl;}【解答】i=20j=10a=2.2b=l.12.#include 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ù)組的平均值?!窘獯稹?include 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;List 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é)果Lttinclude 190cout.setf(ios::showpos);cout?x?endl;cout.setf(ios::scientific);cout?x?endl;)【解答】#123.457123.46+123.46+1.23457e+0022.#include 191{ftxt2?i?i;cout?i?endl;}}【解答】246894.以卜程序使用了11.2.4題中生成的文件d:\fl.txt。寫出程序運行后屏幕顯示的結(jié)果。#include 192}while(i<30);cout< 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< 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★include 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=*<#include 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<<“請輸入第"<#include 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 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 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ǔ)充成完整的測試程序運行?!窘獯稹柯?。
此文檔下載收益歸作者所有