C++面向对象程序设计课后题答案Word文档格式.docx
《C++面向对象程序设计课后题答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计课后题答案Word文档格式.docx(57页珍藏版)》请在冰豆网上搜索。
![C++面向对象程序设计课后题答案Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/11/350f1711-e32d-4d88-9772-ba660284424b/350f1711-e32d-4d88-9772-ba660284424b1.gif)
intmain()intm,n;
coutmn;
if(mn)change(m,n);
cout这两个数从小到大依次为:
mnendl;
【2.26】编写一个C+风格的程序,用二分法求解f(x)=0的根。
假设方程为:
2*x*x*x-4*x*x+3*x-6=0#include#includeusingnamespacestd;
doublef(doublex)return2*x*x*x-4*x*x+3*x-6;
intmain()doubleleft,right,middle,ymid,yleft,yright;
coutleftright;
yleft=f(left);
yright=f(right);
if(yleft*yright0)cout您输入的两个数,用二分法无法求得方程的根endl;
exit(0);
domiddle=(left+right)/2;
ymid=f(middle);
if(yleft*ymid0)right=middle;
yright=ymid;
if(yright*ymid=1e-6);
cout方程的根为:
middleendl;
第三章类和对象【3.6】假设在程序中已经声明了类point,并建立了其对象p1和p4。
请回答以下几个语句有什么区别?
(1)pointp2,p3;
(2)pointp2=p1;
(3)pointp2(p1);
(4)p4=p1;
【解答】语句
(1)使用带默认参数的构造函数,或不带参数的构造函数,定义了point类的两个对象p2,p3;
语句
(2)在建立新对象p2时,用已经存在的对象p1去初始化新对象p2,在这个过程中用“赋值法”调用了拷贝构造函数;
语句(3)在建立新对象p2时,用已经存在的对象p1去初始化新对象p2,在这个过程中用“带入法”调用了拷贝构造函数;
【3.7】B【3.8】C【3.9】C【3.10】B【3.11】B【3.12】A【3.13】A【3.14】B【3.15】A【3.16】B【3.17】B【3.18】写出下面程序的运行结果。
10,2030,4850,6870,8090,1611,120【3.19】写出下面程序的运行结果。
Constructing10Destructing100Destructing【3.20】写出下面程序的运行结果。
3objectsinexistence4objectsinexistenceafterallocation3objectsinexistenceafterdelection【3.21】写出下面程序的运行结果。
Countingat0Countingat1Countingat2Countingat3Countingat4Countingat5Countingat6Countingat7Countingat8Countingat9【3.22】写出下面程序的运行结果。
Defaultconstructorcalled.Defaultconstructorcalled.Defaultconstructorcalled.Constructor:
a=1,b=2Constructor:
a=3,b=4Constructor:
a=5,b=6【3.23】写出下面程序的运行结果。
Con.Copycon.default.【3.24】写出下面程序的运行结果。
A=5B=14A=9B=14【3.25】写出下面程序的运行结果。
5,722,25【3.26】写出下面程序的运行结果。
ConstructingConstructingA=5B=15DestructingA=10B=15DestructingDestructingDestructing【3.27】指出下列程序中的错误,并说明为什么。
classStudentcharname10;
intage;
floataver;
voidprintStu();
voidmain()Studentp1,p2,p3;
p1.age=30;
/Error:
age为私有成员,不能在类外直接访问【3.28】指出下列程序中的错误,并说明为什么。
classStudentintage;
intsno;
public:
/*在成员函数定义前加public,不然默认为private,则在主函数中不能调用私有的成员函数*/voidprintStu();
voidsetSno(intd);
voidsetAge(inta);
/添加成员函数的声明;
voidprintStu()/类外定义成员函数需加类名:
,改为:
voidStudent:
printStu()coutnStudentNo.issno,;
coutageisage.endl;
voidsetSno(ints)/类外定义成员函数需加类名:
setSno(ints)sno=s;
voidsetAge(inta)/类外定义成员函数需加类名:
setAge(inta)age=a;
voidmain()Studentlin;
lin.setSno(20021);
lin.setAge(20);
lin.printStu();
【3.29】指出下列程序中的错误,并说明为什么。
classPointpublic:
intx,y;
private:
Point()/构造函数不能说明为private的x=1;
y=2;
voidmain()Pointcpoint;
cpoint.x=2;
构造函数Point是私有的,语句“Pointcopint;
”执行时出现错误。
错误的原因是:
类Point的构造函数是私有函数,创建对象cpoint时不能调用它。
【3.30】下面是一个计算器类的定义,请完成该类成员函数的实现。
#includeusingnamespacestd;
classCounterpublic:
Counter(intnumber);
voidincrement();
/给原值加1voiddecrement();
/给原值减1intgetValue();
/取得计数器值intprint();
/显示计数private:
intvalue;
counter:
counter(intnumber)value=number;
voidcounter:
increment()value+;
decrement()value-;
intcounter:
getvalue()returnvalue;
print()coutnvalueis:
valueendl;
voidmain()counterop(10);
op.print();
op.decrement();
op.increment();
【3.31】根据注释语句的提示,实现类Date的成员函数。
classDatepublic:
voidprintDate();
/显示日期voidsetDay(intd);
/设置日的值voidsetMonth(intm);
/设置月的值voidsetYear(inty);
/设置年的值private:
intday,month,year;
voidDate:
printDate()coutyear/month/dayendl;
setDay(intd)day=d;
setMonth(intm)month=m;
setYear(inty)year=y;
intmain()DatetestDay;
testDay.setDay(5);
testDay.setMonth(10);
testDay.setYear(2003);
testDay.printDate();
【3.32】建立类cylinder,cylinder的构造函数被传递了两个double值,分别表示圆柱体的半径和高度。
用类cylinder计算圆柱体的体积,并存储在一个double变量中。
在类cylinder中包含一个成员函数vol(),用来显示每个cylinder对象的体积。
constdoublePI=3.1415926;
classCylinderdoubleradius,height,volume;
Cylinder(doubler,doubleh)radius=r;
height=h;
volume=PI*radius*radius*height;
voidvol()coutthevolumeisvolumeendl;
intmain()Cylinderc(2,5);
c.vol();
【3.33】构建一个类book,其中含有两个私有数据成员qu和price,建立一个有5个元素的数组对象,将qu初始化为15,将price初始化为qu的10倍。
显示每个对象的qu*price值。
【3.34】修改上题,通过对象指针访问对象数组,使程序以相反的顺序显示对象数组的qu*price值。
classBookprivate:
intqu,price;
Book(inti);
voidprint();
voidprintqandp();
Book:
Book(inti)qu=i;
price=qu*10;
voidBook:
print()couttheBooksquis:
quendl;
couttheBookspriceis:
priceendl;
printqandp()couttheBooksqu*priceis:
qu*priceendl;
voidmain()Booka5=1,2,3,4,5;
inti;
i5;
i+)ai.print();
Book*b=&
a4;
/逆序显示数组元素for(i=0;
iprintqandp();
b-;
Book*c=a;
/顺序显示数组元素for(i=0;
c+;
/或者classBookprivate:
Book(intq,intp);
Book(intq,intp)qu=q;
price=p;
voidmain()Booka5=Book(1,10),Book(2,20),Book(3,30),Book(4,40),Book(5,50);
【3.35】构建一个类Stock,含字符数组stockcode及整型数据成员quan、双精度型数据成员price。
构造函数含3个参数:
字符数组na及q、p。
当定义Stock的类对象时,将对象的第一个字符串参数赋给数据成员stockcode,第2个和第3个参数分别赋给quan和price。
未设置第2个和第3个参数时,quan的值为1000,price的值为8.98。
成员函数print()没有形参,需使用this指针,显示对象数据成员的内容。
假设类Stock第1个对象的三个参数为:
“600001”、3000和5.67,第2个对象的第1个数据成员的值是“600001”,第2和第3个数据成员的值取默认值。
要求编写程序分别显示这两个对象数据成员的值。
#include#includeusingnamespacestd;
classStockpublic:
Stock(charna,intq=1000,doublep=8.98);
print();
charstockcode16;
intquan;
floatprice;
Stock:
Stock(charna,intq,doublep)strcpy(stockcode,na);
quan=q;
print()coutstocknode:
stockcodequan:
quan;
coutprice:
voidmain()Stocka(600001,3000,5.67);
Stockb(600001);
a.print();
b.print();
【3.36】编写一个程序,已有若干学生的数据,包括学号、姓名、成绩,要求输出这些学生的数据并计算出学生人数和平均成绩(要求将学生人数和总成绩用静态数据成员表示)。
classStudentstringname;
stringsno;
doublescore;
staticintnum;
staticdoublesum;
Student(stringn,stringno,doubles);
staticdoublegetAverage();
staticdoublegettotal();
staticintgetnum();
intStudent:
num=0;
doubleStudent:
sum=0;
Student:
Student(stringn,stringno,doubles)name=n;
sno=no;
score=s;
num+;
sum+=s;
print()cout学生的学号为:
sno,姓名为:
name,成绩为:
scoreendl;
getnum()returnnum;
getAverage()if(num=0)return0;
elsereturnsum/num;
gettotal()returnsum;
intmain()cout当前学生人数为:
getnum()学生的总成绩为:
gettotal()学生的平均成绩为:
getAverage()endl;
Students1(12012,张明,80);
s1.print();
cout当前学生人数为:
s1.getnum()学生的总成绩为:
s1.gettotal()学生的平均成绩为:
s1.getAverage()endl;
Students2(09615,李涛,50);
s2.print();
s2.getnum()学生的总成绩为:
s2.gettotal()学生的平均成绩为:
s2.getAverage()endl;
Students3(12016,王晓,90);
s3.print();
s3.getnum()学生的总成绩为:
s3.gettotal()学生的平均成绩为:
s3.getAverage()endl;
第四章派生类与继承【4.8】A【4.9】C【4.10】C【4.11】B【4.12】程序运行结果:
ConstructorB2ConstructorB1ConstructorA321【4.13】程序运行结果:
主食=bread副食=steak【4.14】程序运行结果:
0,0,00,1,03,6,9【4.15】程序运行结果:
ConstructorB2.2ConstructorB1.1ConstructorB3.3ConstructorA.4124,3【4.16】程序运行结果:
4【4.17】程序运行结果:
(1,2)5,6(6,9)
【4.18】程序运行结果:
classbase1classbase2classlevel2classbase2classlevel1classtoplevel【4.19】下面的程序可以输出ASCII字符与所对应的数字的对照表。
修改下列程序,使其可以输出字母a到z(或任意两个字符间)与所对应的数字的对照表。
#includeclasstablepublic:
table(intp,intq)i=p;
j=q;
voidascii(void);
protected:
inti,j;
voidtable:
ascii(void)intk=1;
intm;
for(m=i;
m=j;
m+)coutsetw(4)m(char)m;
if(k%12=0)coutn;
k+;
coutendl;
classder_table:
publictablepublic:
der_table(intp,intq,char*m):
table(p,q)c=m;
voidprint(void);
char*c;
voidder_table:
print(void)coutcendl;
table:
ascii();
voidmain()der_tableob(a,z,ASCIIvalue-char);
ob.print();
【4.20】#includeusingnamespacestd;
classarea_clprotected:
doubleheight;
doublewidth;
area_cl(doubler,doubles)height=r;
width=s;
virtualdoublearea()=0;
classrectangle:
publicarea_clpublic:
rectangle(inth,intw):
area_cl(h,w)doublearea()returnheight*width;
classisosceles:
isosceles(inth,intw):
area_cl(h,w)doublearea()return0.5*height*width;
intmain()rectangler(10,5);
isoscelesi(4,6);
area_cl*p;
p=&
r;
cout矩形的面积为:
area()endl;
i;
cout三角形的面积为:
【4.21】已有类Time和Date,要求设计一个派生类Birthtime,它继承类Time和Date,并且增加一个数据成员Childname用于表示小孩的名字,同事设计主程序显示一个小孩的出生时间和名字。
classTimepublic:
Time(inth,intm,ints)hours=h;
minutes=m;
seconds=s;
voiddisplay()cout出生时间:
hours时minutes分seconds秒endl;
inthours,minutes,seconds;
Date(intm,intd,inty)month=m;
day=d;
year=y;
virtualvoiddisplay()cout出生年月year年month月day日endl;
intmonth,day,year;
classBirthtime:
publicTime,publicDateprivate:
stringChildname;
Birthtime(stringname,inty,intmon,intd,inth,intm,ints):
Date(mon,d,y),Time(h,m,s)Childname=name;
voiddisplay()cout小孩的姓名为:
Childnamen;
Date:
display();
Time:
intmain()Birthtimemary(Mary,2013,1,1,13,25,40);
mary.display();
Birthtimejack(Jackson,2000,11,11,23,55,10);
jack.display();
【4.22】编写一个学生和教师的数据输入和显示程序。
学生数据有编号、姓名、系别和成绩,教师数据有编号、姓名、职称和部门。
要求将编号、姓名、输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。
classPersonstrin