![C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第1頁](http://file4.renrendoc.com/view2/M02/33/3A/wKhkFmYpq9CAJMoFAAECRmc0yUo996.jpg)
![C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第2頁](http://file4.renrendoc.com/view2/M02/33/3A/wKhkFmYpq9CAJMoFAAECRmc0yUo9962.jpg)
![C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第3頁](http://file4.renrendoc.com/view2/M02/33/3A/wKhkFmYpq9CAJMoFAAECRmc0yUo9963.jpg)
![C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第4頁](http://file4.renrendoc.com/view2/M02/33/3A/wKhkFmYpq9CAJMoFAAECRmc0yUo9964.jpg)
![C++程序設(shè)計(jì)(第二版吳乃陵)課后答案_第5頁](http://file4.renrendoc.com/view2/M02/33/3A/wKhkFmYpq9CAJMoFAAECRmc0yUo9965.jpg)
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年別墅建設(shè)合同范例
- 2025年農(nóng)村道路安全改善工程合同
- 2025年企業(yè)食堂經(jīng)營承包合同
- 2025年二手車交易雙方性權(quán)益保障協(xié)議書
- 2025年醫(yī)療康復(fù)人才交流策劃協(xié)議
- 2025年交通供電檢測裝備項(xiàng)目申請報(bào)告
- 2025年二手房產(chǎn)交易合同額外補(bǔ)充協(xié)議
- 2025年海洋臺(tái)站儀器項(xiàng)目提案報(bào)告
- 2025年度學(xué)生權(quán)益保障協(xié)議書
- 2025年太陽能熱電站交易合同模板
- 有限空間作業(yè)審批表
- 內(nèi)地居民前往香港或者澳門定居申請表
- (完整版)園藝產(chǎn)品貯藏與加工
- 學(xué)前教育大專畢業(yè)論文3000字
- 骨骼肌-人體解剖學(xué)-運(yùn)動(dòng)系統(tǒng)
- 高中體育與健康-足球踢墻式“二過一”戰(zhàn)術(shù)教學(xué)課件設(shè)計(jì)
- 兒童財(cái)商養(yǎng)成教育講座PPT
- 前庭性偏頭痛診斷
- 三下《動(dòng)物的一生》教材解讀
- 神木市孫家岔鎮(zhèn)神能乾安煤礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 那些活了很久很久的樹
評論
0/150
提交評論