C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第1頁
C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第2頁
C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第3頁
C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第4頁
C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題

一.基本概念與基礎(chǔ)知識自測題

3.1程序閱讀題

3.1.1設(shè)有說明:

inta=3,b=100;

下面的循環(huán)語句執(zhí)行次,執(zhí)行后a、b的值分別為(2)、(3)°

while(b/a>5){i

f(b-a>25)a++;

elseb/=a;

}解答:本題檢查學(xué)生整除的概

念。跟蹤:

abb/a循環(huán)次數(shù)b-a

310033197

410025296

510020395

1510061385

1610061484

171005停

(1)14

(2)17

(3)100

3.1.2設(shè)有說明:

intn,x,k,y;

下面程序段的功能是備選答案中的(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;

備選答案:

AV=(1+-X)B.y=(l二)2"C.y=(1D.y=(1上/

+2"+2"+2n,1

n

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題2

解答:

第一個(gè)循環(huán)使x成為:3;y成為:1+—:第一個(gè)循環(huán)使y成為:(1+土)2"

2"2"2"

(1)B

考慮整除二連除4次以后為零,所以:

"'2"

(2)1

3.1.3請看如下程序段:

if(num==1)coutvv"Alpha”;

elseif(num==2)coutvv“Bata”;

elseif(num==3)coutvv''Gamma”;

elsecout?^^Delta^^;

當(dāng)num的值分別為1、2、3時(shí),上面程序段的輸出分別為(1)、⑵、⑶。解

答:

檢查條件語句與字符串輸出概念:

(1)Alpha

(2)Bata

(3)Gamma

3.1.4執(zhí)行下面程序段后,m和k的值分別為(1)、(2)o

intm,k;

for(k=1,m=0;k<=50;k++){

if(m>=10)break;

if(m%2==0){

m+=5;

continue;

m-=3;

}

解答:注意continue語句的使用

初值m=lk=0

第1次循環(huán)后m=5k=l

第2次循環(huán)m=2k=2

第3次循環(huán)m=7k=3

第4次循環(huán)m=4k=4

第5次循環(huán)m=9k=5

第6次循環(huán)m=6k=6

第7次循環(huán)m=ll結(jié)束,k++未做

(1)11

(2)6

二.編程與綜合練習(xí)題

3.2編程求一元二次方程ax2+bx+c=0的根。包括以下判斷和結(jié)果:若輸入a=0,給出提示;

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題3

若△>(),輸出兩個(gè)不等實(shí)根;若△=(),輸出兩個(gè)相等實(shí)根;若△<(),輸出兩個(gè)復(fù)數(shù)根。

解:本題以一個(gè)絕對值極小的數(shù)作為實(shí)數(shù)0。

ttinclude<iostream.h>

#include<math.h>

#include<stdlib.h>

voidmain(){

doublea,b,c;

doubledelta,xl,x2;

constdoublezero=le-9;〃定義一個(gè)很小的常數(shù)

intsign;

cout*〃輸入三個(gè)系數(shù)a(a!=0),b,c:"<<6ndl;

cin?a?b?c;

if(fabs(a)<zero){cout<〈〃二次項(xiàng)系數(shù)為0,

方程根是-c/b";exit(0);

}cout?/za=zz?a?,\t*<<,zb=zz<<b?,\t,?z,c=,,<<c<<endl;

delta=b*b-4*a*c;if(fabs(delta)<zero){〃絕對值很小

的數(shù)即被認(rèn)為是0

cout?〃方程有兩個(gè)相同實(shí)根:〃;

cout〈<"xl=x2=”<<-b/(2*a)?endl;

)

else{

if(delta>0)

sign=1;

else

sign=0;

delta=sqrt(fabs(delta));

xl=-b/(2*a);

x2=delta/(2*a);

if(sign){cout<<”方程有兩個(gè)不同實(shí)根:〃;

cout<<,,xl="z?xl+x2<<,\t*<<z,x2=,,<<xl-x2<<endl;

)

else{//delta<0cout<<〃方程無實(shí)根!有兩個(gè)不同復(fù)數(shù)根:〃;

cout?/,xl=/,?xl?,,+i//?x2?,\t*?,,x2=,/?xl<<,,-i,/<<x2?endl;

)

)

)

3.3設(shè)計(jì)程序?qū)⑤斎氲陌俜种瞥煽冝D(zhuǎn)換為五分制輸出,90分以上為5分,80-89分為4分,

70-79分為3分,60?69分為2分,60分以下為1分。解:

10分一檔用10進(jìn)行整除獲得,轉(zhuǎn)換用開關(guān)語句實(shí)行。

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題4

#include<iostream.h>

voidmain(){

intmark,result;〃mark是百分制成績,result是5分制

cout*〃請輸入百分制成績:〃。endl;

cin>>mark;

if(mark<0){cout<〈〃缺考!

,,<<endl;return;

}

switch

(mark/10){case9:

case10:result=5;

cout<〈”輸出五分制成績:〃<<result<<endl;

break;

case8:result=4;cout<<〃輸出五分制成績:

,z<<result?endl;break;

case7:result=3;cout<<“輸出五分制成績:

,z<<result?endl;break;

case6:result=2;cout?〃輸出五分制成績:

"z<<result<<endl;break;

case5:case4:case3:case2:case1:case0:

result=1;cout<<"輸出五分制成績:

/z?result<<endl;break;

default:

cout?"輸入錯(cuò)誤!z/?endl;

)

)

3.4編程打印如下圖形:

*****

**

***

***

***

解:難點(diǎn)在三角形左邊的空格的控制,嵌套一個(gè)循環(huán)語句完成此任務(wù)。

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題5

#include<iostream.h>

voidmain(){

inti,j;

for(i=l;i<=4;i++){

for(j=4-i;j>0;j—)//三角形每行前部的空格

cout<<〃";

for(j=l;j<=2*i-l;j++)

cout?,z*〃;

cout<<endl;

)

for(i=l;i<=3;i++)cout?,z***\n〃;

)

3.5編程輸出下列圖形,中間一行英文字母由輸入得到。

A

BBB

CCCCC

DDDDDDD

CCCCC

BBB

A

解:分上三角和下三角兩部分分別處理左邊的空格。

#include<iostream.h>

void

mainO{

charin;

inti,j;

do{

cout<〈〃輸入一個(gè)字母:〃;

cin>>in;

if((in>=97)&&(in<=122))in-=32;〃小寫改大寫

}while((in<65)||(in>90));

intline=in」A';

for(i=0;iOline;i++){〃上三角

for(j=line-i;j>0;j一一)

cout?/,〃;〃前方空格

for(j=l;j<=2*i+l;j++)

cout?,J?char(i+'A');

cout<<endl;

)

for(i=line;i>0;i一){〃下三角(少一行)

for(j=0;j<=line-i;j++)

cout<<,z〃;

for(j=l;j<=2*i-l;j++)

cout<<,*?char(iT+'A');

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題6

cout<<endl;

}

3.6輸入n,求1!+2!+3!+…+n!

解:通常求和作為外循環(huán),階乘作為內(nèi)循環(huán)。這里考慮到:n!=n*(nT)!,利用遞推法運(yùn)算速

度大大提高,同時(shí)兩者可合并為一個(gè)循環(huán)。本程序考慮了輸入的健壯性。

#include<iostream.h>

#include<stdlib.h>

voidmain(){

intn;

doubleresult=0;"result是結(jié)果

cin?n;

if(n<l)

(

cout<<“輸入錯(cuò)誤!”<<endl;

//return;

exit(0);

}

result=l;

for(inti=2,jch=l;i<=n;i++)

(

jch*=i;〃jch是i的階乘,注意n!=n*(nT)!這樣可少一層循環(huán)

result+=jch;

)

cout<<result<<endl;

)

3.7猴子吃桃問題:猴子摘下若干個(gè)桃子,第一天吃了桃子的一半多一個(gè),以后每天吃了前

一天剩卜的一半多一個(gè),到第十天吃以前發(fā)現(xiàn)只剩下一個(gè)桃子,問猴子共摘了幾個(gè)桃子。

解:采用遞推法。從最后一天逆推到第一天,9次循環(huán)。

#include<iostream.h>

constintday=10;

voidmain(){

inti,x=l;〃最后?天只有?個(gè)

for(i=l;i〈day;i++)〃從一天前推到九天前

x=(x+l)*2;

coutG〃開始共有桃子〃<<x<<〃個(gè)。\n〃;

}

3.8從鍵盤輸入?組非0整數(shù),以輸入0標(biāo)志結(jié)束,求這組整數(shù)的平均值,并統(tǒng)計(jì)其中的個(gè)

數(shù)。解:將這組整數(shù)放在整型數(shù)組中,一邊輸入一邊求和及統(tǒng)計(jì)正數(shù)和負(fù)數(shù)的個(gè)數(shù),平均數(shù)

由和除以整數(shù)數(shù)量取得。

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題7

#include<fstream.h>

#include<iostream.h>

voidmain(){

intstem[256],sum=O,pnum=0,nnum=0,i=0;cout<〈〃從鍵盤輸

入一組非0整數(shù),以輸入0標(biāo)志結(jié)束:〃<<endl;cin?stem[i];

while(stem[i]!=0){sum+二;〃求

和if(stem[i]>0)pnum++;〃止數(shù)數(shù)

量elsennum++;〃負(fù)數(shù)數(shù)量

i++;

cin>>stem[i];

)

if(!i)cout<<〃0個(gè)數(shù)"<<endl;

else{cout<<〃平均值="?(double)sum/(pnum+nnum)<<endl;〃平均值習(xí)慣不用整

數(shù)cout<<“iE數(shù)個(gè)數(shù)=〃<<pnum〈<endl;

cout<<"負(fù)數(shù)個(gè)數(shù)=,z<<nnuin<<endl;

)

)

3.9編程找出1~500之中滿足除以3余2,除以5余3,除以7余2的整數(shù)。

解:中國古代數(shù)學(xué)問題(韓信點(diǎn)兵)采用窮舉法。注意三個(gè)條件同時(shí)成立用&&。

#include<iostream.h>

voidmain(){inti;

for(i=l;i<=500;i++)

if((i%3==2)&&(i%5==3)&&(i%7==2))

cout<<i<<endl;

)

3.10編程求1000之內(nèi)的所有完全數(shù)。所謂完全數(shù)指的是一個(gè)數(shù)恰好等于它的所有因子和。

例如6=1+2+3,就是一個(gè)完全數(shù)。

解:采用窮舉法。兩重循環(huán),外層是從1到999依次處理,內(nèi)層是求該數(shù)的所有因子的和,并

判斷是否等于該數(shù)。

#include<iostream.h>

voidmainO{

inti,a,sum_yz;//sumyz是a的因子和

for(a=l;a<1000;a++){

sumyz=O;

for(i=l;i<a;i++)

if(a%i==0)sumyz+=i;

if(a==sum_yz)

cout?a<<endl;

i

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題8

)

3.11將100元換成用10元、5元和1元的組合,共有多少種組合方法。

解:采用窮舉法??紤]10元最多10張,5元最多20張,余下是1元。

#include<iostream.h>

voidmain(){

for(inti=0,j,k,count=0;i<=10;i++)〃i是10元張數(shù),j是5元張數(shù),k是1元張數(shù)

for(j=0;j<=20;j++){

k=100-10*i-5*j;

if(k>=0){

cout?i?,\tf?j?>\t*?k?endl;

count++;

)

)

cout<<count?endl;

}

3.12利用反正切展開計(jì)算n的近似值,要求誤差105,公式如下:

\5x7*

arctg(x)七x-丁—~+L

令x=l,可計(jì)算出兀/4的近似值。解:采用遞推法。初看每一項(xiàng)的遞推通式不易寫出,但每一

項(xiàng)全看作奇數(shù)項(xiàng),而偶數(shù)項(xiàng)全為零,則很容易寫出:第1項(xiàng)為x,第3項(xiàng)為第1項(xiàng)乘以x的

平方除以項(xiàng)序號3乘以其余類推。同時(shí)和的誤差小于最后一項(xiàng)的絕對值。

#include<iostream.h>

#include<math.h>

constdoublee=le-6;

voidmain(){

doublex,a,sum;inti=3;

cout<〈〃請輸入弧度值:〃Gendl;

cin?x;

a=x;

sum=x;

do{

a*二x*x*(T);

sum+=a/i;

i+=2;

}while(fabs(a/i)>e);

cout?,zarctg(,z<<x?/z)=,,<<sum?endl;

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題9

3.13用迭代法求方程x2+10cosx=0的根,誤差限為10工迭代公式如下:

xTO.si*x+CQSX)

〃’2xn-lOsinxn

解:迭代法也是用循環(huán)語句實(shí)現(xiàn),數(shù)學(xué)上

#include<iostream.h>

#include<math.h>

constdoublee=le-5;

voidmain(){

floatxO,xl;intn=0;cout<<“輸

入初始近似值:〃<<endl;cin?xl;

do{

x0=xl;

xl=(x0*x0-10*(x0*sin(x0)+cos(x0)))/(2*x0-10*sin(x0));

〃x0是上次算出的結(jié)果,xl用作保存新算出的結(jié)果

n++;

}while((fabs(xl-x0)>e)&&(n<=le5));

if(n>le5)

cout<<〃超出迭代le5次\n”;

elsecout<<"方程x*x+10*cos(x)=0的一個(gè)根為'z,?xl?endl;

cout<〈〃方程誤差為:z/?xl*xl+10*cos(xl)?endl;

)

3.14兩隊(duì)選手每隊(duì)5人進(jìn)行一對一的比賽,甲隊(duì)為A、B、C、D、E,乙隊(duì)為J、K、L、M、

N,經(jīng)過抽簽決定比賽配對名單。規(guī)定A不和J比賽,M不和D及E比賽。列出所有可能

的比賽名單。

解:這是一個(gè)組合問題,使用窮舉法。共有5個(gè)位置,設(shè)甲隊(duì)5名隊(duì)員位置不變,乙隊(duì)改變隊(duì)

員位置,進(jìn)行配對。注意第1個(gè)位置可在5個(gè)隊(duì)員中任選一個(gè),以后的位置必須扣除已選過

的隊(duì)員。并扣除不能配對的情況,即得所有可能的比賽名單。

#include<iostream.h>

voidmain(){

charstl[5]=CA','B','C','D','E'},st2[5]={'J','K','L','M','N'};

inti=0,j,k,1,m,n;

for(j=0;j<5;j++){〃。號位

if(j=0)continue;//A不與J上匕賽,[0]不與st2[0]上匕賽

for(k=0;k<5;k++){〃1號位

if(k==j)continue;

for(l=0;l<5;l++){〃2號位

if(l==j||l==k)continue;

for(m=0;m<5;m++){〃3號位

if(m==j||m"k||m==l)continue;

______________________________第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題______________________________]0

if(m==3)continue"/NTT^與D比賽,即stl[3]不與st2[3]比賽

for(n==0;n<5;n++){〃4號位

if(n=3)continue;//M不與E比賽,即stl[4]不與st2[3]比賽

if(n==j||n==k||n==l||n==m)continue;

cout<<stl[0]<<,<<st2[j]<<,\t*<<stl-,?st2[k]?,\t,;

cout?stl[2]?,-?st2[l]?,\t,?stl[3]?,-?st2[m]?,\tJ;

cout<<stl[4]-,?st2[n]?endl;

i++;

)

)

)

)

)

cout?i<<endl;

3.15編程模擬選舉過程。假定四位候選人:zhang、wang、li、zhao,代號分別為1、2、3、

4O選舉人直接鍵入候選人代號,卜4之外的整數(shù)視為棄權(quán)票,-1為終止標(biāo)志。打印各位候

選人的得票以及當(dāng)選者(得票數(shù)超過選票總數(shù)一半)名單。

解:用5個(gè)元素的整型數(shù)組,分別放棄權(quán)票和各候選人的得票,然后用開關(guān)語句打印。

#include<iostream.h>

#include<iomanip.h>

voidmain(){

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]++;

elsevote[0]++;

cin>>n;

)

for(i=0;i<5;i++){cand

=(candidate)i;

switch(cand){

casefeipiao:

cout<<setw(10)?,/feipiao*?,\tJ<<vote[cand]?endl;break;

casezhang:cout<<setw(10)<<,,zhang,,?,\t'<<vote[cand];

if(vote[cand]>k/2)cout<<"當(dāng)選"<<endl;

elsecout?endl;

break;

casewang:cout<<setw(10)<</zwangz,<<,\t'<<vote[cand];

if(vote[cand]>k/2)cout<<,/當(dāng)選;

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題11

elsecout?endl;

break;

case1i:cout?setw(10)?,zli,,?,\tJ<<vote[cand];

if(vote[cand]>k/2)cout<<〃當(dāng)選〃<<endl;

elsecout?endl;

break;

casezhao:cout<<setw(10)?,,zhao,,<<,\t*<<vote[cand];

if(vote[cand]>k/2)cout<<,?當(dāng)選〃<<endl;

elsecout?endl;

break;

)

}

)

3.16改造【例3.11】將運(yùn)行結(jié)果(Fibonacii數(shù)列的前20項(xiàng))存入文件。

解:采用3步法。首先建立或打開一個(gè)輸出文件,并與磁盤文件聯(lián)系:

ofstreamofile(〃myfile3」6.txt");再按一定格式存入數(shù)據(jù):

ofile〈<setw(15)<〈fib0<〈setw(15)<<fibl;等然后關(guān)閉文件:

ofile.closeO;如要讀出數(shù)據(jù),則用輸入文件打開,并與同一磁盤文件

聯(lián)系:

ifstreamifileC'myfile316.txt,z);再按同?

格式讀入數(shù)據(jù):ifile>>i>>j>>k?l;等,并輸出最后關(guān)閉

文件:file.close();

#include<fstream.h>

#include<iomanip.h>

constintm=20;

voidmain(){

intfibO=O,fibl=l,fib2,i,j,k,1;

charch,a[256];

ofstreamofile(〃myfile3_16.txt〃);

ofile?setw(15)<<fib0<<setw(15)?fibl;

for(intn=3;n<=m;n++){

fib2=fib0+fibl;

ofile<<setw(15)?fib2;

if(n%5==0)ofile<<endl;〃控制每行5個(gè)數(shù)據(jù)

fibO=fibl;fibl=fib2;

}ofile.close。;cout<<”是否要將文件輸

出?Y或N”〈〈endl;cin>>ch;

if(ch=-y||ch==,Y'){

ifstreamifile(〃myfile3_16.txt〃);

while(l){

由文件讀入

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題12

if(ifile.eof()!=0)break;

cout<<setw(15)<<i<<setw(15)<<j<<setw(15)<<k<<setw(15)?l<<endl;

〃屏幕顯示

)

ifile.close0;

)

3.17改造【例3.16】將運(yùn)行結(jié)果(100以內(nèi)素?cái)?shù))存入文件。

解:采用4步法?首先定義一個(gè)輸出文件:ofstreamofile;再打開該文

件并與并與磁盤文件聯(lián)系:ofile.open(〃myfile317.txt〃);按一定格式

把數(shù)據(jù)存入文件。最后關(guān)閉文件。效果與3步法相同。讀文件同樣可用3步

法或4步法。

#include<fstream.h>

#include<iomanip.h>

#include<math.h>

constintn=100;

voidmain(){

inta[n],i,j;

charch,b[256];

ofstreamofile;

ifstreamifile;

for(i=0;i<n;i++)a[i]=l+i;〃用數(shù)組保存整數(shù)ITOO

a[0]=0;〃1不是素?cái)?shù),置0

