2023年面向对象程序设计离线作业答案.pdf
浙江大学远程教育学院 面向对象程序设计课程作业答案第 2 章 2.3 测试 下面的注释(它在C+风格的单行注释中套入了类似于C 的注释)是否有效。/th i s is a st r an g e/way t o do a c o mme n t*/答:有效2.4 以下这个简短的C+程序不也许编译通过,为什么?#includ e us i n g n a mes p ace s t d;int main()int a,b,c;c o u t a b;c=s u m(a,b);c o u t Msum is:n c;re t urn 0;sum(int a,int b)r e tu r n a+b;答:不能潼sum使用前必须声明 2.5 回答 问题。(1)以下两个函数原型是否等价:flo a t fu n(i nt a,f 1 o a t b,c ha r*c);float fun(int,float,char*);等价(2)以下两个函数的第一行是否等价:flo a t f un(i n t a,flo a t b,charfloat fun(in t,f 1 oat,c h a r*)o答:等价 2.6 下列 语句中错误的是(DA.int*p=new int(1 0);C.i n t*p=n e w int;2.7 假设已有定义const c h a语句中对的的是(D)。A.name 3-ar;C.name=new cha r 5;2.8 假设已有定义 c h a r *对的的是(A )oA.n a me 3-qC.name=n e w e h ar5;2.9 假设已有定义“c o nst char*误的是(A)oA.n a me 3=q;C.name=ne w ch a r 5;c););B.int*p=new in t 10;D.int*p=n ew in t 40(0);r*cons t n ame二 chen;”下面的B.name二“1 in”;D.c o u t n a me3;cons t n a me二 chen;”下面的语句中B.nam e=H 1 in”;D.nam e=new ch a r(q);n am e 二 chen ;”下面的语句中错B.n a m e 1 i nn;D.n ame=n e w ch a rC q);【2.1 0】重载函数在调用时选择的依据中,(B )是错误的。A.函数名字 B.函数的返回类型C.参数个数 D.参数的类型 2.1 1在(A)情况下适宜采用内联函数。A.函数代码小,频繁调用 B.函数代码多,频繁调用C.函数体具有递归语句 D.函数体具有循环语句 2.1 2 下列描述中,(C)是错误的。A.内联函数重要解决程序的运营效率问题B.内联函数的定义必须出现在内联函数第一次被调用之前C.内联函数中可以涉及各种语句D.对内联函数不可以进行异常接口声明 2.1 3在 C+中,关于下列设立默认参数值的描述中,(B )是对的的。A.不允许设立默认参数值B.在指定了默认值的参数右边,不能出现没有指定默认值的参数C.只能在函数的定义性声明中指定参数的默认值D.设立默认参数值时,必须所有都设立 2.14下面的类型声明中对的是(D )0A.i n t&a 4 ;B.i n t&*p ;C.i n t&q;D.i n t i,*p=&i;2.1 5 下面有关重载函数的说法中对的的是(C )oA.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表D.重载函数名可以不同 2.1 6 关于n e w运算符的下列描述中,(D )是错误的。A,它可以用来动态创建对象和对象数组B.使用它创建的对象或对象数组可以使用运算符d el et e删除C.使用它创建对象时要调用构造函数D.使用它创建对象数组时必须指定初始值 2,1 7 关于de 1 e te 运算符的下列描述中,(C)是错误的。A.它必须用于new返回的指针B.使用它删除对象时要调用析构函数C.对一个指针可以使用多次该运算符D.指针名前只有一对方括号符号,不管所删除数组的维数2.1 8 写出下列程序的运营结果。#includeu sing nam e s p ace std;i n t i=1 5;int m a i n()i n t i;i=100;:i=i+l;c out::i en d 1;r etur n 0;)答:1012.19 写出下列程序的运营结果。#i n c lu d e u sing n a mesp ace std;v oid f(i n t&m,i n t n)i nt temp;t em p=m;m=n;n=t e mp;int m a i n()i nt a=5,b=10;f(a,b);cout a H Mben d 1 ;retu r n 0;答:10 102.2 0 分析下面程序的输出结果。#i n c Iudeu sing n a mes p ac e s t d;int&f(int&i)i+=10;r e t u r n i;)i nt main()in t k=0;int&m=f(k);c o utkendl;m=20;c outk e ndl;return 0;)答:1020 2.2 1 举例 说明可以使用c o n s t 替代#d ef i n e以消除#d ef i n e的不安全性。答:例如#i n c l u d e#d e f i n e A 2+4W d ef i n e B A*3v oi d ma i n ()(c o u t B e n d l;)上面程序的运营结果是1 4而不是1 8 藉但很容易被认为是1 8。用 c。n s t 替代#d e f i n e 就能得到对的结果幕从而消除了#d ef i n e的不安全性。#i n c 1 u d e c on s t A=2 +4;con s t B=A*3;v oi d ma i n ()co u t B en d 1 ;)运营结果为1 8。2.22编写一个C+风格的程序,用动态分派空间的方法计算Fi b on a cci数列的前2 0 项,并存储到动态分派的空间中。#i n c 1 u d eu s i n g n a m espa ce st d;i n t ma i n ()i n t i;i n t *p;p=n e w i n t 2 0 ;P o=o;cou t*pV *(p+l);f o r(i=2 ;i 2 0;i +)(p i =p i 2 +p i-1 ;c ou t *(p+i)”;)d el e t e p;ret u r n 0 ;)2.23编写 一个C+风格的程序,建立一个被称为sroot ()的函数,返回其参数的二次方根。重载s root ()3次,让它返回整数、长整数与双精度数的二次方根(计算二次方根时,可以使用标准库函数s qrt()0#i n c lu d e#i n clu d e i n t sroot (i n t x)(r e t u rn(i n t)sqr t (x);f loa tsroot (f 1 oa t x)r et u r n(f loa t )s q r t(x);d ou b les roo t(d o u b 1 ex)r e t u rn(d ou b le)sqrt(x);v oi dm a i n()t esti n ti4;i n tr e s u It lsr o o t (i );f loa tJ4.0;fl o atr e s u 1tJ=s r o o t (j)d ou b le k4.0 0 0 0;d ou b leresu 1 t Ks r oot (k);2.24编写一个C+风格的程序,解决百钱问题:将一元人民币兑换成1、2、5分的硬币,有多少种换法?#i n elu d e u s i n g n a m e s p a ce st d;i n t m a i n ()i n t i,j,k;i n t su m=0;f or(i=0;i =1 0 0;i +)f or(j=0;j =50;j+)f or(k=0;k=2 0;k+)(i f (i*1 +2*j+5*k=1 0 0)s u m+;)c ou t。总数为 s um e nd 1;2.25 编写一个C+风格的程序,输入两个整数,将它们按由小到大的顺序输出。规定使用变量的引用。#i n clu d e u s i n g n a m e sp a c e s t d ;v o i d sw a p(i n t&x,i n t&y)(i n t t emp=x;x=y;y =t emp;)i n t ma i n ()i n t a,b;c i n a b;i f(a b)sw a p(a ,b);c o u t a p u b lic、pr o te c t e d 可以按任意顺序出现D.没有用p riva t e、pu b 1 i c、p rotected定义的数据成员是公有成员3.9 在下面有关析构函数特性的描述中,对的的是(C )。A.一个类中可以定义多个析构函数B.析构函数名与类名完全相同C.析构函数不能指定返回类型D.析构函数可以有一个或多个参数3.1 0 构造函数是在(B)时被执行的。A.程序编译 B.创建对象C.创建类 D.程序装人内存 3.11 在下面有关静态成员函数的描述中,对的的是(B )。A.在静态成员函数中可以使用th is 指针B.在建立对象前,就可认为静态数据成员赋值C.静态成员函数在类外定义时,要用s t a t i c 前缀D.静态成员函数只能在类外定义3.1 2 在下面有关友元函数的描述中,对的的说法是(AA.友元函数是独立于当前类的外部函数B.一个友元函数不能同时定义为两个类的友元函数C.友元函数必须在类的外部定义D.在外部定义友元函数时,必须加关键字f r ie n d3.1 3 友元的作用之一是(A)。A.提高程序的运营效率 B.加强类的封装性C.实现数据的隐藏性 D.增长成员函数的种类3.1 4 以下程序运营的结果是(B)0#i n cl u d e usin g n amespa c e std;c 1 ass Bp u b 1 ic:B()B(int i,i nt j)x=i;y=J;woid p r intb()co u t x n,y e n d 1;)pri v a te:“n t x,y;);c 1 ass Ap ubli c:A()A(i n t I,in t j);v oid p rinta();private:。B c;);A::A(int i,int j):c(i,j)voidA:printa()c.pr i ntb();)int main()A a(7,8);a.pr i n t a();return 0;)A.8,9 B.7,8 C.5,6 D.9,103,1 5 以下程序的运营结果是(A)o#i n c 1 udeus i ng n a m e s p ace s t d;c 1 a s s Apublic:v o id s e t(i n t i,int j)x=i;y=j;in t get_y()r et u m y;)p r iv a te:3 i nt x,y;);c l a s s boxpublic:v oid s et(i nt l,int w,int s,in t p)。leng t h=l;b w idt h=w;1 abe 1 .set(s,p);int get_a r ea()re t urn 1 e n g t h*wid t h;e)p r ivate:。int 1 e ngth,wid t h;A label;);in t mai n()b o x b;b.s e t(4,6,1,2 0);cou t b.ge t _a r e a()e ndl;retur n 0;A.2 4B.4C.2 0D.6.1 6 以下程序的运营结果是(B)。#i n cludeu s ing namespa c e s t d;class S amp 1 e(p u b lie:Sam p le(int i,i nt j)x=i;6 y=j;)voi d d isp()c out”d i s plen d 1 ;0 void d i s p()c o nst3 c o utd i sp2nend 1 ;e)p r i v a t e:i nt x,y;;int main()c o nst S a mpl e a(1,2);a.d i s p();return 0;A.disp 1 B.d i sp2C.d i spl d isp2D.程序编译犯错 3.1 7 以下程序的运营结果是(B )。#includeu sin g names p a c e std;cl a s s R(p u b lie:0 R(int rl,i nt r2)o Rl=rl;o R2=r2;)o voi d p ri n t();void print()const;p r iva t e:int RI,R2;;v o id R:p r int()c o u t R lM,H R 2 e n d l;)void R:p r i nt()c o n stco u t R 1 n R2e n d 1 ;)in t main()R a(6,8);const R b(56,8 8);b.p ri n t();re t u m 0;A.6,8 B.56,88 C.0,3.1 8 写出下面程序的运营结果。#includeu sing nam e s p ac e s td;cl a ss toy p u b lie:toy(i n t q,i n t p)quan=q;P r ice=p;。i n t get_ q ua n()。return q u an;0 o int g et_ p ric e()o return p r i c e;)pri v ate:int qu a n,p r i ce;);int main()to y op3 2=toy(10,2 0),t o y(30,48),o t oy(5 0,68),toy(7 0,80),toy(90,l 6),t oy(11,120),D.8,6;for(inti=0;i 3;i+)co u top i 0.g e t_ quan(),;c o u t opi0.g e t_pr i c e()n;cou t op i 1.g e t_ q uan()co u t o p il.g e t_ pric e()n;coutend 1 ;re tu rn 0;)1 0,2030,4 85 0,6870,8 090,161 1,120 3.1 9 写出下面程序的运营结果。#in c lu d eusing nam e spa c e s t d;c 1 a ss ex a mpl e p u blic:exam p 1 e(i n t n)i=n;c o u tC o n s t r u c ti n gn;)e x amp 1 e()coutDest r u cting n;Ant get_i()。retur n i;)pr i v ate:int i;);int s q r_i t(e x a mple o)retu r n o.geti()*o.g et_i();)int ma i n()example x(1 0);cout x.g e ti()endl;co u t s qrjt(x)e nd 1 ;retu r n 0;)101 00Destr u c tingDestruc t i n g3.2 0 写出下面程序的运营结果。#includeusin g n a mespace std;clas s aClass p ub 1 ic:。a C las s()t o t a 1+;a Cl a ss()。t otal-;)Nnt g e ttotal()r et u m to t a 1 ;private:sta t ic i nt t ota 1 ;i nt aC 1 a ss::to t al=0;i nt main()a Cl a s s ol,o2,o3;coutol.gettotal()n o b j e cts in e xis t encen,r;aClass*p;p=new aClass;if(!p)co u t n Allo catio n er r o r nn;return 1;)cou t o 1 .g e 11 otal();cou t ob j e c ts in existen c e a fte r a llo cationn;delete p;c o u t ol.ge t t o t a 1 ();c o u tnobj e cts i n e xistence a f ter de 1 etion n;return 0;3obje c t s in existenc e4 o bj e cts in existence afte r ai l ocation3object s in existence aft e r d elet i on.2 1 写出下面程序的运营结果。#i nclu d eusing namesp ace s t d;cl a s s t est p u bl i c:。te s t();t e s t();p riva t e:Ant i;test:te s t()i=25;for(int ct r=0;ctr10;ctr+)c o u t H Coun t i ng a t c tr n)test anObject;int m a in()r e t ur n 0;C o unt i ng a tOCountin g a 11Counting at2Co u n t ing at3Co u n t i n g a t 4Co u nting a t 5Co u nt i ng a t 6C ounti n g a t 7Cou n tin g a t 8Counti n g at9 3.2 2 写出 下面程序的运营结果。#i n cludeu s in g n am e sp a c e std;cl a ss Aint a,b;p u blic:3 A()e a=0;ob=0;cou t MDe f aul t cons t rue to r calle d An)A(int i,in t j)“a=i;b=j;co u t Constr u ctor:a=a,b=b end 1 ;int m a i n()A a3;Ab3=A(l,2),A(3,4),A(5,6);re t u m 0;)De f ault c o ns t ru c t or cal 1 e d.De f a u It construe t or call e d.Default cons t ru e t o r c a 1 led.Co n struct o r:a=l,b=2Co n st r u c to r:a=3,b=4Construe t o r:a=5,b=63.2 3 写出下面程序的运营结果。#in c ludeusing names p ac e s t d;c lass Te s tpr i v a t e:s i nt va 1 ;p u blic:。Test()coutn d efault.n e ndl;T e s t(i n t n)val=n;c ou t vC o n.H en d l;。Te s t(con s t Test&t)e val=t.va 1 ;3 coutnCopy con.n e ndl;0);in t m a i n()Test tl(6);Tes t t2=t 1;Test t3;t3=tl;r e t urn 0;)Con.Copy con.D e f a u 1 t.3.2 4 写出下面程序的运营结果。#i nc 1 u deusing namespa c e s t d;c l a s s N private:。i nt A;。static int B;pub 1 ic:N(i n t a)A=a;B+=a;stati c void fl(N m););voidN::fl(N m)c o utA=m.A e n d 1;co u t B=using namespace s t d;class M int x,y;public:M()x=y=0;)M(int i,intj)(x=i;y=j;vo i d cop y(M*m);v oid s e t x y(in t i,in t j)x=i;y=j;vo i d p r i n t()c o utxx;y=m-y;)v o id f un(M m 1,M*m 2)m 1 .setx y(1 2,15);m2-s e tx y(22,2 5);)i nt m a in()M p(5,7),q;q.c opy(&p);fun(p,&q);p,print();q.p r in t();r e turn 0;)5,72 2,2 5 3.2 6 写出下面程序的运营结果。#incl u deu s ing n a m espace std;c las s Mint A;s ta t i c in t B;pu b lie:M(in t a)“A=a;B+=a;cout C on struc t in g n e n d 1;6static void f 1(M m);oM()c o utDestruct i ng n;0);v o id M:f 1(M m)cout A=u m.A e ndl;c outV B=B e ndl;int M:B=O;int ma i n()Mp(5),Q(1 0);M:fl(p);M:fl(Q);return 0;)Const r ucti n gCons t ruct i ngA=5B=1 5D e structingA=1 0B=1 5De s tructi n gDes t ructingD e s t r uc t i ng.27 指出下列程序中的错误,并说明为什么。#in c 1 u deu sin g n ame s pa c e s td;cla s s S t udentpublic:3 v oid p r in t St u();p r i vate:o c har name 10;int ag e;afloat a ver;int m a i n()Stud e n t p 1,p2,p3;pl.a g e=30;ret u r n 0;age 为p riv a te不能付值3.28 指出下列程序中的错误,并说明为什么。#i n cl u d e using nam e s p ace st d;class S tud e n t int sno;“nt ag e;s v o id p r in t S tu();void se t Sno(in t d););vo i d prin t St u();c o u t n nS no issnon,”;co u tage i s a g e .n endl;)v o i d se t Sno(int s)s n o=s;vo i d setA g e(int a)a g e=a;)i n t m a in()S tu d e n t lin;lin.s e t S no(2023 1);lin.s e t A g e(2 0);lin.printSt u();class S tuden t f 不存在一个 叫 s etA g e的方式 3.2 9 指出下列程序中的错误,并说明为什么。#in c lu d eu s ing n amespac e s td;clas s P o intp u blic:int x,y;pr i v ate:e P ion t()x=l;y=2;。);int main()P o int cpoint;c p oi n t.x=2;ret u r n 0;构筑函数错误3.3 0 下面是一个计算器类的定义,请完毕该类成员函数的实现。class counterpubl i c:coun t e r (int n u mber);voi d inc r e ment();v o i d de c r em e n t();“nt g e t v alu e();o in t p r in t();p riv a te:给原值加1/给原值减1/取得计数器值/显示计数Ant value;);cou n t er:co u n ter(i nt numbe r)value=numb e r;)void c ount e r::i n c rem e n t(i nt n)value+=n;)v o i d c o unter::decrement()v a luei nt co u nter:ge t value()ret u r n value;)void c oun t er:p r i n t()p rintf(n%d n n,g e tva 1 ue();i n t ma i n()i n t a,b;scanf(M%d%d H,&a,&b);counte r ct(a);c t.incremen t(b);c t.decrement。;c t.p rint();return 0;3.3 1 根据 注释语句的提醒,实现类D ate的成员函数。#i nc 1 ud e u sin g n a m e space std;clas s Da t ep u b 1 i c:o voi d pr i n t D at e();s void setDay(i n t d);3 vo i d s e tMo n th(int m);。void setYea r(int y);pri v ate:int day,mon t h,y e a r;显示日期/设立日的值/设立月的值/设立年的值i nt D ate::s e t y e ar(in t y)y e ar=y;r e turn year;int Da t e:setm o nth(i n t m)mont h=m;return month;i nt D a t e::s e td a y(i n t d)day=d;re t u rn day;)V o idD a te:printdate()couty e a r,.,monthn.,day e n d 1;);i nt main()D ate testDay;t e s t D a y.se t Day(5);testDay.s e t Month(l 0);t e st D ay.set Y ea r(20 2 3);testDa y.p r in t Dat e();r e turn 0;3.3 2 建立类cy 1 in d e r,c y lin d e r的构造函数被传递了两个d o uble值,分别表达圆柱体的半径和高度。用 类 cylinder计算圆柱体的体积,并存储在一个d o u b le 变量中。在类c ylinder中包含一个成员函数v o l,用来显示每个c v l i n d e r对象的体积。#i n c l u d e u s i n g n a m e s p a c e s t d;#d e f i n e P I 3.1 4 1 5 9c l a s s C y l i n d e rp u bl i c :C y l i n d e r (d o u b 1 e r a d i u s,d o u b 1 e h e i g h t ):r a d i u s (r a d i u s ),he i g ht (h e i g ht),v o l u m e (PI *r a d i u s *r a d i u s *h e i g h t )(t o t a l _ v o 1 +=v o l u m e;)d o u b 1 e v o l ()c o n s t;f r i end v o i d g e t Pa r a s (d o u b 1 e&r a d i u s,d o u bl e&he i g ht,d o u bl e&v o l,d o u bl e&t o t a l _ v o 1 ,c o n s t C y l i n d e r&o bj);p r i v a t e:d o u bl e r a d i u s;/r a d i u s d o u bl e he i g ht;/he i g ht d o ub l e v o l u m e ;/v o 1 u m e o f c u r r e n t o b j e c ts t a t i c d o u bl e total_vol;/t o t a l v o l u m e);d o u bl e C y l i n d e r:t o t a l _ v o l =0;d o u b l e C y l i n d e r:v o 1 ()c o n s tr e t u r n t hi s v o 1 u m e;)voi d g e t Paras(do u b 1 e&r ad i us,do u bl e&h e i ght,double&vol,d o uble&total_v o 1,c onst C y lin d er&obj)/g et pr iv a te membe r of C y 1 i n d e r r a d i u s =o b j.radi u s;h e i gh t=o bj.h e ig h t;vol=o bj.vol u me;total_ v ol=obj.total_v o 1;int mainOd o u b le rd=0,hg=0,v o 1 =0,t otal_ v o l=0;C ylin d er cl d _ 1 (2,3.5),c 1 d _2(5.2,7),cld_3(3.9,4.0);/3 o bj e cts g etPa r a s(r d,hg,vol,total_vol,cl d _ 3);c o u t ”C y 1 i n der 3:n e n d 1 ;c out,zradi u s:H rd e n d l;c o u h eig h t Vh g en d l;cout,z v olume:/?v o 1 e ndl;co u t,?T o t a 1 Vol u me:n t o t a 1 _ v olendl;sys t em(pau s e);r e tu r n 0;)3.3 3 构建一个类bo o k,其中具有两个私有数据成员q u 和 pri c e,将 qu初始化为1 5,将 price初始化为qu的 1 0 倍,建立一个有5 个元素的数组对象。显示每个对象数组元素的q u*p rice值。#inc 1 u d e class bo o ki n t qu,price;p u b 1 i c:bo o k(i n t q )(q u =q;p r i c e=1 0*q;)i n t g e t _q u()r e t u r n q u;i n t g e t _ p r i c e ()r e t u r n p r i c e;;v o i d m a i n ()bo o k o bj 5 =1,2,3,4,5 ;f o r(i n t i=0;i 5;i+)c o u t 数 组 对 象 的 q u*p r i c e 值 为:X o bj i .g e t _ q u()*o bj i .g e t _ p r i c e ()e n d 1;3.3 4 修改 习 题 3.33,通过对象指针访问对象数组,使程序以相反的顺序显示每个对象数组元素的q u *p r i c e 值。i n c l u d e c 1 a s s b o o k(i n t q u,p r i c e;p u bl i c :bo o k(i n t q )q u=q ;p r i c e=1 0*q;)i n t g e t _ q u ()r e t u r n q u;i n t g e t p r i c e()r e t u r n p r i c e;);v o i d m a i n ()(b o o k o b j 5 =1,2,3,4,5);bo o k *p ;p=&o bj 4 ;f o r (i n t i=0;i 5;i +)c o u t g e t_ q u ()*p-g e t _p r i c e ()e n d l;P ;)3.35构建一个类St o c k,含字符数组s t o c k c o d e 及整型数据成员q ua n、双精度型数据成员p r i c e。构造函数含3 个参数:字符数组n a 口及 q、P。当定义St o c k的类对象时,将对象的第1 个字符串参数赋给数据成员s t o c k c o d e,第 2 和第3个参数分别赋给q u a n、pr i c e。未设立第2和第3 个参数时,q u a n 的值为1 0 0 0,p r i c e的值为8.9 8O成员函数p r i n t 没有形参,需使用t h i s指针,显示对象数据成员的内容。假设类St o c k 第 1 个对象的三个参数分别为:“6 0 0 0 0 1 ”,3 0 0 0和5.6 7,第2个对象的第1个数据成员的值是“6 0 0 0 0 1”,第2和第3个数据成员的值取默认值。规定编写程序分别显示这两个对象数据成员的值。Si n c l u d e /c o n s t u n s i g n e d MA X _ L E N =2 5 6;class S t o c k p u b l i c:/这里用的初始化形参列表S tock(c h a r n a ,i n t q=1000,d o u b l e p =8.98):s t oc k c o d e (n a),q u a n(q),p r i c e (p)void print(v o i d)(s t d:c o u t s t o c k c o d e z/q u a n p r i c e s t d :e n d 1;)p r i v a t e:c h a r *s t o c k c o d e ;/或改为 char s t o c k c o d e M AX_ L EN;/其中 M A X_ L E N 定义在前为一常量:c o n s t u n s i g n e dM AX_ L E N =2 56;i n t q u a n;d o u b l e p r i c e;/m a i n f u n c t i o n i n t m a i n (i n t a r g c ,char*a r g v 口)c h a r s z Te s t S t r i n g =60 0 0 0 1;/I t s t e r m i n a t e d w i t h0i n t i Te s t I n t e g e r =3000;d o u b 1 e d Te s t Do u b l e =5.67;St o c k s t Ob