C++程序设计(第二版吴乃陵)课后答案_第1页
C++程序设计(第二版吴乃陵)课后答案_第2页
C++程序设计(第二版吴乃陵)课后答案_第3页
C++程序设计(第二版吴乃陵)课后答案_第4页
C++程序设计(第二版吴乃陵)课后答案_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章基本控制结构程序设计习题

第二章基本控制结构程序设计习题

一.基本概念与基础知识自测题

3.1程序阅读题

3.1.1设有说明:

inta=3,b=100;

下面的循环语句执行次,执行后a、b的值分别为(2)、(3)°

while(b/a>5){i

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

elseb/=a;

}解答:本题检查学生整除的概

念。跟踪:

abb/a循环次数b-a

310033197

410025296

510020395

1510061385

1610061484

171005停

(1)14

(2)17

(3)100

3.1.2设有说明:

intn,x,k,y;

下面程序段的功能是备选答案中的(1),当n=10,x=10打印结果是一(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

第二章基本控制结构程序设计习题2

解答:

第一个循环使x成为:3;y成为:1+—:第一个循环使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^^;

当num的值分别为1、2、3时,上面程序段的输出分别为(1)、⑵、⑶。解

答:

检查条件语句与字符串输出概念:

(1)Alpha

(2)Bata

(3)Gamma

3.1.4执行下面程序段后,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次循环后m=5k=l

第2次循环m=2k=2

第3次循环m=7k=3

第4次循环m=4k=4

第5次循环m=9k=5

第6次循环m=6k=6

第7次循环m=ll结束,k++未做

(1)11

(2)6

二.编程与综合练习题

3.2编程求一元二次方程ax2+bx+c=0的根。包括以下判断和结果:若输入a=0,给出提示;

第二章基本控制结构程序设计习题3

若△>(),输出两个不等实根;若△=(),输出两个相等实根;若△<(),输出两个复数根。

解:本题以一个绝对值极小的数作为实数0。

ttinclude<iostream.h>

#include<math.h>

#include<stdlib.h>

voidmain(){

doublea,b,c;

doubledelta,xl,x2;

constdoublezero=le-9;〃定义一个很小的常数

intsign;

cout*〃输入三个系数a(a!=0),b,c:"<<6ndl;

cin»a»b»c;

if(fabs(a)<zero){cout<〈〃二次项系数为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){〃绝对值很小

的数即被认为是0

cout«〃方程有两个相同实根:〃;

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<<”方程有两个不同实根:〃;

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

)

else{//delta<0cout<<〃方程无实根!有两个不同复数根:〃;

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

)

)

)

3.3设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,80-89分为4分,

70-79分为3分,60〜69分为2分,60分以下为1分。解:

10分一档用10进行整除获得,转换用开关语句实行。

第二章基本控制结构程序设计习题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«"输入错误!z/«endl;

)

)

3.4编程打印如下图形:

*****

**

***

***

***

解:难点在三角形左边的空格的控制,嵌套一个循环语句完成此任务。

第二章基本控制结构程序设计习题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<〈〃输入一个字母:〃;

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');

第二章基本控制结构程序设计习题6

cout<<endl;

}

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

解:通常求和作为外循环,阶乘作为内循环。这里考虑到:n!=n*(nT)!,利用递推法运算速

度大大提高,同时两者可合并为一个循环。本程序考虑了输入的健壮性。

#include<iostream.h>

#include<stdlib.h>

voidmain(){

intn;

doubleresult=0;"result是结果

cin»n;

if(n<l)

(

cout<<“输入错误!”<<endl;

//return;

exit(0);

}

result=l;

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

(

jch*=i;〃jch是i的阶乘,注意n!=n*(nT)!这样可少一层循环

result+=jch;

)

cout<<result<<endl;

)

3.7猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前

一天剩卜的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。

解:采用递推法。从最后一天逆推到第一天,9次循环。

#include<iostream.h>

constintday=10;

voidmain(){

inti,x=l;〃最后•天只有•个

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

x=(x+l)*2;

coutG〃开始共有桃子〃<<x<<〃个。\n〃;

}

3.8从键盘输入•组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中的个

数。解:将这组整数放在整型数组中,一边输入一边求和及统计正数和负数的个数,平均数

由和除以整数数量取得。