for(i=0;i<n;i++){

if(a[i]==0)continue;〃該數(shù)已經(jīng)置0,判斷下一個(gè)數(shù)

for(j=i+l;j<n;j++)if(a[j]%a[i]=0)a[j]=0;〃是a[i]倍數(shù)的元素置0;

}ofile.open(,zmyfile317.txt");

intcount=O;

-〃<<n<<〃之間的素?cái)?shù):"<<endl;

for(i=0;i<n;i++)〃輸出所有素?cái)?shù)

if(a[i]!=0){ofile?setw(

6)<<a[i];count++;

if(count%10~0)ofile<<endl;〃每彳j10個(gè)數(shù)據(jù)

}ofile.close。;cout<<〃是否要將文

件輸出?Y或N"<<endl;cin>>ch;

if(ch==,yf||ch==,Yf){ifile.open(

“myfile3_17.txt");i=0;

while(ifile.get(b[i])){〃不可用〉》,它不能讀白字符,

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題13

if(b[i]=,\n)break;

i++;

)

b[i]八O';

cout<<b?endl;

count=0;

while(l){

ifile>>i;〃由文件讀入

cout?setw(6);〃屏幕顯示

count++;

if(count%10==0)cout<<endl;〃每行10個(gè)數(shù)

if(ifile.eof()!=0)break;

〃這里與例3.20不同,最后一個(gè)數(shù)據(jù)后面可能沒有回車,直接為文件結(jié)束

}ifile.close();

cout<<endl;

}

3.18改造【例3.10】文本由文本文件輸入。

解:文本文件讀入要用成員函數(shù):ifile.get。,而不可用插入運(yùn)算符否則會(huì)丟失空白字

符。

#include<fstream.h>

voidmain(){

charch;

intnline=0,nword=0,nch=0;

intisword=0;

ifstreamifile(,zep3_18.cpp〃);

cout〈<〃讀入ep3_18.cpp/z?endl;

do{

ch二ifile.get();

if(ch==,\n)nline++;//遇換行符行數(shù)+1

if(ch!=''&&ch!='\t'&&ch!='\n&&ch!=EOF){〃讀到非間隔符

if(!isword)nword++;〃在單詞的起始處給單詞數(shù)+1

nch++;〃字符數(shù)加+1

isword=l;

}

elseisword=0;//讀到間隔符

}while(ch!二EOF);〃讀到文本結(jié)束符為止

ifile.closeO;cout<<“行數(shù):

z/?nline<<endl;cout<<“單詞數(shù):

z,?nword<<endl;cout<<〃字符數(shù):

,,?nch<<endl;

)

第二章基本控制結(jié)構(gòu)程序設(shè)計(jì)習(xí)題14

第四章類與對象習(xí)題1

第四章類與對象習(xí)題

--基本概念與基礎(chǔ)知識自測題

4.1填空題

5.1.1引入類定義的關(guān)鍵字是(1)。類的成員函數(shù)通常指定為(2),類的

數(shù)據(jù)成員通常指定為(3)。指定為(4)的類成員可以在類對象所在域

中的任何位置訪問它們。通常用類的(5)成員表示類的屬性,用類的⑹

成員表示類的操作。

答案:

(1)class

(2)公有的public

(3)私有■的private

(4)公有的public

(5)數(shù)據(jù)

(6)函數(shù)

4.1.2類的訪問限定符包括(1)、⑵和⑶“私有數(shù)據(jù)通常由

(4)函數(shù)來訪問(讀和寫)這些函數(shù)統(tǒng)稱為(5)。

答案:

(1)public(公有的)

(2)private(私有的)

(3)protected(保護(hù)的)

(4)公有的成員函數(shù)

(5)類的接口

4.1.3通常在邏輯上,同一類的每個(gè)對象都有(1)代碼區(qū).用以存儲(chǔ)成員函數(shù)。而

在物理上通常只有(2)代碼區(qū)。只有在(3)定義.并⑷的

函數(shù)和加了關(guān)鍵字(5)的函數(shù)例外。

s

(1\

7獨(dú)立的

(2X

/)共用的

(3\

/)

(在類說明中

4\

ZJ

(不包括循環(huán)等復(fù)雜結(jié)構(gòu)

5)\

zinline

44

C++中支持三種域:⑴、⑵、⑶°函數(shù)域被包括在

(4)中.全局域被包括在(5)中。using指示符以關(guān)鍵字using開頭,后面

是關(guān)鍵字(6),最后是(7)這樣表示以后在該名字空間中所有成員都(8)

。如不使用using指示符則在使用時(shí)要加::,稱為(9)運(yùn)算符。答

案:

(1)局部域(localscope)

(2)名字空間域(namespacescope)

(3)類域(classscope)

(4)局部域

(5)名字空間域

(6)namespace

(7)名字空間名

第四章類與對象習(xí)題2

(8)可以直接被使用

(9)域

4.1.5引用通常用作函數(shù)的(1)和(2).對數(shù)組只能引用(3)不能引用(4)?答

案:

(1)參數(shù)

(2)返回值

(3)數(shù)組元素

(4)數(shù)組名本身

4.1.6構(gòu)造函數(shù)的任務(wù)是(1),,構(gòu)造函數(shù)無(2)。類中可以有(3)

個(gè)構(gòu)造函數(shù),它們由(4)區(qū)分。如果類說明中沒有給出構(gòu)造函數(shù),則C++編譯器

會(huì)⑸。拷貝構(gòu)造函數(shù)的參數(shù)是(6),當(dāng)程序沒有給出復(fù)制構(gòu)造函

數(shù)時(shí),系統(tǒng)會(huì)自動(dòng)提供(7)支持.這樣的復(fù)制構(gòu)造函數(shù)中每個(gè)類成員(8)

0

答案:

(1)初始化數(shù)據(jù)成員

(2)函數(shù)返回類型說明

(3)多

(4)不同的參數(shù)表

(5)自動(dòng)給出一個(gè)默認(rèn)的構(gòu)造函數(shù)

(6)同一類對象的引用

(7)默認(rèn)的的復(fù)制構(gòu)造函,稱為默認(rèn)的按成員語義支持。

(8)被依次復(fù)制

4.1.7一個(gè)類有(1)個(gè)析構(gòu)函數(shù)。⑵時(shí).系統(tǒng)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。

答案:

(1)一

(2)對象注銷時(shí)

4.1.8運(yùn)算符重載時(shí),其函數(shù)名由(1)構(gòu)成。成員函數(shù)重載雙目運(yùn)算符時(shí).左操作

數(shù)是⑵,右操作數(shù)是(3)。

”案:

1(1)關(guān)鍵字operator和該運(yùn)算符

(2)對象

(3)該函數(shù)的參數(shù)

4.1.9面向過程的程序設(shè)計(jì)中程序模型描述為(1),面向?qū)ο蟪绦蛟O(shè)計(jì)的程序模型可描

述為⑵。

答案:

(1)“程序=算法+數(shù)據(jù)結(jié)構(gòu):'其數(shù)據(jù)與數(shù)據(jù)處理是分離的。

(2)程序=(對象+對象+……+對象)+消息;對象=(算法+數(shù)據(jù)結(jié)構(gòu))面向?qū)ο笤O(shè)計(jì)將數(shù)據(jù)

和對數(shù)據(jù)的操作方法放在一起,形成一個(gè)相對獨(dú)立的整體一一對象(Object)并通過

簡單的接口與外部聯(lián)系。對象之間通過消息(Message)進(jìn)行通訊。

4.2簡答題

4.2.1簡單解釋什么是面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝性。

答:對象是一個(gè)封裝體,在其中封裝了該對象所具有的屬性和操作。對象作為獨(dú)立的基本單

元,實(shí)現(xiàn)了將數(shù)據(jù)和數(shù)據(jù)處理相結(jié)合的思想。此外,封裝特性還體現(xiàn)在可以限制對象中數(shù)據(jù)

第四章類與對象習(xí)題3

和操作的訪問權(quán)限,從而將屬性“隱藏”在對象內(nèi)部,對外只呈現(xiàn)一定的外部特性和功能。

封裝性增加了對象的獨(dú)立性,C++通過建立數(shù)據(jù)類型——類,來支持封裝和數(shù)據(jù)隱藏。一

個(gè)定義完好的類一旦建立,就可看成完全的封裝體,作為一個(gè)整體單元使用,用戶不需要知道

這個(gè)類是如何工作的,而只需要知道如何使用就行。另一方面,封裝增加了數(shù)據(jù)的可靠性保護(hù)

類中的數(shù)據(jù)不被類以外的程序隨意使用這兩個(gè)優(yōu)點(diǎn)十分有利于程序的調(diào)試和維護(hù)。

4.2.2C++編譯器怎樣對標(biāo)識符進(jìn)行解析?答:編譯器對標(biāo)識符的解析分兩步,第一步查找在

聲明中用到的標(biāo)識符,特別是函數(shù)成員聲明中用到的參數(shù)類型,第二步是函數(shù)成員體內(nèi)的標(biāo)

識符。

4.2.3為什么說類與對象的概念是客觀世界的反映?答:客觀世界的事物都具有某些屬性

和行為(或操作)具有相同屬性和行為的事物可以歸屬于一類,用分類的方法可以提高認(rèn)識

事物的效率。C++中定義的類則是通過抽象的方法將某一類事物共有的靜態(tài)特征(屬性)和

動(dòng)態(tài)特征(行為)概括出來并加以描述,而對象是類的具體實(shí)現(xiàn),所以說類與對象的概念是

客觀世界的反映。

4.2.4什么叫類域?為什么說類域是抽象的?答:類域是類體所包括的范圍。每個(gè)類定義都

引入了一個(gè)獨(dú)立的類域,在類域中說明的標(biāo)識符僅在該類的類域中有效。由于類只是一個(gè)說

明,看上去有數(shù)據(jù),有函數(shù),有類型定義,但是它并非實(shí)體,不分配內(nèi)存,當(dāng)然也不能運(yùn)行。

所以說類域是抽象的。

4.2.5引用作為函數(shù)參數(shù)時(shí)為什么能實(shí)現(xiàn)兩個(gè)實(shí)參之間的數(shù)據(jù)交換?為什么對應(yīng)實(shí)參不能

為引用?為什么返回值為引用的函數(shù)可以作為左值?答:引用變量是其關(guān)聯(lián)變量的別名,

者在內(nèi)存中占據(jù)同一個(gè)存儲(chǔ)單元。在一個(gè)以引用作為參數(shù)的函數(shù)中,交換兩個(gè)參數(shù)的值,實(shí)際

上就是交換兩個(gè)實(shí)參的值。如果函數(shù)的參數(shù)是引用,調(diào)用時(shí)需要取得實(shí)參的地址,而實(shí)參如果

已經(jīng)是一個(gè)地址,再進(jìn)行引用將產(chǎn)生錯(cuò)誤,故對應(yīng)實(shí)參不能為引用。

函數(shù)返回引用實(shí)際是指明(返回)了相應(yīng)的關(guān)聯(lián)變量,所以聲明返回值為引用的函數(shù)實(shí)

際上是將關(guān)聯(lián)變量作為左值參與運(yùn)算。

4.2.6什么是缺省的構(gòu)造函數(shù)?缺省的構(gòu)造函數(shù)最多可以有多少個(gè)?答:如果在類定義中不

顯式地定義構(gòu)造函數(shù),C++編譯器會(huì)自動(dòng)產(chǎn)生一個(gè)缺省的構(gòu)造函數(shù),不過該函數(shù)不做具體的

初始化工作。只要構(gòu)造函數(shù)是無參的或者只要各參數(shù)均有缺省值的,C++編譯器都認(rèn)為是缺

省的構(gòu)造函數(shù)。缺省的構(gòu)造函數(shù)只能有一個(gè)。

4.2.7拷貝構(gòu)造函數(shù)用于哪三個(gè)方面?

答:

(1)用類的一個(gè)對象去初始化該類的另一個(gè)對象時(shí)使用,,

(2)當(dāng)函數(shù)的形參是類的對象,調(diào)用函數(shù)時(shí),進(jìn)行形參與實(shí)參結(jié)合時(shí)使用。

(3)當(dāng)函數(shù)的返回值是類對象,函數(shù)執(zhí)行結(jié)束返回調(diào)用者時(shí)使用。

4.2.8寫出含有對象成員的類的構(gòu)造函數(shù)的格式,并做簡單說明。答:C++中對含對象成員

的類對象的構(gòu)造函數(shù)有固定的格式:類名::構(gòu)造函數(shù)名(參數(shù)總表):對象成員1(參數(shù)名表1),

對象成員2(參數(shù)名表2).....對象成

第四章類與對象習(xí)題4

員n(參數(shù)名表n){........}

冒號后用逗號隔開的是要初始化的對象成員,附在后面的參數(shù)名表1,…,參數(shù)名表n依次為

調(diào)用相應(yīng)對象成員所屬的構(gòu)造函數(shù)時(shí)的實(shí)參表這些表中的參數(shù)通常來自冒號前的參數(shù)總

表,但沒有類型名。

4.2.9所有類對象未重載的賦值運(yùn)算符“=”是怎樣工作的?為什么它可以進(jìn)行連續(xù)賦值?

答:對所有的類對象,未重教的賦值運(yùn)算符“=”稱作缺省的按成員拷貝賦值操作符,同類對

象之間可以用“=”直接拷貝。因?yàn)槿笔〉馁x值操作返回一個(gè)對象的引用,所以它可以進(jìn)行

