



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第一章C++基礎(chǔ)知識習(xí)題1.1判斷下列標(biāo)識符的合法性。sinbook 5arrynameExample2.1main$1 class_cpp a3x*ymyname答:合法的:sin book namemain class_cppa3非法的:5arryExample2.1 $1x*ymynameL2假定有下列變量:inta=3,b=5,c=0;floatx=2.5,y=8.2,z=l.4;charchl='a',ch2=5,ch3=’〇',ch4;求下列表達(dá)式的值,以及運算后表達(dá)式所涉及的各變量的值。x+(int)y%a x=z*b-H-,b=b*x,b++ ch4=ch3-ch2+ch1int(y⑵+(int)y/(int)z !(a>b)&&c&&(x*=y)&&b++ch31|(b+=a*c)||c-H- z=(a?2)/(b?l)答:x+(int)y%a值為:4.5x=z*b++,b=b*x,b++值為:42,x為7,b為43eh4=ch3?ch2+chl值為:\\'int(y⑵+(int)y/(int)z值為:13!(a>b)&&c&&(x*=y)&&b++值為:0,b為5注:只要出現(xiàn)ー個false右邊的不再做。ch3||(b+=a*c)||c++值為:1,e為〇注:只要出現(xiàn)ー個true,右邊不再做。z=(a?2)/(b?l)值為:61.3判斷下列哪些是常量,哪些是變量?!癈hina" constintn=10; intm=5; 'a'charch-a,intarray[5]={l,2,3,4,5};chars[]="HelloM;答:"China”文字常量constintn=10;常變量intm=5茂量豆文字常量charめ=R變量intarray[5]={l,2,3,4,5};變量chars口=”Hello”;變量L4將下列算式或敘述用CH表達(dá)式描述。(x+y)/((x-y)*ay)(3)位于原點為圓心,a,b為半徑的圓環(huán)中的點坐標(biāo)。(4)〇(5)并且字符ch不為ヘ〇'答:pi/2+sqrt(asin(x)*asin(x)+c*c)(x+y)/((x-y)*pow(a,y))((x*x+y*y)>=a*a)&&((x*x+y*y)<=b*b)(a!=b)&&(a!=c)&&(b!=c)(kく=20)&&(ch!二‘、〇')設(shè)有語句:inta,b;floatx,y;charchl,ch2,ch3;cin?a?b?x?y?ch1;ch2=cin.get();cin?ch3;若從鍵盤輸入:321.87abc執(zhí)行后各變量取值如何?注意abc三字符兩兩間有空格。答:a是3,b是2,x是1.8,y是7,chi是‘a(chǎn)',ch2是空格,ch3是‘b'。設(shè)有語句:inta,b,c,d;cin?oct?a?b?hex?c?dec?d;若從鍵盤輸入:23232323執(zhí)行后各變量的值用十進(jìn)制表示各是多少?答:a:19,b:19,c:35,d:23對于習(xí)題1.7,若執(zhí)行:cout?a?,\t,?hex?b?M,?oct?c?endl;顯示結(jié)果是什么?答:19 0x13 043當(dāng)前位置:學(xué)習(xí)資源下載〉課后習(xí)題答案第二章基本控制結(jié)構(gòu)程序設(shè)計習(xí)題一.基本概念與基礎(chǔ)知識自測題程序閱讀題設(shè)有說明:inta=3,b=100;下面的循環(huán)語句執(zhí)行(1)次,執(zhí)行后a、b的值分別為(2)、(3)。while(b/a>5){if(b-a>25)a++;elseb/=a;解答:本題檢查學(xué)生整除的概念。跟蹤:abb/a循環(huán)次數(shù)b-a310033197410025296510020395???…???…???15100613851610061484171005停(1)14(2)17(3)100設(shè)有說明:intx,y,n,k;下面程序段的功能是備選答案中的(1),當(dāng)n=10.x=10打印結(jié)果是(2)cin?x?n;k=0;do{x/=2;k++;}while(k<n);y=l+x;k=0;do{y=y*y;k++;)while(k<n);cout?y?endl;備選答案:A.B.C.D.解答:第一個循環(huán)使x成為:;y成為:;第二個循環(huán)使y成為:;B考慮整除,當(dāng)x連除4次2以后即為〇,所以:為〇12.1.3請看如下程序段:ifi(num=l)coutvv''Alpha”;elseiRnum==2)cout?^^Bata,,;elseifi(num==3)coutvv“Gamma'';elsecout?,,DeltaM;當(dāng)num的值分別為1、2、3時,上面程序段的輸出分別為(1)、(2)、(3)〇解答:檢查條件語句與字符串輸出概念:AlphaBataGamma2.1.4執(zhí)行下面程序段后,m和k的值分別為(1)ヽ(2)〇intm,k;fbr(k=1,m=0;k<=50;k-H-){if(m>=10)break;if(m%2=0){m+=5;continue;)m-=3;解答:注意continue語句的使用初值m=0k=l第1次循環(huán)后m=5k=2第2次循環(huán)后m=2k=3第3次循環(huán)后m=7k=4第4次循環(huán)后m=4k=5第5次循環(huán)后m=9k=6第6次循環(huán)后m=6k=7第7次循環(huán)后m=llk=8第8次循環(huán)m=ll結(jié)束k=8,k++未做(1)11(2)8二.編程與綜合練習(xí)題2.2有一個函數(shù):編寫程序,輸入x,輸出y。解:#include<iostream>usingnamespacestd;intmain(){doublex,y;coutw”輸入x=";cin?x;if(x<l)y=x;elseif(x<10)y=2*x-l;elsey=3*x-l1;cout?,,y=,'?y?endl;return0;}23設(shè)計程序?qū)⑤斎氲陌俜种瞥煽冝D(zhuǎn)換為五分制輸出,90分以上為5分,80?89分為4分,70?79分為3分,6〇?69分為2分,60分以下為1分。解:10分ー檔用10進(jìn)行整除獲得,轉(zhuǎn)換用開關(guān)語句實行。#includc<iostream>usingnamespacestd;intmain(){intmark,result;//mark是百分制成績,result是5分制coutvぐ請輸入百分制成績:H?endl;cin?mark;iRmarkvO){eoutvv”缺考!”wendl;return0;)switch(mark/10){case9:case10:result=5;coutw”輸出五分制成績:M?result?endl;break;case8:result=4;coutw”輸出五分制成績:M?result?endl;break;case7:result=3;coutw”輸出五分制成績:“wresultwendl;break;case6:result=2;coutw”輸出五分制成績:M?result?endl;break;case5:case4:case3:case2:case1:case0:result=l;coutw”輸出五分制成績:w?result?endl;break;default:coutw”輸入錯誤!H?endl;return0;2.4編程計算個人所得稅。個人所得稅率表如下:月收入1200元起征,超過起征點500元以內(nèi)部分稅率5%,超過500元到2,000元部分稅率10%,超過2,000元到5,000元部分稅率15%,超過5,000元到20,000元部分稅率20%,超過20,000元到40,000元部分稅率25%,超過40,000元到60,000元部分稅率30%,超過60,000元到80,000元部分稅率35%,超過80,000元到100,000元部分稅率40%,超過100,000元部分稅率45況解:應(yīng)該從最高稅率段開始計算,分段疊加。先算兩萬元以上各段,每兩萬為ー檔,采用switch語句,注意沒有使用break語句。后面各低收入段,用if語句,也沒有使用else,這兩種方法是對應(yīng)的。第二要注意計算的入口處,收入減去該段的下限,進(jìn)行計算,以后各段都是完整的段,計算十分簡單。#include<iostream>usingnamespacestd;intmain(){doubleincome,tax=0;intk;coutw”請輸入個人月收入:“vvendl;cin?income;ifi(income<=1200){coutw”免征個人所得稅”wendl;return0;)elseincome-1200;if(income>20000){k=income/20000;switch(k){default:tax+=(income-100000)*0.45;income=l00000;case4:tax+=(income-80000)*0.40;income=80000;case3:tax+=(income?60000)*0.35;income=60000;case2:tax4-=(incomc-40000)*0.30;income=40000;case1:tax+=(income-20000)*0.25;income=20000;}}if(mcome>5000){tax+=(income-5000)*0.20;income=5000;)if(income>2000){tax+=(income-2000)*0.15;income=2000;}if(income>500){tax+=(income-500)*0.10;income=500;}tax+=incomc*0.05;coutw”應(yīng)征所得稅:M?tax?endl;return0;}2.5編程打印如下圖形:*********解:難點在三角形左邊的空格的控制,嵌套ー個循環(huán)語句完成此任務(wù)。#include<iostream>usingnamespacestd;intmain(){intij;for(i=l;i<=4;i-H-){for(j=4-i;j>0;j-)cout?Mッノ三角形每行前部的空格for(j=lj<=2*i-lj++)coutw"*”;cout?endl;)for(i=l;iv=3;i++)cout?M***\n”;return0;}編程輸出下列圖形,中間一行英文字母由輸入得到。ABBBCCCCCDDDDDDDCCCCCBBBA解:分上三角和ド三角兩部分分別處理左邊的空格。#include<iostream>usingnamespacestd;intmain(){charin;intij;do{coutvv”輸入一個字母:";cin?in;iR(in>=97)&&(in<=122))in-=32;〃小寫改大寫}while((in<65)||(in>90));intline=in」A';fbr(i=O;iv=line;i++){〃上三角for(j=line-i;j>OJ-)coutvぐ”;〃前方空格for(j=1;j<=2*i+1;j++)cout?f'?char(i+'AT);cout?endl;}fbr(i=line;i>0;i--){〃下三角(少ー?行)for(j=0;j<=line-i;j*H-)cout?ntf;for(j=1J<=2*i-1;j-H-)coutvv''vvchar(i-l+'A');cout?endl;}return0;}輸入n,求l!+2!+3!+…+n!解:通常求和作為外循環(huán),階乘作為內(nèi)循環(huán)。這里考慮到:n!=n*(n-1)!,利用遞推法運算速度大大提高,同時兩者可合并為ー個循環(huán)。本程序考慮了輸入的健壯性。#include<iostream>#include<cstdlib>usingnamespacestd;intmain(){intn,ijch=l;doubleresult=0;//result是結(jié)果coutw”請輸入正整數(shù)n:n?endl;cin?n;if(n<l){coutw”輸入錯誤!H?endl;return1;}result=l;for(i=2;i<=n;i++){jch*=i;//jch是i的階乘,注意n!=n*(n-l)!這樣可少ー層循環(huán)result+=jch;}cout?result?endl;return0;}猴子吃桃問題:猴子摘下若干個桃子,第一天吃了桃子的一半多一個,以后每天吃了前一天剩下的一半多一個,到第十天吃以前發(fā)現(xiàn)只剩下ー個桃子,問猴子共摘了幾個桃子。解:采用遞推法。從最后一天逆推到第一天,9次循環(huán)。#includc<iostream>usingnamespacestd;constintday=10;intmain(){inti,x=l;〃最后一天只有一個fbr(i=l;i〈day;i++)x=(x+l)*2;〃從一天前推至リ九天前coutw”開始共有桃子”《xvぐ個。\nM;return0;從鍵盤輸入ー組非0整數(shù),以輸入0標(biāo)志結(jié)束,求這組整數(shù)的平均值,并統(tǒng)計其中正數(shù)和負(fù)數(shù)的個數(shù)。解:將這組整數(shù)放在整型數(shù)組中,ー邊輸入ー邊求和及統(tǒng)計正數(shù)和負(fù)數(shù)的個數(shù),平均數(shù)由和除以整數(shù)數(shù)量取得。#includc<fstream>#include<iostream>usingnamespacestd;intmain(){intstem[256],sum=0,pnum=0,nnum=0,i=0;coutw”從鍵盤輸入ー組非〇整數(shù),以輸入〇標(biāo)志結(jié)束:“wendl;cin?stem[i];while(stem[i]!=0){sum+=stem[i];〃求ネロif(stem[i]>0)pnum++;〃正數(shù)數(shù)量elsennum++;〃負(fù)數(shù)數(shù)糧:i++;cin?stem[i];}if(!i)coutvv”〇個數(shù)"vvendl;else{coutw”平均值=”vv(double)sum/(pnum+nnum)v〈endl;〃平均值習(xí)慣不用整數(shù)coutw”正數(shù)個數(shù)="?pnum?endl;coutw”負(fù)數(shù)個數(shù)="?nnum?endl;}return0;}編程找出1?500之中滿足除以3余2,除以5余3,除以7余2的整數(shù)。解:中國古代數(shù)學(xué)問題(韓信點兵),采用窮舉法。注意三個條件同時成立用#include<iostream>usingnamespacestd;intmain(){inti;fbr(i=l;iv=500;i++)ifi((i%3=2)&&(i%5==3)&&(i%7=2))cout?i?endl;return0;)編程求1000之內(nèi)的所有完全數(shù)。所謂完全數(shù)指的是一個數(shù)恰好等于它的所有因子和。例如6=1+2+3,就是ー個完全數(shù)。解:采用窮舉法。兩重循環(huán),外層是從1到999依次處理,內(nèi)層是求該數(shù)的所有因子的和,并判斷是否等于該數(shù)。#includc<iostream>usingnamespacestd;intmain(){inti,a,sum_yz;//sumyz是a的因子和fbr(a=l;a<1000;a++){sum_yz=0;fbr(i=l;i<a;i+4-)if(a%i=0)sum_yz+=i;〃求因子運算未改變循環(huán)控制變量a的值,否則要用另ー個變量b來代替a來參加運算if(a=sum_yz)cout?a?endl;}return0;)將100元換成用10元、5元和1元的組合,共有多少種組合方法。解:采用窮舉法??紤]10元最多10張,5元最多20張,余下是1元。#includc<iostream>usingnamespacestd;intmain(){inti,j,k,count=0;fbr(i=0;iv=10;iH)〃i是10元張數(shù),j是5元張數(shù),k是1元張數(shù)fbr(j=0j<=20j-H-){k=100-10*i-5*j;ifi[k>=0){cout?i?^'<<j<^f?k?endl;count++;})cout?count?endl;return0;}利用反正切展開計算兀的近似值,要求誤差I(lǐng)Oー、,公式如ド:令x=l,可計算出兀/4的近似值。解:采用遞推法。初看每一項的遞推通式不易寫出,但每ー項全看作奇數(shù)項,而偶數(shù)項全為零,則很容易寫出:第1項為X,第3項為第1項乘以X的平方除以項序號3乘以.1,其余類推。同時和的誤差小于最后ー項的絕對值。#include<iostrcam>#include<cmath>usingnamespacestd;constdoublee=le-5;intmain(){doublex,a,sum;inti=3;coutvv”請輸入正切值:M?endl;cin?x;sum=x;do{a*=x*x*(-l);sum+=a/i;i+=2;}while(fabs(a/i)>e);cout?Harctg(,,?x?,,)=,,?sum?endl;return0;用迭代法求方程ス2+10??*=0的根,誤差限為10凡迭代公式如下:解:迭代法也是用循環(huán)語句實現(xiàn),數(shù)學(xué)上迭代法可能收斂,也可能發(fā)散,解答中加了最大迭代次數(shù)的限制。#include<iostream>#include<cmath>usingnamespacestd;constdoublee=le-5;intmain(){doublex0,xl;intn=0;coutw”輸入初始近似值:"wendl;cin?x1;do{x0=x1;xl=(x0*x0-l0*(x0*sin(x0)+cos(x0)))/(2*x0-l0*sin(x0));〃x0是上次算出的結(jié)果,xl用作保存新算出的結(jié)果n++;}while((fabs(xl-xO)>e)&&(n<=le5));if(n>le5)cout?”超出迭代!e5次\n”;elsecout?”方程x*x+10*cos(x)=0的ー個根為:“vvxlwendl;coutvv”方程誤差為:M?xl*xl+l0*cos(xl)?endl;return0;)兩隊選手每隊5人進(jìn)行ー對ー的比賽,甲隊為A、B、C、D、E,乙隊為J、K、L、M、N,經(jīng)過抽簽決定比賽配對名單。規(guī)定A不和J比賽,M不和D及E比賽。列出所有可能的比賽名單。解:這是ー個組合問題,使用窮舉法。共有5個位置,設(shè)甲隊5名隊員位置不變,乙隊改變隊員位置,進(jìn)行配對。注意第1個位置可在5個隊員中任選?個,以后的位置必須扣除已選過的隊員。并扣除不能配對的情況,即得所有可能的比賽名單。#includc<iostream>usingnamespacestd;intmain(){charstl[5]={'A?B?C?D',E},st2[5]={'J',K,'L?MVN'};inti=0j,k,l,m,n;命r(j=0;jv5;j++){//0號位i埒=0)continue;//A選手不與選手J比賽,即stl⑼不與st2[〇]比賽fbr(k=0;k<5;k-H-){//1號位if(k=j)continue;//剔除乙隊占據(jù)〇號位的選手fbr(l=0;K5;l++){//2號位ifi(l=jM==k)continue;〃易リ除乙隊占據(jù)〇、1號位的選手fbr(m=0;m<5;m++){//3號位ifitmujllmnukllmul)continue;〃剔除乙隊占據(jù)〇、1、2號位的選手iRm=3)continue;〃stl[3]不與st2[3]比賽,即D不與M比賽fbr(n=0;n<5;n-H-){〃4號位ifi[n=j||n=k||n==l||n=m)continue;〃剔除乙隊占據(jù)。、1、2、3號位的選手ifi(n=3)continue;〃stl[4]不ワst2[3]比賽,即E不與M比賽cout?st1[0]?,-,?st2[j]?,\t,?st1[1]?,-,<<st2[k]?,\t,;coutwst1[2]vv’,vvst2ロ]vv't'vvstlDlvvUvvstZImlvvr’;cout?stl[4]?,-,?st2[n]?endl;i++;cout?i?endl;return0;編程模擬選舉過程。假定四位候選人:zhang>wang>li>zhao?代號分別為1、2、3、4。選舉人直接鍵入候選人代號,1?4之外的整數(shù)視為棄權(quán)票,」為終止標(biāo)志。打印各位候選人的得票以及當(dāng)選者(得票數(shù)超過選票總數(shù)一半)名單。解:用5個元素的整型數(shù)組,分別放棄權(quán)票和各候選人的得票,然后用開關(guān)語句打印。#inc1udc<iostream>#include<iomanip>usingnamespacestd;intmain(){enumcandidate{feipiao,zhang,wang,li,zhao}cand;intvote[5]={0},i,k=0,n;cin?n;while(n!=-l){k++;if(n>=l&&n<=4)vote[n]-l-+;elsevote[0]-H-;cin?n;fbr(i=0;i<5;i-H-){cand=(candidate)i;switch(cand){casefeipiao:cout?setw(10)?Mfeipiao"?V?vote[cand]<<endl;break;casezhang:cout?setw(10)<<nzhang,,?l\t,?vote[cand];ifi(vote[cand]>k/2)cout?H當(dāng)選"vvendl;elsecout?endl;break;casewang:cout?setw(10)?Mwang'*?,\t,?vote[cand];if(vote[cand]>k/2)cout?M當(dāng)選"vvendl;elsecout?endl;break;caseli:cout?setw(l0)<<,,li,,?,\t'?vote[cand];if(vote[cand]>k/2)cout?M當(dāng)選”《endl;elsecout?endl;break;casezhao:cout?setw(10)<<MzhaoH?,\t,?vote[cand];if(vote[cand]>k/2)cout?M當(dāng)選”《endl;elsecout?endl;break;return0;2.17改造【例2.14】,將運行結(jié)果(Fibonacii數(shù)歹リ的前20項)存入文件。解:采用3步法。所謂3步法,是將書上的第1和第2步合并,格式如下:首先建立或打開ー個輸出文件,并與磁盤文件聯(lián)系:ofstreamofile(z,myfile2_17.txt");再按一定格式存入數(shù)據(jù):ofileく〈setw(15)く<fibO<Xsetw(15)<<fibl;等然后關(guān)閉文件:ofile.close();如要讀出數(shù)據(jù),則用輸入文件打開,并與同一磁盤文件聯(lián)系:ifstreamifile("myfile2_17.txピ’);再按同一格式讀入數(shù)據(jù):等,并輸出最后關(guān)閉文件:file.closeO;#include<fstream>#includc<iostream>#include<iomanip>usingnamespacestd;constintm=20;intmain(){intfib0=0,fibl=l,fib2,ij,k,l,n;charch;ofstreamofile(Mmyfile2_17.txtM);ofile?setw(l5)?fib0?setw(l5)?fib1;fbr(n=3;n〈=m;n++){fib2=fibO+fibl;ofile?setw(l5)?fib2;iRn%5=0)ofile?endl; 〃控制每行5個數(shù)據(jù)fib0=fibl;fibl=fib2;}ofile.close();coutvv”是否要將文件輸出?Y或NH?endl;cin?ch;ifi(ch=y||ch=,Y,){ifstreamifile("myfile2_l7.txt");while(l){ifile>>i?j>>k?l?n;〃由文件讀入if(ifile.eofO!=0)break;cout?setw(15)?i?setw(l5)?j?setw(15)?k?setw(15)?l?setw(15)?n?endl;//S^<)ifile.close();return0;2.18改造【例2.19】,將運行結(jié)果(100以內(nèi)素數(shù))存入文件。解:采用4步法。首先定義ー個輸出文件:ofstreamofile;再打開該文件并與并與磁盤文件聯(lián)系:ofile.open("myfile218.txt*):按一定格式把數(shù)據(jù)存入文件。最后關(guān)閉文件。效果與3步法相同。讀文件同樣可用3步法或4步法。#include<fstrcam>#include<iostream>#includc<iomanip>#include<cmath>usingnamespacestd;constintn=100;intmain(){inta[n],ij;charch,b[256];ofstreamofile;ifstreamifile;fbr(i=0;i<n;i++)a[i]=l+i; 〃用數(shù)組保存整數(shù)皿00a[0]=0; 〃1不是素數(shù),置〇fbr(i=0;i<n;i-H-){ifi(a[i]=0)continue; 〃該數(shù)已經(jīng)置〇,判斷下一個數(shù)for(j=i+l;j<nu++)if(a[j]%a[i]=O)a[j]=O; 〃是a[i]倍數(shù)的元素置〇;}ofile.open(Mmyfile2_l8.txtM);intcount=0;ofilevv”l』vvnvv”之間的素數(shù):M?endl;fbr(i=O;i<n;i++) 〃輸出所有素數(shù)if(a[i]!=O){ofile?setw(6)?a[i];count-H-;ifl(count%10=0)ofile?endl; 〃每行10個數(shù)據(jù)}ofile.close();coutw”是否要將文件輸出?Y或N”《endl;cin?ch;if(ch=,y,||ch=,Y'){ifile.open("myfile2_l8.txtH);i=0;while(ifile.get(b[i])){〃不可用》,它不能讀白字符,iRb[i]==*\n')break;i++;}b[i]Wcout?b?endl;count=0;
while(l){〃由文件讀入coutv〈setw(6)vvi;〃屏幕顯示count-H-;ififcount%10==0)cout?endl; 〃每行10個數(shù)if(ifHe.eof()!=0)break;〃最后?個數(shù)據(jù)后面可能沒有回車,H接為文件結(jié)束}ifile.close();cout?endl;|return0;2.19改造【例2.13】,文本由文本文件輸入。解:文本文件讀入要用成員函數(shù):ifile.get。,而不可用插入運算符vv,否則會丟失空白字符。#includc<fstream>#include<iostream>usingnamespacestd;intmain(){charch;intnline=0,nword=0,nch=0;intisword=0;ifstreamifile(nep2_19.cppH);coutw”讀入ep2_19.cppH?endl;do{ch=ifile.get();if(ch==*\n')nline++; //遇換行符行數(shù)+1if(ch!=,,&&ch!=V&&ch!=^,&&ch!=EOF){〃讀到非間隔符ift!isword)n\vord++; 〃在單詞的起始處給單詞數(shù)+1nch++; //字符數(shù)加+1isword=l;〃讀到問〃讀到文本結(jié)束符為止else〃讀到問〃讀到文本結(jié)束符為止隔符}whilc(ch!=EOF);ifile.close();coutw”行數(shù):n?nline?endl;coutw”單詞數(shù):M?nword?endl;coutw”字符數(shù):M?nch?endl;return0;當(dāng)前位置:學(xué)習(xí)資源下載〉課后習(xí)題答案第三章函數(shù)習(xí)題一.基本概念與基礎(chǔ)知識自測題填空題被定義為形參的是在函數(shù)中起」!丄作用的變量,形參只能用(2)表示。實參的作用是G),實參可以用上、3、 (6)表示。答案:(1)自變量¢2)變量名(3)將實際參數(shù)的值傳遞給形參(4)具有值的變量(5)常量(6)表達(dá)式局部域包括⑴、⑵和¢3)〇使用局部變量的意義在于¢4).答案:(1)塊域(2)函數(shù)域(3)函數(shù)原型域(4)局部變量具有局部作用域使得程序在不同塊中可以使用同名變量靜態(tài)局部變量存儲在⑴區(qū),在(2)時候建立,生存期為(3),如定義時未顯式初始化,則其初值為(4)。答案:(1)全局?jǐn)?shù)據(jù)區(qū)(2)編譯(3)全局生存期(4)全。局部變量存儲在⑴區(qū),在(2)時候建立,生存期為(3),如定義時未顯式初始化,則其初值為⑷。答案:(1)棧(2)在函數(shù)或塊開始執(zhí)行時(3)函數(shù)或塊的執(zhí)行期(4)隨機(jī)值編譯預(yù)處理的作用是m,預(yù)處理指令的標(biāo)志是(2)?多文件系統(tǒng)中,程序由(3)來管理,用戶自定義頭文件中通常定義ー些(4)。答案:(1)將源程序文件進(jìn)行處理,生成一個中間文件,編譯系統(tǒng)對此中間文件進(jìn)行編譯并生成目標(biāo)代碼#(3)工程文件(4)用戶構(gòu)造的數(shù)據(jù)類型(如枚舉類型),外部變量,外部函數(shù)、常量和內(nèi)聯(lián)函數(shù)等具有一定通用性或常用的量設(shè)有函數(shù)說明如下:intfifintx,inty){returnx%y+l;}假定a=10,b=4,c=5,下列語句的執(zhí)行結(jié)果分別是⑴和(2)。cout?f(a,b)4-f{a,c);(2)cout?f(f(a+c,b),f(b,c));解答:(1)a:f(a,b)返回值b:f(a,c)返回值f(a,b)域:Ra,c)域:10returnx%y+l;y:10returnx%y+1;main。域10答案:4
(2)b:y:a:10f(a+c,b)域:f(b,c)域:154returnx%y+1;45returnx%y+l;f(f(a+c,b),f(b,c))域:returnx%y+l;f(f(a+c,b),f(b,c))返回值:5main。域答案:53.1.7下列程序的輸出結(jié)果分別為(い和(2)。#include<iostream>usingnamespacestd;inta,b;voidf(intj){staticinti=a;//注意靜態(tài)局部變量intm,n;m=iゼ;i-H-;j++;n=i*j;a-H-;cout?Mi=,,?i?,\f?,,j="<<j?,\t,;cout?,,m=,,?m?^,?"n-,?n?endl;)intmain(){a=l;b=2;f(b);f(a);coutvぐa="vva?へt'vv"b="vvbvvendl;return0;)解:m:m:f(a)返回值f(b)返回值45f(b)域:I:13全局域:f(a)域:main()域i+j=l+2=3i*j=2*3=6囪4靜態(tài)f()域:i+j=2+2=4i*j=3*3=98j4答案:i=2j=3m=3n=6 (對應(yīng)藍(lán)色)i=3j=3m=4n=9 (對應(yīng)綠色)a=3b=2#include<iostream>usingnamespacestd;floatsqr(floata){returna*a;}floatp(floatx,intn){cout?,,in-process:,,?nx=t,?x?,\f?Mn="?n?endl;if(n=0)return1;elseif(n%2!=0)returnx*sqr(p(x,n/2));elsereturnsqr(p(x,n/2));}intmain(){cout?p(2.0,l3)?endl;return0;}圖解遞歸,共五層,返回值是回歸時產(chǎn)生:sqr(p(x,n/2)x*sqr(p(x,n/2)p(2.0,3)P(2.0,6)x*sqr(p(x,n/2)x*sqr(p(x,n/2)132.0P(2.0,13)6481922.02.02.0X2.0p(2.0,0)=11main()域:第1層p0域:第2層p()域:第3層pO域:第4層p()域:第5層p()域:P(2.0J)答案:in-process:x=2n=13in-process:x=2n=6in-process:x=2n=3in-process:x=2n=lin-process:x=2n=08192簡答題函數(shù)的實參和形參怎樣對應(yīng)?實參和形參數(shù)目必須一致嗎?什么情況下可以不同?答:實參和形參的個數(shù)和排列順序應(yīng)ーー對應(yīng),并且對應(yīng)參數(shù)應(yīng)類型匹配(賦值兼容),當(dāng)有缺省參數(shù)時可以不同。函數(shù)和內(nèi)聯(lián)函數(shù)的執(zhí)行機(jī)制有何不同?定義內(nèi)聯(lián)函數(shù)有何意義?又有何要求?答:內(nèi)聯(lián)函數(shù)的調(diào)用機(jī)制與一般函數(shù)不同,編譯器在編譯過程中遇到inline時,為該函數(shù)建立一段代碼,而后在每次調(diào)用時直接將該段代碼嵌入到調(diào)用函數(shù)中,從而將函數(shù)調(diào)用方式變?yōu)轫樞驁?zhí)行方式,這ー過程稱為內(nèi)聯(lián)函數(shù)的擴(kuò)展或內(nèi)聯(lián)。內(nèi)聯(lián)函數(shù)的實質(zhì)是犧牲空間來換取時間。因inline指示符對編譯器而言只是一個建議,編譯器也可以選擇忽略該建議,內(nèi)聯(lián)函數(shù)只適用于功能簡單,代碼短小而又被重復(fù)使用的函數(shù)。函數(shù)體中包含復(fù)雜結(jié)構(gòu)控制語句,如switch、復(fù)雜if嵌套、while語句等,以及無法內(nèi)聯(lián)展開的遞歸函數(shù),都不能定義為內(nèi)聯(lián)函數(shù),即使定義,系統(tǒng)也將作為一般函數(shù)處理。全局變量和全局靜態(tài)變量的區(qū)別在哪里?為什么提倡盡量使用局部變量?答:有static修飾的全局變量只能在定義它的文件中可見,在其他文件中不可見,而非靜態(tài)的全局變量則可以被其他程序文件訪問,但使用前必須用extern說明。局部變量具有局部作用域使得程序在不同塊中可以使用同名變量。這些同名變量各自在自己的作用域中可見,在其它地方不可見。所以提倡盡量使用局部變量函數(shù)重載的作用是什么?滿足什么條件的函數(shù)オ可以成為重載函數(shù)?重載函數(shù)在調(diào)用時是怎樣進(jìn)行対應(yīng)的?答:函數(shù)重載可以定義幾個功能相似,而參數(shù)類型不同使用相同的函數(shù)名的函數(shù),以適應(yīng)不同情況下自動選用不同函數(shù)進(jìn)行操作。函數(shù)重載的好處在于,可以用相同的函數(shù)名來定義ー組功能相同或類似的函數(shù),程序的可讀性增強(qiáng)。在定義重載函數(shù)時必須保證參數(shù)類型不同,僅僅返回值類型不同是不行的。當(dāng)某個函數(shù)中調(diào)用到重載函數(shù)時,編譯器會根據(jù)實參的類型去對應(yīng)地調(diào)用相應(yīng)的函數(shù)。匹配過程按如下步驟進(jìn)行:(1)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù);(2)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù);(3)通過用戶定義的轉(zhuǎn)換尋求匹配。多文件結(jié)構(gòu)的程序是如何進(jìn)行管理并運行的?采用多文件結(jié)構(gòu)有什么好處?答:多文件結(jié)構(gòu)通過工程進(jìn)行管理,在工程中建立若干用戶定義的頭文件.h和源程序文件.cpp。頭文件中定義用戶自定義的數(shù)據(jù)類型,所有的程序?qū)崿F(xiàn)則放在不同的源程序文件中。編譯時每個源程序文件單獨編譯,如果源程序文件中有編譯預(yù)處理指令,則首先經(jīng)過編譯預(yù)處理生成臨時文件存放在內(nèi)存,之后對臨時文件進(jìn)行編譯生成目標(biāo)文件.。bj,編譯后臨時文件撤銷。所有的目標(biāo)文件經(jīng)連接器連接最終生成一個完整的可執(zhí)行文件.exe。多文件結(jié)構(gòu)管理程序的好處是十分明顯的。首先,可以避免重:復(fù)性的編譯,如果修改了個別函數(shù),那么只需將這些函數(shù)所在的文件重新編譯即可;其次,將程序進(jìn)行合理的功能劃分后,更容易設(shè)計、調(diào)試和維護(hù):另外,通常把相關(guān)函數(shù)放在ー個文件中,這樣形成一系列按照功能分類的文件,便于為其他程序文件使用。宏定義與常量定義從作用及效果上看是ー樣的,二者是否完全相同?答:完全不同。不帶參宏定義與const說明符定義常量從效果上看是一樣的,但它們的機(jī)制不同。首先宏定義是在預(yù)處理階段完成,而const定義則是在編譯階段實現(xiàn)。其次宏定義只是一種簡單的字符串替代,不會為字符串分配內(nèi)存単元,替代過程也不作語法檢查,即使指令中的常量字符串不符合常量要求,預(yù)處理的替代過程也照樣按指令給出的格式進(jìn)行。而const定義則是象定義一個變量一樣定義ー個常量標(biāo)識符,系統(tǒng)要按照類型要求為該標(biāo)識符分配內(nèi)存單元,同時在將常量放入單元時進(jìn)行類型檢查,如果類型不匹配,類型相容的會進(jìn)行系統(tǒng)的類型轉(zhuǎn)換,不相容的則耍提示錯誤。二.編程與綜合練習(xí)題設(shè)計函數(shù),將小寫英文字符變?yōu)閷?yīng)的大寫字符。解:小寫字母比大寫字母ASCII碼值大32,或?qū)懽鱟h=ch」a,+,A<#include<iostream>usingnamespacestd;charcapitalize(charch){if(ch>=*a,&&ch<-z*)returnch」a'+'A';elsereturnch;}intmain(){inti=0;charcp[30];coutw”請輸入包含小寫字母的句子:M?endl;cin.getline(cp,30);while(cp[i]!=^')cout?capitalize(cp[i-H-]);cout?endl;return0;)設(shè)計兩個函數(shù),分別求兩個數(shù)的最大公約數(shù)和最小公倍數(shù)。解:可用窮舉法求最大公約數(shù)(從大到小找到的第1個公約數(shù))和最小公倍數(shù)(從小到大找到的第1個公倍數(shù))。#include<iostream>usingnamespacestd;MaxCommonDevisor(intn,intm){inti;fbr(i=n;i>=l;i-)if(n%i=0&&m%i==0)break;returni;*MinCommonMultiple(intn,intm){inti;fbr(i=n;i<=n*m;i++)ifi(i%n=O&&i%m==O)break;returni;)intmain(){intij;eoutw”請輸入兩個整數(shù):“vvendl;cin?i>>j;eoutw”最大公約數(shù):,,?MaxCommonDevisor(ij)最小公倍數(shù):M?MinCommonMultiple(ij)?endl;return0;}設(shè)計函數(shù)digit(num,k),返回整數(shù)num從右邊開始的第k位數(shù)字的值。例如:digit(4647,3)=6digit(23523,7)=0解:把整數(shù)轉(zhuǎn)換為數(shù)串,放在ー個整型數(shù)組中。#includc<iostream>usingnamespacestd;digit(intnum,intk){ints[10]={0,0,0,0,0,0,0,0,0,0};inti=0;do{〃先把整數(shù)轉(zhuǎn)換為數(shù)字申s[i]=num%10;num/=10;i++;}while(num>0);if(k<=i)returns[k-l];〃題H中位數(shù)的下標(biāo)從1開始,而數(shù)組下標(biāo)從〇開始elsereturn0;)intmain(){cout?,,digit(4647,3)=,,<<digit(4647,3)?endl;cout?,'digit(23523,7)=,,?digit(23523,7)?endl;return0;}設(shè)計函數(shù)factors(num,k),返回整數(shù)num中包含因子k的個數(shù),如果沒有該因子,則返回〇〇解:必須先判斷整數(shù)m能否被k整除。#include<iostream>usingnamespacestd;factors(intnum,intk){〃缺省返冋值為整型intcount=0;while(num%k=0){count++;num/=k;}returncount;}intmain(){cout?nfactors(1875,5)=**?factors(1875,5)?endl;cout?,,factors(64,3)=M<<factors(64,3)<<endl;return0;}歌德巴赫猜想指出:任何ー個充分大的偶數(shù)都可以表示為兩個素數(shù)之和。例如:4=2+2 6=3+38=3+5 50=3+47將4?50之間的所有偶數(shù)用兩個素數(shù)之和表示。判斷ー個整數(shù)是否為素數(shù)用函數(shù)完成。解:用prime。函數(shù)判斷是否素數(shù),用窮舉法。歌德巴赫猜想驗證也用窮舉法,在所有組合中找兩個數(shù)均為素數(shù)者。#include<iostream>#includc<cmath>usingnamespacestd;boolprime(intm){if(m=l||m==0)returnfalse;iRm=2)returntrue;intk=(int)sqrt(m);fbr(inti=2;iv=k;i++)〃窮舉法if(m%i=0)break;if(i>k)returntrue;elsereturnfalse;}intmain(){fbr(intn=4;n<=50;n+=2){fbr(inti=2;i<=n/2;i++)iRprime⑴&&prime(n-i))coutvvnw~vvivv屮vvn?iv〈endl;〃列出所有可能組合return0;}設(shè)計函數(shù)打印直方圖,直方圖寬度為3行,每列代表數(shù)據(jù)1%。如下面的圖形表示10%。I**********解:為簡單將a%用a表示。#include<iostream>usingnamespacestd;voidPrintDiagram(intm){inti;cout?,I??endl;for(i=0;i<3;i++){cout?,I*;for(intj=0;j<m;j++)coutくぐ*';cout?endl;)cout<<>I'<<endl;}intmain(){PrintDiagram(lO);PrintDiagram(15);PrintDiagram(7);return0;定義遞歸函數(shù)實現(xiàn)下列Ackman函數(shù):其中m、n為正整數(shù)。設(shè)計程序求Acm(2,l),Acm(3,2)o解:遞歸函數(shù)實現(xiàn)非常簡單,按公式寫即可。#include<iostream>usingnamespacestd;Acm(intm,intn){if(m=0)returnn+1;ifi(n=O)returnAcm(m-l,l);returnAcm(m-1,Acm(m,n-1));)intmain(){cout?HAcm(2,1)=,,?Acm(2,1)?endl;cout?,'Acm(3,2)=',?Acm(3,2)?endl;return0;用遞歸函數(shù)實現(xiàn)勒讓德多項式:在主函數(shù)中求P4(L5)。解:把勒讓徳多項式的階和自變量都作為參數(shù)。#include<iostream>usingnamespacestd;doubleP(intn,doublex){if(n=O)returnI;if(n=l)returnx;return((2*n-1)*x*P(n-1,x)-(n-1)*P(n-2,x))/n;}intmain(){cout?nP(4,1.5)="?P(4,1.5)?endl;return0;}定義內(nèi)聯(lián)函數(shù)實現(xiàn)求三個實數(shù)中的最大值。解:內(nèi)聯(lián)函數(shù)只適用于功能簡單,代碼短小而又被重復(fù)使用的函數(shù)。函數(shù)體中包含復(fù)雜結(jié)構(gòu)控制語句,如switch、復(fù)雜if嵌套、while語句等,以及無法內(nèi)聯(lián)展開的遞歸函數(shù),都不能定義為內(nèi)聯(lián)函數(shù),即使定義,系統(tǒng)也將作為一般函數(shù)處理。#include<iostream>usingnamespacestd;inlinemax(inta,intb,intc){if{a>b&&a>c)returna;if(b>a&&b>c)returnb;returnc;}intmain(){cout?max(3,7,4)?endl;return0;}定義內(nèi)聯(lián)函數(shù),判斷ー個字符是否為數(shù)字字符。解:數(shù)字字符ASCII碼值是連在ー起的,可用ch〉='0'&&chく='9’來判斷。#include<iostream>usingnamespacestd;inlineboolIfDigitChar(charch){if(ch>='0,&&ch<=,9,)return1;elsereturn0;)intmain(){charch;coutvぐ請輸入一個字符(輸入“!”停止)”vvendl;cin?ch;while(ch!=,!,){if(IfDigitChar(ch))cout?ch?nisadigitcharM?endl;elsecout?ch?Misnotadigitchar"?endl;coutw”請輸入ー個字符(輸入“!”停止)"wendl;cin?ch;return0;設(shè)計兩個重載函數(shù),分別求兩個整數(shù)相除的余數(shù)和兩個實數(shù)相除的余數(shù)。兩個實數(shù)求余定義為實數(shù)四舍五入取整后相除的余數(shù)。解:實數(shù)四舍五入取整,正數(shù)是+0.5取整,負(fù)數(shù)是ー0.5取整。#include<iostream>#includc<cmath>usingnamespacestd;mod(intn,intm){returnn%m;}round(doublex){ 〃四舍五入函數(shù)if(x>=0)returnint(x+0.5);elsereturnint(x-0.5);}mod(doublex,doubley){returnround(x)%round(y);}intmain(){cout?,,mod(8,3)=,,<<mod(8,3)<<endl;cout?Hmod(8.2,3.6)="?mod(8.2,3.6)?endl;cout?Mmod(-8.2,-2.6)=w?mod(-8.2,-2.6)?endl;return0;}注意:mod(doublex,doubley)形參類型不可以寫成float,因為在入口函數(shù)中mod(8.2,3.6)的實參8.2、3.6都認(rèn)為是double型常數(shù),重載時系統(tǒng)不知應(yīng)轉(zhuǎn)換為float還是int,出現(xiàn)歧義。建立一個頭文件area.h,在其中定義兩個面積函數(shù)area。,分別用來計算半徑為r的圓的面積和邊長為a和b的矩形面積。另外建立一個實現(xiàn)文件area.cpp,在其中定義主函數(shù)。通過包含area.h,輸入數(shù)據(jù)并輸出圓和矩形的面積。解:兩個面積函數(shù)area。,一-個是單參數(shù),?個是雙參數(shù)。〃頭文件area.hdoublearea(doubler){return3.14*r*r;}doublearea(doublea,doubleb){returna*b;}〃實現(xiàn)文件area.cpp#include<iostream>usingnamespacestd;#include”area.h"intmain(){doublea,b,r;cout?Minputradius:H?endl;cin?r;cout?Hinputsidelength:M?endI;cin?a?b;cout?Marea("?r<<w)=M?area(r)?endl;cout?Harea("?a?7?b?n)=M?area(a,b)?endl;return0;)注意:例題源代碼中,為了使文件命名方式一致,采用Exp3_14.h和Exp3_14.cpp來命名。下面遞歸函數(shù)執(zhí)行結(jié)果是什么?voidpl(intw){inti;if(w>0){fbr(i=0;i<w;i-H-)cout?,\t,?w;cout?endl;pl(W-l);調(diào)用pl(4)o答:用調(diào)用樹來解答,如ド圖,注意打印是在遞歸調(diào)用之前:按照打印語句:fbr(i=0;i<w;i++)cout?,\t,?w;cout?endl;可得輸出為:4 4 4 4〃第1次W=43 3 3 〃第2次W=32 2 〃第3次W=21 〃第4次W=1voidp2(intw){inti;if(w>0){p2(w-l);fbr(i=0;i<w;i++)cout?,\t,?w;cout?endl;p2(w-l);調(diào)用p2(4)o答:用調(diào)用樹來解答,如下圖,注意打印是在兩次遞歸調(diào)用之間:
按照次序和打印語句,可得輸出為:①1②③④⑤⑥⑦⑧⑨⑩TOC\o"1-5"\h\z2 2②③④⑤⑥⑦⑧⑨⑩13 3 3214 4 4 421? 3 3 3104) 2 21voidp3(intw){inti;if(w>0){fbr(i=O;i<w;i-H-)cout?,\t,?w;cout?endl;p3(w-l);p3(w-2);)}調(diào)用p3(4)o答:用調(diào)用樹來解答,如下圖,注意打印是在兩次遞歸調(diào)用之前:按照次序和打印語句,可得輸出為:TOC\o"1-5"\h\z4 4 4 43 3 32 2116) 2 21voidp4(intw){inti;if(w>0){fbr(i=O;i<w;i-H-)cout?,\t,?w;cout?endl;p4(w-l);fbr(i=O;i<w;i-H-)cout?,\t,?w;cout?endl;調(diào)用p4(4)o答:如下圖用調(diào)用樹解答,注意打印是在遞歸調(diào)用之前和之后各一次:按照次序和打印語句,可得輸出為:TOC\o"1-5"\h\z4 4 4 43 3 32 211@223 3 34 4 4 4當(dāng)前位置:學(xué)習(xí)資源下載》課后習(xí)題答案第四章類與對象習(xí)題一.基本概念與基礎(chǔ)知識自測題填空題引入類定義的關(guān)鍵字是 (1)。類的成員函數(shù)通常指定為 (2),類的數(shù)據(jù)成員通常指定為 (3)。指定為(4)的類成員可以在類對象所在域中的任何位置訪問它們。通常用類的(5) 成員表示類的屬性,用類的(6)成員表示類的操作。答案:class公有的public私有的private公有的public數(shù)據(jù)函數(shù)類的訪問限定符包括 (1)ヽ⑵和⑶ 。私有數(shù)據(jù)通常由衛(wèi)ー函數(shù)來訪問(讀和寫)。這些函數(shù)統(tǒng)稱為 (5) 0答案:public(公有的)private(私有的)protected(保護(hù)的)公有的成員函數(shù)類的接口通常在邏輯上,同一類的每個對象都有 (1) 代碼區(qū),用以存儲成員函數(shù)。而在物理上通常只有 (2)代碼區(qū)。只有在 (3)定義,并(4)的函數(shù)和加了關(guān)鍵字 (5) 的函數(shù)例外。答案:獨立的共用的在類說明中不包括循環(huán)等復(fù)雜結(jié)構(gòu)inlineC++中支持三種域: ⑴ヽ⑵ヽ(3) ?函數(shù)域被包括在 (4)中,全局域被包括在中。using指示符以關(guān)鍵字using開頭,后面是關(guān)鍵字(6),最后是(7)。這樣表示以后在該名字空間中所有成員都一^如不使用using指示符則在使用時要加::,稱為(9)運算符。答案:局部域(localscope)名字空間域(namespacescope)類域(classscope)局部域名字空間域namespace名字空間名可以直接被使用域引用通常用作函數(shù)的(1)和(2)。對數(shù)組只能引用(3)不能引用(4)。答案:參數(shù)返回值數(shù)組元素數(shù)組名本身4.1.6構(gòu)造函數(shù)的任務(wù)是 (1)。構(gòu)造函數(shù)無 (2)〇類中可以有 (3) 個構(gòu)造函數(shù),它們由 (4)區(qū)分。如果類說明中沒有給出構(gòu)造函數(shù),則C++編譯器會(5)〇拷貝構(gòu)造函數(shù)的參數(shù)是 (6),當(dāng)程序沒有給出復(fù)制構(gòu)造函數(shù)時,系統(tǒng)會自動提供(7)支持,這樣的豆制構(gòu)造函數(shù)中每個類成員 (8)。答案:初始化數(shù)據(jù)成員函數(shù)返回類型說明多不同的參數(shù)表自動給出ー個默認(rèn)的構(gòu)造函數(shù)同一類對象的引用默認(rèn)的的復(fù)制構(gòu)造函,稱為默認(rèn)的按成員語義支持。被依次復(fù)制4.1.7ー個類有 (1)個析構(gòu)函數(shù)。 ⑵時,系統(tǒng)會自動調(diào)用析構(gòu)函數(shù)。答案:—對象注銷時4.1.8運算符重載時,其函數(shù)名由 (1)構(gòu)成。成員函數(shù)重載雙目運算符時,左操作數(shù)是⑵,右操作數(shù)是 (3)。答案:關(guān)鍵字。perator和該運算符對象該函數(shù)的參數(shù)4.1.9面向過程的程序設(shè)計中程序模型描述為山,面向?qū)ο蟪绦蛟O(shè)計的程序模型可描述為⑵。答案:(1)”程序=算法+數(shù)據(jù)結(jié)構(gòu)”。其數(shù)據(jù)與數(shù)據(jù)處理是分離的。(2)程序=(對象+對象+……+對象)+消息;對象=(算法+數(shù)據(jù)結(jié)構(gòu))。面向?qū)ο笤O(shè)計將數(shù)據(jù)和對數(shù)據(jù)的操作方法放在一起,形成一個相對獨立的整體——對象(Object),并通過簡單的接口與外部聯(lián)系。對象之間通過消息(Message)進(jìn)行通訊。簡答題簡単解釋什么是面向?qū)ο蟪绦蛟O(shè)計的封裝性。答:對象是ー個封裝體,在其中封裝了該對象所具有的屬性和操作。對象作為獨立的基本單元,實現(xiàn)了將數(shù)據(jù)和數(shù)據(jù)處理相結(jié)合的思想。此外,封裝特性還體現(xiàn)在可以限制對象中數(shù)據(jù)和操作的訪問權(quán)限,從而將屬性“隱藏”在對象內(nèi)部,對外只呈現(xiàn)一定的外部特性和功能。封裝性增加了對象的獨立性,C++通過建立數(shù)據(jù)類型——類,來支持封裝和數(shù)據(jù)隱藏。ー個定義完好的類一旦建立,就可看成完全的封裝體,作為ー個整體單元使用,用戶不需要知道這個類是如何工作的,而只需要知道如何使用就行。另ー方面,封裝增加了數(shù)據(jù)的可靠性,保護(hù)類中的數(shù)據(jù)不被類以外的程序隨意使用。這兩個優(yōu)點十分有利于程序的調(diào)試和維護(hù)。C++編譯器怎樣對標(biāo)識符進(jìn)行解析?答:編譯器對標(biāo)識符的解析分兩步,第一步查找在聲明中用到的標(biāo)識符,特別是函數(shù)成員聲明中用到的參數(shù)類型,第二步是函數(shù)成員體內(nèi)的標(biāo)識符。為什么說類與對象的概念是客觀世界的反映?答:客觀世界的事物都具有某些屬性和行為(或操作),具有相同屬性和行為的事物可以歸屬于一類,用分類的方法可以提高認(rèn)識事物的效率。C++中定義的類則是通過抽象的方法將某ー類事物共有的靜態(tài)特征(屬性)和動態(tài)特征(行為)概括出來并加以描述,而對象是類的具體實現(xiàn),所以說類與對象的概念是客觀世界的反映。什么叫類域?為什么說類域是抽象的?答:類域是類體所包括的范圍。每個類定義都引入了一個獨立的類域,在類域中說明的標(biāo)識符僅在該類的類域中有效。由于類只是ー個說明,看上去有數(shù)據(jù),有函數(shù),有類型定義,但是它并非實體,不分配內(nèi)存,當(dāng)然也不能運行。所以說類域是抽象的。引用作為函數(shù)參數(shù)時為什么能實現(xiàn)兩個實參之間的數(shù)據(jù)交換?為什么對應(yīng)實參不能為引用?為什么返回值為引用的函數(shù)可以作為左值?答:引用變量是其關(guān)聯(lián)變量的別名,二者在內(nèi)存中占據(jù)同一個存儲單元。在一個以引用作為參數(shù)的函數(shù)中,交換兩個參數(shù)的值,實際上就是交換兩個實參的值。如果函數(shù)的參數(shù)是弓I用,調(diào)用時需要取得實參的地址,而實參如果已經(jīng)是ー個地址,再進(jìn)行引用將產(chǎn)生錯誤,故對應(yīng)實參不能為引用。函數(shù)返回引用實際是指明(返回)了相應(yīng)的關(guān)聯(lián)變量,所以聲明返回值為引用的函數(shù)實際上是將關(guān)聯(lián)變量作為左值參與運算。什么是缺省的構(gòu)造函數(shù)?缺省的構(gòu)造函數(shù)最多可以有多少個?答:如果在類定義中不顯式地定義構(gòu)造函數(shù),C++編譯器會自動產(chǎn)生一個缺省的構(gòu)造函數(shù),不過該函數(shù)不做具體的初始化工作。只要構(gòu)造函數(shù)是無參的或者只要各參數(shù)均有缺省值的,C++編譯器都認(rèn)為是缺省的構(gòu)造函數(shù)。缺省的構(gòu)造函數(shù)只能有一個??截悩?gòu)造函數(shù)用于哪三個方面?答:用類的ー個對象去初始化該類的另ー個對象時使用。當(dāng)函數(shù)的形參是類的對象,調(diào)用函數(shù)時,進(jìn)行形參與實參結(jié)合時使用。當(dāng)函數(shù)的返回值是類對象,函數(shù)執(zhí)行結(jié)束返回調(diào)用者時使用。寫出含有對象成員的類的構(gòu)造函數(shù)的格式,并做簡単說明。答:C++中對含對象成員的類對象的構(gòu)造函數(shù)有固定的格式:類名::構(gòu)造函數(shù)名(參數(shù)總表):對象成員1(參數(shù)名表1),對象成員2(參數(shù)名表2) 對象成員n(參數(shù)名表n){ }冒號后用逗號隔開的是要初始化的對象成員,附在后面的參數(shù)名表1,…,參數(shù)名表n依次為調(diào)用相應(yīng)對象成員所屬的構(gòu)造函數(shù)時的實參表。這些表中的參數(shù)通常來自冒號前的參數(shù)總表,但沒有類型名。所有類對象未重載的賦值運算符“=”是怎樣工作的?為什么它可以進(jìn)行連續(xù)賦值?答:對所有的類對象,未重載的賦值運算符“ソ’稱作缺省的按成員拷貝賦值操作符,同類對象之間可以用“=”直接拷貝。因為缺省的賦值操作返回一個對象的引用,所以它可以進(jìn)行連續(xù)賦值。為什么在友元函數(shù)的函數(shù)體內(nèi)訪問對象成員時,必須用對象名加運算符”再加對象成員名?答:友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問對象的成員,必須用對象名加運算符加對象成員名。這一點和一般函數(shù)ー樣。重載復(fù)數(shù)運算符+時,采用下面友元函數(shù)聲明:friendComplexoperator+(Complex&c1,Complex&c2);為什么不能用于“實數(shù)+復(fù)數(shù)”?怎樣改進(jìn)才能適用?為什么?答:使用引用類型變量作為運算符重載函數(shù)的參數(shù),身為左值的實數(shù)類型實參不能被轉(zhuǎn)換為復(fù)數(shù),編譯時無法通過。添加const說明,使實數(shù)到復(fù)數(shù)的轉(zhuǎn)換隱式地在ー份拷貝上進(jìn)行,則可以實現(xiàn)“實數(shù)+復(fù)數(shù)”運算。修改后的說明為:friendComplexoperator+(constComplex&cl,constComplex&c2);類的靜態(tài)數(shù)據(jù)成員與函數(shù)中的靜態(tài)成員有何異同?答:類的靜態(tài)成員為其所有對象共享,不管有多少對象,靜態(tài)成員只有一份存于公用內(nèi)存中,為該類所有對象公用。函數(shù)中的靜態(tài)變量也位于公用內(nèi)存中,不隨函數(shù)調(diào)用而重新分配,所以總是保留上次進(jìn)入并執(zhí)行該函數(shù)后留下的信息。C++中結(jié)構(gòu)、聯(lián)合與類三者間有何異同?答:在C++中結(jié)構(gòu)(structure)與類幾乎是完全一樣的類型,差別僅僅在于缺省情況下結(jié)構(gòu)的成員為公有的。聯(lián)合(union)是C++的導(dǎo)出數(shù)據(jù)類型,在語法與功能上類似于結(jié)構(gòu),二者的區(qū)別是:結(jié)構(gòu)變量的各成員同時被分配了各自獨立的內(nèi)存區(qū),而聯(lián)合變量的各個成員的存儲開始地址都相同,所以在任一時刻聯(lián)合變量只能存儲一個成員。對象的第一特征是封裝,那么由對象組成的面向?qū)ο蟮某绦蛟鯓咏⒏鲗澫笾g的有效聯(lián)系?面向?qū)ο蟪绦虻慕M織與面向過程有什么不同?答:因為對象的操作主要用來響應(yīng)外來消息并為其他對象提供服務(wù),所以面向?qū)ο蟮某绦蚶孟鬟f機(jī)制來建立各對象之間的有效聯(lián)系,協(xié)調(diào)各對象的運行。ー個對象可以向其他對象發(fā)送消息以請求服務(wù),也可以響應(yīng)其他對象傳來的消息,完成自身固有的某些操作,從而服務(wù)于其他對象。面向過程的程序是模塊化的,模塊的組織具有分層結(jié)構(gòu)特點,層與層之間是調(diào)用關(guān)系。面向?qū)ο蟪绦蚴怯梢粋€個封裝的對象組成,而對象是由緊密結(jié)合在ー起的算法和數(shù)據(jù)結(jié)構(gòu)組成。對象之間是相互請求和相互協(xié)作的關(guān)系。簡敘Windows下應(yīng)用程序的運行方式。答:Windows系統(tǒng)支持多個應(yīng)用程序同時執(zhí)行,在界面形式上,它支持多個窗口同時活動。它的運行機(jī)制是“消息傳遞和事件驅(qū)動(messagebasedandeventdriven) 〇Windows系統(tǒng)使用事件驅(qū)動的編程模式。所謂事件的含義非常廣泛。輸入設(shè)備的動作,如敲打鍵盤、按鼠標(biāo)等會產(chǎn)生一系列的事件(注意不是ー個事件)。操作系統(tǒng)所作的ー舉ー動也被當(dāng)作某種類型的事件,應(yīng)用程序也會產(chǎn)生各種事件。事件用來標(biāo)識發(fā)生的某件事情。Windows系統(tǒng)對于應(yīng)用程序環(huán)境中發(fā)生的每一個事件都會以對應(yīng)的某種消息的形式標(biāo)識,并放入相應(yīng)的Windows建立的消息隊列中,然后由對應(yīng)的應(yīng)用程序或窗口函數(shù)去處理。窗口函數(shù)處理是分層的,前面處理不了的送到后面,最后處理不了剩ド的全由缺省的窗口函數(shù)處理。類的成員函數(shù)在什么情況下應(yīng)該定義為私有的?這樣做的目的是什么?答:除接口函數(shù)和創(chuàng)建本類對象的構(gòu)造函數(shù)和撤消該對象的析構(gòu)函數(shù)外。其余成員函數(shù)應(yīng)該定義為私有的,這是開發(fā)類時故意對外隱蔽起來的操作,面這些往往是最復(fù)雜最關(guān)鍵的部分。類中故意的隱藏也為以后的升級擴(kuò)展留ト了余地,只要接口不變,內(nèi)部再變,也不必修改原來的程序,就象MFC(微軟基礎(chǔ)類)升級后,由MFC底層類所編的程序完全不必修改,自動升級。二.編程與綜合練習(xí)題構(gòu)造ー個II期時間類(Timedate),數(shù)據(jù)成員包括年、月、日和時、分、秒,函數(shù)成員包括設(shè)置日期時間和輸出時間,其中年、月請用枚舉類型,并完成測試。(包括用成員函數(shù)和用普通函數(shù))解:本題要求僅是定義類的練習(xí),并非實用的提供日期時間的程序。實用的日期時間程序見附錄二的日期時間函數(shù)。#include<iostream>#include<iomanip>usingnamespacestd;enumYR(Y2000,Y2001,Y2002,Y2003,Y2004,Y2005};//enumMT{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};classTimedate{private:YRyear;MTmonth;intdate;inthh;intmm;intss;public:Timcdate(){year=Y2000;month=Jan;date=l;hh=0;mm=0;ss=0;}Timedate(YRa,MTb,intc){year=a;month=b;date=c;hh=12;mm=30;ss=0;}voidgetdate(YR&,MT&,int&);//使用引用一次取得3個數(shù)值voidgettime(int&,int&,int&);voidputdate(YR,MT,int);voidputtime(int,int,int);voidlist(););voidTimedate::getdate(YR&y,MT&m,int&d){y=year;m=month;d=date;)voidTimedate::gcttime(int&a,int&b,int&c){a=hh;b=mm;c=ss;}voidTimedate::putdate(YRa,MTb,intc){year=a;month=b;date=c;voidTimedate::puttime(inta,intb,intc){hh=a;mm=b;ss=c;)voidTimedate::list(){〃成員函數(shù),直接訪問私有的數(shù)據(jù)成員cout?Hyear/month/date:M;switch(year){caseY2000:cout?n2000n;break;caseY2001:cout?*'2001H;break;caseY2002:cout?,,2002,,;break;caseY2003:cout?"2003**;break;caseY2004:cout?"2004,,;break;caseY2005:cout?'*2005H;break;}switch(month){caseJan:cout?7f?"JanM;brcak;caseFeb:coutv<7vv"Feb”;break;caseMar:eoutwソ'w"Mar”;break;caseApr:cout?'/I?nApr";break;caseMay:cout?7'?"May";break;caseJun:cout?7'?"Jun”;break;caseJul:cout?7'?"Jul";brcak;caseAug:cout?7'?"Augn;break;caseSep:cout?7'?"Sep";break;caseOct:cout?7'?"OctM;break;caseNov:cout?7'?"NovH;break;caseDec:cout?7'?"Dec";break;}cout?7'?date?endl;cout?"hour:minite:secondcout?hh?':'?mm?':'?ss?endl;}voidlist(Timedatetd){〃普通函數(shù),通過接口函數(shù)訪問私有的數(shù)據(jù)成員YRyear;MTmonth;intdate;inthh;intmm;intss;td.getdate(year,month,date);cout?Hyear/month/date:";switch(year){caseY2000:cout?"2000,,;break;cas
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人裝修委托書
- 雙方設(shè)備合作合同范本
- 南瓜訂貨合同范例
- 斷層解剖復(fù)習(xí)題+答案
- 合伙買車合作協(xié)議合同范例
- 七年級下學(xué)期語文總結(jié)
- 兼職游泳教練合同范本
- 保潔合同范本(完美版)
- 廠里員工租房合同范本
- 《贈劉景文》和《山行》古詩的教學(xué)反思
- 寶寶相冊生日祝??蓯劭ㄍ娮酉鄡訮PT模板
- T∕CACM 1232-2019 中醫(yī)內(nèi)科臨床診療指南 真心痛(PCI術(shù)后)
- 《XX醫(yī)院安寧療護(hù)建設(shè)實施方案》
- 教科版科學(xué)五年級下冊《熱》單元教材解讀分析
- 安脈學(xué)生信息化管理系統(tǒng)(課堂PPT)
- 化學(xué)實驗室安全培訓(xùn)課件課件
- 渤海灣盆地構(gòu)造演化及其油氣意義
- word公章模板
- 中西醫(yī)結(jié)合腫瘤學(xué)試卷(含答案)
- 開學(xué)第一課我們開學(xué)啦主題班會PPT課件(帶內(nèi)容)
- 體育訓(xùn)練隊隊規(guī)
評論
0/150
提交評論