第二章基本控制结构程序设计习题7

#include<fstream.h>

#include<iostream.h>

voidmain(){

intstem[256],sum=O,pnum=0,nnum=0,i=0;cout<〈〃从键盘输

入一组非0整数,以输入0标志结束:〃<<endl;cin»stem[i];

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

和if(stem[i]>0)pnum++;〃止数数

量elsennum++;〃负数数量

i++;

cin>>stem[i];

)

if(!i)cout<<〃0个数"<<endl;

else{cout<<〃平均值="«(double)sum/(pnum+nnum)<<endl;〃平均值习惯不用整

数cout<<“iE数个数=〃<<pnum〈<endl;

cout<<"负数个数=,z<<nnuin<<endl;

)

)

3.9编程找出1~500之中满足除以3余2,除以5余3,除以7余2的整数。

解:中国古代数学问题(韩信点兵)采用穷举法。注意三个条件同时成立用&&。

#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之内的所有完全数。所谓完全数指的是一个数恰好等于它的所有因子和。

例如6=1+2+3,就是一个完全数。

解:采用穷举法。两重循环,外层是从1到999依次处理,内层是求该数的所有因子的和,并

判断是否等于该数。

#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

第二章基本控制结构程序设计习题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元张数,j是5元张数,k是1元张数

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利用反正切展开计算n的近似值,要求误差105,公式如下:

\5x7*

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

令x=l,可计算出兀/4的近似值。解:采用递推法。初看每一项的递推通式不易写出,但每一

项全看作奇数项,而偶数项全为零,则很容易写出:第1项为x,第3项为第1项乘以x的

平方除以项序号3乘以其余类推。同时和的误差小于最后一项的绝对值。

#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;

第二章基本控制结构程序设计习题9

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

xTO.si*x+CQSX)

〃’2xn-lOsinxn

解:迭代法也是用循环语句实现,数学上

#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是上次算出的结果,xl用作保存新算出的结果

n++;

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

if(n>le5)

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

elsecout<<"方程x*x+10*cos(x)=0的一个根为'z,«xl«endl;

cout<〈〃方程误差为:z/«xl*xl+10*cos(xl)«endl;

)

3.14两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、

N,经过抽签决定比赛配对名单。规定A不和J比赛,M不和D及E比赛。列出所有可能

的比赛名单。

解:这是一个组合问题,使用穷举法。共有5个位置,设甲队5名队员位置不变,乙队改变队

员位置,进行配对。注意第1个位置可在5个队员中任选一个,以后的位置必须扣除已选过

的队员。并扣除不能配对的情况,即得所有可能的比赛名单。

#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;

______________________________第二章基本控制结构程序设计习题______________________________]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之外的整数视为弃权票,-1为终止标志。打印各位候

选人的得票以及当选者(得票数超过选票总数一半)名单。

解:用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。

#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<<"当选"<<endl;

elsecout«endl;

break;

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

if(vote[cand]>k/2)cout<<,/当选;

第二章基本控制结构程序设计习题11

elsecout«endl;

break;

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

if(vote[cand]>k/2)cout<<〃当选〃<<endl;

elsecout«endl;

break;

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

if(vote[cand]>k/2)cout<<,?当选〃<<endl;

elsecout«endl;

break;

)

}

)

3.16改造【例3.11】将运行结果(Fibonacii数列的前20项)存入文件。

解:采用3步法。首先建立或打开一个输出文件,并与磁盘文件联系:

ofstreamofile(〃myfile3」6.txt");再按一定格式存入数据:

ofile〈<setw(15)<〈fib0<〈setw(15)<<fibl;等然后关闭文件:

ofile.closeO;如要读出数据,则用输入文件打开,并与同一磁盘文件

联系:

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

格式读入数据:ifile>>i>>j>>k»l;等,并输出最后关闭

文件: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个数据

fibO=fibl;fibl=fib2;

}ofile.close。;cout<<”是否要将文件输

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

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

ifstreamifile(〃myfile3_16.txt〃);

