C++面向对象程序设计课后题答案.docx
《C++面向对象程序设计课后题答案.docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计课后题答案.docx(57页珍藏版)》请在冰豆网上搜索。
![C++面向对象程序设计课后题答案.docx](https://file1.bdocx.com/fileroot1/2023-1/11/350f1711-e32d-4d88-9772-ba660284424b/350f1711-e32d-4d88-9772-ba660284424b1.gif)
C+面向对象程序设计课后题答案面向对象程序设计课后题答案面向对象程序设计课后题答案第二章C+概述【2.6】D【2.7】D【2.8】A【2.9】A【2.10】B【2.11】A【2.12】C【2.13】B【2.14】D【2.15】C【2.16】D【2.17】C【2.18】程序的运行结果:
101【2.19】程序的运行结果:
1010【2.20】程序的运行结果:
1020【2.22】编写一个C+风格的程序,用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中。
#includeintmain()int*p,i;p=newint20;p0=1;p1=1;for(i=2;i20;i+)pi=pi-1+pi-2;for(i=0;i20;i+)coutpiendl;return0;【2.23】编写一个C+风格的程序,建立一个被称为sroot()的函数,返回其参数的二次方根。
重载sroot()3次,让它返回整数、长整数与双精度数的二次方根。
#include#includedoublesroot(intm)returnsqrt(m);doublesroot(longm)returnsqrt(m);doublesroot(doublem)returnsqrt(m);intmain()coutsroot(145)=sroot(145)endl;coutsroot(123456)=sroot(123456)endl;coutsroot(1.44)=sroot(1.44)endl;return0;【2.24】编写一个C+风格的程序,解决百钱问题:
将一元人民币兑换成1、2、5分的硬币,有多少种换法?
#includeintmain()intk=0;for(inti=0;i=20;i+)for(intj=0;j=0)k+;cout将一元人民币兑换成1、2、5分的硬币,共有k种换法endl;return0;【2.25】编写一个C+风格的程序,输入两个整数,将它们按由小到大的顺序输出。
要求使用变量的引用。
voidchange(int&a,int&b)intt=a;a=b;b=t;intmain()intm,n;coutmn;if(mn)change(m,n);cout这两个数从小到大依次为:
mnendl;return0;【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;return0;第三章类和对象【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)/类外定义成员函数需加类名:
,改为:
voidStudent:
setSno(ints)sno=s;voidsetAge(inta)/类外定义成员函数需加类名:
,改为:
voidStudent:
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+;voidcounter:
decrement()value-;intcounter:
getvalue()returnvalue;intcounter:
print()coutnvalueis:
valueendl;return0;voidmain()counterop(10);op.print();op.decrement();op.print();op.increment();op.print();【3.31】根据注释语句的提示,实现类Date的成员函数。
#includeusingnamespacestd;classDatepublic:
voidprintDate();/显示日期voidsetDay(intd);/设置日的值voidsetMonth(intm);/设置月的值voidsetYear(inty);/设置年的值private:
intday,month,year;voidDate:
printDate()coutyear/month/dayendl;voidDate:
setDay(intd)day=d;voidDate:
setMonth(intm)month=m;voidDate:
setYear(inty)year=y;intmain()DatetestDay;testDay.setDay(5);testDay.setMonth(10);testDay.setYear(2003);testDay.printDate();return0;【3.32】建立类cylinder,cylinder的构造函数被传递了两个double值,分别表示圆柱体的半径和高度。
用类cylinder计算圆柱体的体积,并存储在一个double变量中。
在类cylinder中包含一个成员函数vol(),用来显示每个cylinder对象的体积。
#includeusingnamespacestd;constdoublePI=3.1415926;classCylinderdoubleradius,height,volume;public:
Cylinder(doubler,doubleh)radius=r;height=h;volume=PI*radius*radius*height;voidvol()coutthevolumeisvolumeendl;intmain()Cylinderc(2,5);c.vol();return0;【3.33】构建一个类book,其中含有两个私有数据成员qu和price,建立一个有5个元素的数组对象,将qu初始化为15,将price初始化为qu的10倍。
显示每个对象的qu*price值。
【3.34】修改上题,通过对象指针访问对象数组,使程序以相反的顺序显示对象数组的qu*price值。
#includeusingnamespacestd;classBookprivate:
intqu,price;public:
Book(inti);voidprint();voidprintqandp();Book:
Book(inti)qu=i;price=qu*10;voidBook:
print()couttheBooksquis:
quendl;couttheBookspriceis:
priceendl;voidBook:
printqandp()couttheBooksqu*priceis:
qu*priceendl;voidmain()Booka5=1,2,3,4,5;inti;for(i=0;i5;i+)ai.print();Book*b=&a4;/逆序显示数组元素for(i=0;iprintqandp();b-;Book*c=a;/顺序显示数组元素for(i=0;iprintqandp();c+;/或者classBookprivate:
intqu,price;public:
Book(intq,intp);voidprint();voidprintqandp();Book:
Book(intq,intp)qu=q;price=p;voidBook:
print()couttheBooksquis:
quendl;couttheBookspriceis:
priceendl;voidBook:
printqandp()couttheBooksqu*priceis:
qu*priceendl;voidmain()Booka5=Book(1,10),Book(2,20),Book(3,30),Book(4,40),Book(5,50);inti;for(i=0;i5;i+)ai.print();Book*b=&a4;/逆序显示数组元素for(i=0;iprintqandp();b-;Book*c=a;/顺序显示数组元素for(i=0;iprintqandp();c+;【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();private:
charstockcode16;intquan;floatprice;Stock:
Stock(charna,intq,doublep)strcpy(stockcode,na);quan=q;price=p;Stock:
print()coutstocknode:
stockcodequan:
quan;coutprice:
priceendl;voidmain()Stocka(600001,3000,5.67);Stockb(600001);a.print();b.print();【3.36】编写一个程序,已有若干学生的数据,包括学号、姓名、成绩,要求输出这些学生的数据并计算出学生人数和平均成绩(要求将学生人数和总成绩用静态数据成员表示)。
#include#includeusingnamespacestd;classStudentstringname;stringsno;doublescore;staticintnum;staticdoublesum;public:
Student(stringn,stringno,doubles);voidprint();staticdoublegetAverage();staticdoublegettotal();staticintgetnum();intStudent:
num=0;doubleStudent:
sum=0;Student:
Student(stringn,stringno,doubles)name=n;sno=no;score=s;num+;sum+=s;voidStudent:
print()cout学生的学号为:
sno,姓名为:
name,成绩为:
scoreendl;intStudent:
getnum()returnnum;doubleStudent:
getAverage()if(num=0)return0;elsereturnsum/num;doubleStudent:
gettotal()returnsum;intmain()cout当前学生人数为:
Student:
getnum()学生的总成绩为:
Student:
gettotal()学生的平均成绩为:
Student:
getAverage()endl;Students1(12012,张明,80);s1.print();cout当前学生人数为:
s1.getnum()学生的总成绩为:
s1.gettotal()学生的平均成绩为:
s1.getAverage()endl;Students2(09615,李涛,50);s2.print();cout当前学生人数为:
s2.getnum()学生的总成绩为:
s2.gettotal()学生的平均成绩为:
s2.getAverage()endl;Students3(12016,王晓,90);s3.print();cout当前学生人数为:
s3.getnum()学生的总成绩为:
s3.gettotal()学生的平均成绩为:
s3.getAverage()endl;return0;第四章派生类与继承【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(或任意两个字符间)与所对应的数字的对照表。
#includeusingnamespacestd;#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);protected:
char*c;voidder_table:
print(void)coutcendl;table:
ascii();voidmain()der_tableob(a,z,ASCIIvalue-char);ob.print();ob.print();【4.20】#includeusingnamespacestd;classarea_clprotected:
doubleheight;doublewidth;public:
area_cl(doubler,doubles)height=r;width=s;virtualdoublearea()=0;classrectangle:
publicarea_clpublic:
rectangle(inth,intw):
area_cl(h,w)doublearea()returnheight*width;classisosceles:
publicarea_clpublic:
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;p=&i;cout三角形的面积为:
area()endl;return0;【4.21】已有类Time和Date,要求设计一个派生类Birthtime,它继承类Time和Date,并且增加一个数据成员Childname用于表示小孩的名字,同事设计主程序显示一个小孩的出生时间和名字。
#include#includeusingnamespacestd;classTimepublic:
Time(inth,intm,ints)hours=h;minutes=m;seconds=s;voiddisplay()cout出生时间:
hours时minutes分seconds秒endl;protected:
inthours,minutes,seconds;classDatepublic:
Date(intm,intd,inty)month=m;day=d;year=y;virtualvoiddisplay()cout出生年月year年month月day日endl;protected:
intmonth,day,year;classBirthtime:
publicTime,publicDateprivate:
stringChildname;public:
Birthtime(stringname,inty,intmon,intd,inth,intm,ints):
Date(mon,d,y),Time(h,m,s)Childname=name;voiddisplay()cout小孩的姓名为:
Childnamen;Date:
display();Time:
display();intmain()Birthtimemary(Mary,2013,1,1,13,25,40);mary.display();Birthtimejack(Jackson,2000,11,11,23,55,10);jack.display();return0;【4.22】编写一个学生和教师的数据输入和显示程序。
学生数据有编号、姓名、系别和成绩,教师数据有编号、姓名、职称和部门。
要求将编号、姓名、输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。
#include#includeusingnamespacestd;classPersonstrin