連續(xù)賦值。

4.2.10為什么在友元函數(shù)的函數(shù)體內(nèi)訪問對象成員時(shí),必須用對象名加運(yùn)算符再加對象

成員名?答:友元函數(shù)不是類的成員函數(shù),在函數(shù)體中訪問對象的成員,必須用對象名加運(yùn)

算符加對象成員名。這一點(diǎn)和一般函數(shù)一樣。

4.2.11重載復(fù)數(shù)運(yùn)算符+時(shí),采用下面友元函數(shù)聲明:friendComplex

operator+(Complex&c1,Complex&c2);為什么不能用于“實(shí)數(shù)+

復(fù)數(shù)”?怎樣改進(jìn)才能適用?為什么?

答:使用引用類型變量作為運(yùn)算符重載函數(shù)的參數(shù),身為左值的實(shí)數(shù)類型實(shí)參不能被轉(zhuǎn)換為

復(fù)數(shù),編譯時(shí)無法通過。添加const說明,使實(shí)數(shù)到復(fù)數(shù)的轉(zhuǎn)換隱式地在一份拷貝上進(jìn)行,則

可以實(shí)現(xiàn)“實(shí)數(shù)+復(fù)數(shù)”運(yùn)算“修改后的說明為:

friendComplexoperator+(constComplex&c1,constComplex&c2);