while(l){

由文件读入

第二章基本控制结构程序设计习题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】将运行结果(100以内素数)存入文件。

解:采用4步法©首先定义一个输出文件:ofstreamofile;再打开该文

件并与并与磁盘文件联系:ofile.open(〃myfile317.txt〃);按一定格式

把数据存入文件。最后关闭文件。效果与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;〃用数组保存整数ITOO

a[0]=0;〃1不是素数,置0

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

if(a[i]==0)continue;〃该数已经置0,判断下一个数

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

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

intcount=O;

-〃<<n<<〃之间的素数:"<<endl;

for(i=0;i<n;i++)〃输出所有素数

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

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

if(count%10~0)ofile<<endl;〃每彳j10个数据

}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])){〃不可用〉》,它不能读白字符,

第二章基本控制结构程序设计习题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个数

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

〃这里与例3.20不同,最后一个数据后面可能没有回车,直接为文件结束

}ifile.close();

cout<<endl;

}

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

解:文本文件读入要用成员函数:ifile.get。,而不可用插入运算符否则会丢失空白字

符。

#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++;//遇换行符行数+1

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

if(!isword)nword++;〃在单词的起始处给单词数+1

nch++;〃字符数加+1

isword=l;

}

elseisword=0;//读到间隔符

}while(ch!二EOF);〃读到文本结束符为止

ifile.closeO;cout<<“行数:

z/«nline<<endl;cout<<“单词数:

z,«nword<<endl;cout<<〃字符数:

,,«nch<<endl;

)

第二章基本控制结构程序设计习题14

第四章类与对象习题1

第四章类与对象习题

--基本概念与基础知识自测题

4.1填空题

5.1.1引入类定义的关键字是(1)。类的成员函数通常指定为(2),类的

数据成员通常指定为(3)。指定为(4)的类成员可以在类对象所在域

中的任何位置访问它们。通常用类的(5)成员表示类的属性,用类的⑹

成员表示类的操作。

答案:

(1)class

(2)公有的public

(3)私有■的private

(4)公有的public

(5)数据

(6)函数

4.1.2类的访问限定符包括(1)、⑵和⑶“私有数据通常由

(4)函数来访问(读和写)这些函数统称为(5)。

答案:

(1)public(公有的)

(2)private(私有的)

(3)protected(保护的)

(4)公有的成员函数

(5)类的接口

4.1.3通常在逻辑上,同一类的每个对象都有(1)代码区.用以存储成员函数。而

在物理上通常只有(2)代码区。只有在(3)定义.并⑷的

函数和加了关键字(5)的函数例外。

s

