C++程序设计基础课后答案--第五章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

5.1阅读下列程序,写出执行结果1.#includeiostream.hstructdata{intn;floatscore;};voidmain(){dataa[3]={1001,87,1002,72,1003,90},*p=a;cout(p++)-nendl;cout(p++)-nendl;coutp-n++endl;cout(*p).n++endl;}2.#includeiostream.hstructemployee{charname[20];charsex;};voidfun(employee*p){if((*p).sex=='m')cout(*p).nameendl;}voidmain(){employeeemp[5]={Liming,'m',Wangxiaoping,'f',Luwei,'m'};inti;for(i=0;i3;i++)fun(emp+i);}3.#includeiostream.hstructnode{char*s;node*q;};voidmain(){nodea[]={{Mary,a+1},{Jack,a+2},{Jim,a}};node*p=a;coutp-sendl;coutp-q-sendl;coutp-q-q-sendl;coutp-q-q-q-sendl;}4.#includeiostream.hclassA{public:intf1();intf2();voidsetx(intm){x=m;coutxendl;}voidsety(intn){y=n;coutyendl;}intgetx(){returnx;}intgety(){returny;}private:intx,y;};intA::f1(){returnx+y;}intA::f2(){returnx-y;}voidmain(){Aa;a.setx(10);a.sety(5);couta.getx()'\t'a.gety()endl;couta.f1()'\t'a.f2()endl;}5.#includeiostream.hclassT{public:T(intx,inty){a=x;b=y;cout调用构造函数1.endl;couta'\t'bendl;}T(T&d){cout调用构造函数2.endl;coutd.a'\t'd.bendl;}~T(){cout调用析构函数.endl;}intadd(intx,inty=10){returnx+y;}private:inta,b;};voidmain(){Td1(4,8);Td2(d1);coutd2.add(10)endl;}6.#includeiostream.hclassT{public:T(intx){a=x;b+=x;};staticvoiddisplay(Tc){couta=c.a'\t'b=c.bendl;}private:inta;staticintb;};intT::b=5;voidmain(){TA(3),B(5);T::display(A);T::display(B);}7.#includeiostream.h#includemath.hclasspoint{public:point(floatx,floaty){a=x;b=y;?cout点(a,b);}frienddoubled(point&A,point&B){returnsqrt((A.a-B.a)*(A.a-B.a)+(A.b-B.b)*(A.b-B.b));}private:doublea,b;};voidmain(){pointp1(2,3);cout到;pointp2(4,5);cout的距离是:d(p1,p2)endl;}8.#includeiostream.hclassA{public:A(){a=5;}voidprinta(){coutA:a=aendl;}private:inta;friendclassB;};classB{public:voiddisplay1(At){t.a++;coutdisplay1:a=t.aendl;};voiddisplay2(At){t.a--;coutdisplay2:a=t.aendl;};};voidmain(){Aobj1;Bobj2;obj1.printa();obj2.display1(obj1);obj2.display2(obj1);obj1.printa();}5.2思考题1.结构和类有什么区别?如果把程序中定义结构的关键字struct直接改成class,会有什么问题?用教材上的一个例程试一试,想一想做什么修改能使程序正确运行?2.分析以下说明结构的语句structnode{intdata;nodeerror;//错误node*ok;//正确};error和ok分别属于什么数据类型?有什么存储要求?error出错的原因是什么?3.有说明classA{inta;doublex;public:funMember();};Aa1,a2,a3;编译器为对象a1,a2,a3开辟了什么内存空间?它们有各自的funMember函数的副本吗?C++通过什么机制调用类的成员函数?4.C++提供了默认版本的构造函数,为什么还需要用户自定义构造函数?编写一个验证程序,说明自定义构造函数的必要性。5.试从定义方式、访问方式、存储性质和作用域分析类的一般数据成员和静态数据成员的区别,并编写一个简单程序验证之。6.试从定义方式、调用方式分析静态成员函数和友员函数的区别。考察教材的例5-22,若classGoods的指针域Goods*next;被声明为私有(private)成员,程序会出现什么错误?做什么最小修改能使程序正确运行?请你试一试。1.分析以下说明结构的语句structNode{intdata;Nodeerror;//错误Node*ok;//正确};error和ok分别属于什么数据类型?有什么存储要求?error出错的原因是什么?【答案】error是Node结构类型数据成员,错误。原因是结构定义的数据成员若为本身的结构类型,是一种无穷递归。ok是指向Node类型的指针,定义正确,占4字节。2.本章例5-5中用辅助数组对结构数组做关键字排序,有定义person*index[100];index数组存放结构数组元素的地址。如果把index定义改为intindex[100];用于存放结构数组元素的下标。可以实现对结构数组的索引排序吗?如何修改程序?请你试一试。【答案】可以。关键是通过整型索引数组元素作为下标访问结构数组。表示为:all[pi[i]].nameall[pi[i]].idall[pi[i]].salary有关程序如下:#includeiostreamusingnamespacestd;structperson//说明结构类型{charname[10];unsignedintid;doublesalary;};voidInput(person[],constint);voidSort(person[],int[],constint);voidOutput(constperson[],int[],constint);intmain(){personallone[100];//说明结构数组intindex[100];//说明索引数组inttotal;for(inti=0;i100;i++)//索引数组元素值初始化为结构数组元素下标index[i]=i;cout输入职工人数:;cintotal;cout输入职工信息:\n;Input(allone,total);cout以工资做关键字排序\n;Sort(allone,index,total);cout输出排序后信息:\n;Output(allone,index,total);}voidInput(personall[],constintn){inti;for(i=0;in;i++)//输入数据{couti:姓名:;cinall[i].name;cout编号:;cinall[i].id;cout工资:;cinall[i].salary;}}voidSort(personall[],intpi[],constintn){inti,j;intt;//交换用中间变量for(i=1;in;i++)//以成员salary做关键字排序{for(j=0;j=n-1-i;j++)if(all[pi[j]].salaryall[pi[j+1]].salary)//通过索引数组访问结构数组元素{t=pi[j];//交换索引数组元素值pi[j]=pi[j+1];pi[j+1]=t;}}}voidOutput(constpersonall[],intpi[],constintn){for(inti=0;in;i++)//输出排序后数据coutall[pi[i]].name'\t'all[pi[i]].id'\t'all[pi[i]].salaryendl;}3.有以下结构说明和遍历单向链表的函数。函数内有错误吗?是什么性质的错误?请上机验证你的分析。structNode{intdata;Node*next;};voidShowList(Node*head){while(head){couthead-date'\n';head++;}}【答案】head++错误,原因是动态链表的结点存放不是连续顺序的内存空间,它们是逐个结点通过new建立的,所以不能用++做地址偏移运算。应该用:head=head-next4.结构和类有什么区别?如果把程序中定义结构的关键字struct直接改成class,会有什么问题?用教材上的一个例程试一试,想一想做什么修改能使程序正确运行?【答案】结构是数据的封装,类是数据和操作的封装。可以把结构看成是类的特例。结构和类都可以用关键字struct或class定义。区别是,struct定义的结构或类的全部成员都是公有的,用class定义的结构或类不做声明的成员是私有的。若把struct改成class,只需要把全部成员定义为public就可以了。5.有说明classA{inta;doublex;public:funMember();};Aa1,a2,a3;编译器为对象a1、a2和a3开辟了什么内存空间?它们有各自的funMember函数的副本吗?C++通过什么机制调用类的成员函数?【答案】开辟的存储空间有a1.a,a1.x,a2.a,a2.x,a3.a,a3.x。各对象没有funMember函数的副本,C++通过this指针调用成员函数。6.C++提供了默认版本的构造函数,为什么还需要用户自定义构造函数?编写一个验证程序,说明自定义构造函数的必要性。【答案】类的默认构造函数可以建立基本类型数据成员的存储空间。基于以下两个原因,需要用户定义构造函数:(1)对数据成员的值做指定初始化;(2)类的数据是由指针管理的堆。程序略。7.试从定义方式、访问方式、存储性质和作用域分析类的一般数据成员和静态数据成员的区别,并编写一个简单程序验证它。定义方式访问方式存储性质作用域一般数据成员类中定义对象.数据成员局部数据由访问属性public,protected,private决定静态数据成员类中声明,类外定义对象.数据成员类::数据成员全局数据程序略。8.试从定义方式、调用方式分析常成员函数、静态成员函数和友员函数的区别。考察教材的例5-22,若classGoods的指针域Goo

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功