4.2.12類的靜態(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ù)

后留下的信息。

4.2.13C++中結(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)變量的各成員同時(shí)被分配了各自獨(dú)立的內(nèi)存區(qū),向聯(lián)合變量的各個(gè)成員的存

儲(chǔ)開始地址都相同,所以在任一時(shí)刻聯(lián)合變量只能存儲(chǔ)一個(gè)成員。

4.2.14對象的第一特征是封裝,那么由對象組成的面向?qū)ο蟮某绦蛟鯓咏⒏鲗ο笾g的

有效聯(lián)系?面向?qū)ο蟪绦虻慕M織與面向過程有什么不同?答因?yàn)閷ο蟮牟僮髦饕脕眄憫?yīng)

外來消息并為其他對象提供服務(wù),所以面向?qū)ο蟮某绦蚶孟鬟f機(jī)制來建立各對象之間

的有效聯(lián)系,協(xié)調(diào)各對象的運(yùn)行。一個(gè)對象可以向其他對象發(fā)送消息以請求服務(wù),也可以響應(yīng)

其他對象傳來的消息,完成自身固有的某些操作,從而服務(wù)于其他對象。

面向過程的程序是模塊化的,模塊的組織具有分層結(jié)構(gòu)特點(diǎn),層與層之間是調(diào)用關(guān)系。