(1\

7独立的

(2X

/)共用的

(3\

/)

(在类说明中

4\

ZJ

(不包括循环等复杂结构

5)\

zinline

44

C++中支持三种域:⑴、⑵、⑶°函数域被包括在

(4)中.全局域被包括在(5)中。using指示符以关键字using开头,后面

是关键字(6),最后是(7)这样表示以后在该名字空间中所有成员都(8)

。如不使用using指示符则在使用时要加::,称为(9)运算符。答

案:

(1)局部域(localscope)

(2)名字空间域(namespacescope)

(3)类域(classscope)

(4)局部域

(5)名字空间域

(6)namespace

(7)名字空间名

第四章类与对象习题2

(8)可以直接被使用

(9)域

4.1.5引用通常用作函数的(1)和(2).对数组只能引用(3)不能引用(4)„答

案:

(1)参数

(2)返回值

(3)数组元素

(4)数组名本身

4.1.6构造函数的任务是(1),,构造函数无(2)。类中可以有(3)

个构造函数,它们由(4)区分。如果类说明中没有给出构造函数,则C++编译器

会⑸。拷贝构造函数的参数是(6),当程序没有给出复制构造函

数时,系统会自动提供(7)支持.这样的复制构造函数中每个类成员(8)

0

答案:

(1)初始化数据成员

(2)函数返回类型说明

(3)多

(4)不同的参数表

(5)自动给出一个默认的构造函数

(6)同一类对象的引用

(7)默认的的复制构造函,称为默认的按成员语义支持。

(8)被依次复制

4.1.7一个类有(1)个析构函数。⑵时.系统会自动调用析构函数。

答案:

(1)一

(2)对象注销时

4.1.8运算符重载时,其函数名由(1)构成。成员函数重载双目运算符时.左操作

数是⑵,右操作数是(3)。

”案:

1(1)关键字operator和该运算符

(2)对象

(3)该函数的参数

4.1.9面向过程的程序设计中程序模型描述为(1),面向对象程序设计的程序模型可描

述为⑵。

答案:

(1)“程序=算法+数据结构:'其数据与数据处理是分离的。

(2)程序=(对象+对象+……+对象)+消息;对象=(算法+数据结构)面向对象设计将数据

和对数据的操作方法放在一起,形成一个相对独立的整体一一对象(Object)并通过

简单的接口与外部联系。对象之间通过消息(Message)进行通讯。

4.2简答题

4.2.1简单解释什么是面向对象程序设计的封装性。

答:对象是一个封装体,在其中封装了该对象所具有的属性和操作。对象作为独立的基本单

元,实现了将数据和数据处理相结合的思想。此外,封装特性还体现在可以限制对象中数据

第四章类与对象习题3

和操作的访问权限,从而将属性“隐藏”在对象内部,对外只呈现一定的外部特性和功能。

封装性增加了对象的独立性,C++通过建立数据类型——类,来支持封装和数据隐藏。一

个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要知道

这个类是如何工作的,而只需要知道如何使用就行。另一方面,封装增加了数据的可靠性保护

类中的数据不被类以外的程序随意使用这两个优点十分有利于程序的调试和维护。

4.2.2C++编译器怎样对标识符进行解析?答:编译器对标识符的解析分两步,第一步查找在

声明中用到的标识符,特别是函数成员声明中用到的参数类型,第二步是函数成员体内的标

识符。

4.2.3为什么说类与对象的概念是客观世界的反映?答:客观世界的事物都具有某些属性

和行为(或操作)具有相同属性和行为的事物可以归属于一类,用分类的方法可以提高认识

事物的效率。C++中定义的类则是通过抽象的方法将某一类事物共有的静态特征(属性)和

动态特征(行为)概括出来并加以描述,而对象是类的具体实现,所以说类与对象的概念是

客观世界的反映。

4.2.4什么叫类域?为什么说类域是抽象的?答:类域是类体所包括的范围。每个类定义都

引入了一个独立的类域,在类域中说明的标识符仅在该类的类域中有效。由于类只是一个说

明,看上去有数据,有函数,有类型定义,但是它并非实体,不分配内存,当然也不能运行。

所以说类域是抽象的。

4.2.5引用作为函数参数时为什么能实现两个实参之间的数据交换?为什么对应实参不能

为引用?为什么返回值为引用的函数可以作为左值?答:引用变量是其关联变量的别名,

者在内存中占据同一个存储单元。在一个以引用作为参数的函数中,交换两个参数的值,实际

上就是交换两个实参的值。如果函数的参数是引用,调用时需要取得实参的地址,而实参如果

已经是一个地址,再进行引用将产生错误,故对应实参不能为引用。

函数返回引用实际是指明(返回)了相应的关联变量,所以声明返回值为引用的函数实

际上是将关联变量作为左值参与运算。

4.2.6什么是缺省的构造函数?缺省的构造函数最多可以有多少个?答:如果在类定义中不

显式地定义构造函数,C++编译器会自动产生一个缺省的构造函数,不过该函数不做具体的

初始化工作。只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都认为是缺

省的构造函数。缺省的构造函数只能有一个。

4.2.7拷贝构造函数用于哪三个方面?

答:

(1)用类的一个对象去初始化该类的另一个对象时使用,,

(2)当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。

(3)当函数的返回值是类对象,函数执行结束返回调用者时使用。

4.2.8写出含有对象成员的类的构造函数的格式,并做简单说明。答:C++中对含对象成员

的类对象的构造函数有固定的格式:类名::构造函数名(参数总表):对象成员1(参数名表1),

对象成员2(参数名表2).....对象成

第四章类与对象习题4

员n(参数名表n){........}

冒号后用逗号隔开的是要初始化的对象成员,附在后面的参数名表1,…,参数名表n依次为

调用相应对象成员所属的构造函数时的实参表这些表中的参数通常来自冒号前的参数总

表,但没有类型名。

4.2.9所有类对象未重载的赋值运算符“=”是怎样工作的?为什么它可以进行连续赋值?

答:对所有的类对象,未重教的赋值运算符“=”称作缺省的按成员拷贝赋值操作符,同类对

象之间可以用“=”直接拷贝。因为缺省的赋值操作返回一个对象的引用,所以它可以进行

连续赋值。

4.2.10为什么在友元函数的函数体内访问对象成员时,必须用对象名加运算符再加对象

成员名?答:友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运

算符加对象成员名。这一点和一般函数一样。

4.2.11重载复数运算符+时,采用下面友元函数声明:friendComplex

operator+(Complex&c1,Complex&c2);为什么不能用于“实数+

复数”?怎样改进才能适用?为什么?

答:使用引用类型变量作为运算符重载函数的参数,身为左值的实数类型实参不能被转换为

复数,编译时无法通过。添加const说明,使实数到复数的转换隐式地在一份拷贝上进行,则

可以实现“实数+复数”运算“修改后的说明为:

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

4.2.12类的静态数据成员与函数中的静态成员有何异同?答类的静态成员为其所有对象共

享,不管有多少对象,静态成员只有一份存于公用内存中,为该类所有对象公用。函数中的静

态变量也位于公用内存中,不随函数调用而重新分配,所以总是保留上次进入并执行该函数

后留下的信息。

4.2.13C++中结构、联合与类三者间有何异同?

答:在C++中结构(structure)与类儿乎是完全一样的类型,差别仅仅在于缺省情况下结构的

成员为公有的。联合(union)是C++的导出数据类型,在语法与功能上类似于结构,二者

的区别是:结构变量的各成员同时被分配了各自独立的内存区,向联合变量的各个成员的存

储开始地址都相同,所以在任一时刻联合变量只能存储一个成员。

4.2.14对象的第一特征是封装,那么由对象组成的面向对象的程序怎样建立各对象之间的

有效联系?面向对象程序的组织与面向过程有什么不同?答因为对象的操作主要用来响应

外来消息并为其他对象提供服务,所以面向对象的程序利用消息传递机制来建立各对象之间

的有效联系,协调各对象的运行。一个对象可以向其他对象发送消息以请求服务,也可以响应

其他对象传来的消息,完成自身固有的某些操作,从而服务于其他对象。

面向过程的程序是模块化的,模块的组织具有分层结构特点,层与层之间是调用关系。

面向对象程序是由一个个封装的对象组成,而对象是由紧密结合在一起的算法和数据结构组

成。对象之间是相互请求和相互协作的关系。

第四章类与对象习题5

4.2.15简叙Windows卜应用程序的运行方式。

答:Windows系统支持多个应用程序同时执行,在界面形式上,它支持多个窗口同时活动。它

的运彳亍机制是“消息传递禾口事件驱动(messagebasedandeventdriven)'

Windows系统使用事件驱动的编程模式。所谓事件的含义非常广泛。输入设备的动作,如

敲打键盘、按鼠标等会产生一系列的事件(注意不是一个事件)操作系统所作的一举一动也

被当作某种类型的事件,应用程序也会产生各种事件。事件用来标识发生的某件事情。

Windows系统对于应用程序环境中发生的每一个事件都会以对应的某种消息的形式标

识,并放入相应的Windows建立的消息队列中,然后由对应的应用程序或窗口函数去处理。窗

口函数处理是分层的,前面处理不了的送到后面,最后处理不了剩下的全由缺省的窗口函数处

理。

4.2.16类的成员函数在什么情况下应该定义为私有的?这样做的目的是什么?答除接口函

数和创建本类对象的构造函数和撤消该对象的析构函数外。其余成员函数应该定义为私有的,

这是开发类时故意对外隐蔽起来的操作而这些往往是最复杂最关键的部分。类中故意的隐藏

也为以后的升级扩展留下了余地,只要接口不变,内部再变,也不必修改原来的程序,就象MFC

(微软基础类)升级后,由MFC底层类所编的程序完全不必修改,自动升级。

二.编程与综合练习题

4.3构造一个日期时间类(Timedate)数据成员包括年、月、日和时1分、秒,函数成员包

括设置日期时间和输出时间,其中年、月请用枚举类型,并完成测试。(包括用成员函

数和用普通函数)

解:本题要求仅是定义类的练习,并非实用的提供日期时间的程序。实用的日期时间程序见

附录二的日期时间函数。

#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;

第四章类与对象习题6

)

voidgetdate(YR&,MT&,int&);〃使用引用一次取得3个数值

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(){〃成员函数,直接访问私有的数据成员

cout«"year/month/date:";

switch(year){

caseY2000:co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论