面向?qū)ο蟪绦蚴怯梢粋€(gè)個(gè)封裝的對象組成,而對象是由緊密結(jié)合在一起的算法和數(shù)據(jù)結(jié)構(gòu)組

成。對象之間是相互請求和相互協(xié)作的關(guān)系。

第四章類與對象習(xí)題5

4.2.15簡敘Windows卜應(yīng)用程序的運(yùn)行方式。

答:Windows系統(tǒng)支持多個(gè)應(yīng)用程序同時(shí)執(zhí)行,在界面形式上,它支持多個(gè)窗口同時(shí)活動(dòng)。它

的運(yùn)彳亍機(jī)制是“消息傳遞禾口事件驅(qū)動(dòng)(messagebasedandeventdriven)'

Windows系統(tǒng)使用事件驅(qū)動(dòng)的編程模式。所謂事件的含義非常廣泛。輸入設(shè)備的動(dòng)作,如

敲打鍵盤、按鼠標(biāo)等會(huì)產(chǎn)生一系列的事件(注意不是一個(gè)事件)操作系統(tǒng)所作的一舉一動(dòng)也

被當(dāng)作某種類型的事件,應(yīng)用程序也會(huì)產(chǎn)生各種事件。事件用來標(biāo)識發(fā)生的某件事情。

Windows系統(tǒng)對于應(yīng)用程序環(huán)境中發(fā)生的每一個(gè)事件都會(huì)以對應(yīng)的某種消息的形式標(biāo)

識,并放入相應(yīng)的Windows建立的消息隊(duì)列中,然后由對應(yīng)的應(yīng)用程序或窗口函數(shù)去處理。窗

口函數(shù)處理是分層的,前面處理不了的送到后面,最后處理不了剩下的全由缺省的窗口函數(shù)處

理。

4.2.16類的成員函數(shù)在什么情況下應(yīng)該定義為私有的?這樣做的目的是什么?答除接口函

數(shù)和創(chuàng)建本類對象的構(gòu)造函數(shù)和撤消該對象的析構(gòu)函數(shù)外。其余成員函數(shù)應(yīng)該定義為私有的,

這是開發(fā)類時(shí)故意對外隱蔽起來的操作而這些往往是最復(fù)雜最關(guān)鍵的部分。類中故意的隱藏

也為以后的升級擴(kuò)展留下了余地,只要接口不變,內(nèi)部再變,也不必修改原來的程序,就象MFC

(微軟基礎(chǔ)類)升級后,由MFC底層類所編的程序完全不必修改,自動(dòng)升級。

二.編程與綜合練習(xí)題

4.3構(gòu)造一個(gè)日期時(shí)間類(Timedate)數(shù)據(jù)成員包括年、月、日和時(shí)1分、秒,函數(shù)成員包

括設(shè)置日期時(shí)間和輸出時(shí)間,其中年、月請用枚舉類型,并完成測試。(包括用成員函

數(shù)和用普通函數(shù))

解:本題要求僅是定義類的練習(xí),并非實(shí)用的提供日期時(shí)間的程序。實(shí)用的日期時(shí)間程序見

附錄二的日期時(shí)間函數(shù)。

#include<iostream>

#include<iomanip>

usingnamespacestd;

enumYR{Y2000,Y2001,Y2002,Y2003,Y2004,Y2005};//

enumMT{Jan,Feb,Mar,Apr,MayJun,Jul,Aug,Sep,Oct,Nov,Dec};

classTimedate{

private:

YRyear;

MTmonth;

intdate;

inthh;

intmm;

intss;

public:

Timedate(){year=Y2000;month=Jan;date=1;hh=0;mm=0;ss=0;}

Timedate(YRa,MTb,intc){

year=a;

month=b;

date=c;

hh=12;mm=30;ss=0;

第四章類與對象習(xí)題6

)

voidgetdate(YR&,MT&,int&);〃使用引用一次取得3個(gè)數(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::gettime(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?"year/month/date:";

switch(year){

caseY2000:co

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論