• 365.00 KB
  • 2022-04-22 11:51:21 发布

《C++语言与面向对象的设计》习题及参考解答.doc

  • 54页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'C++语言与面向对象的设计第1至13章习题参考答案习题1参考答案1用最简练的语言解释下列词汇在面向对象程序设计中的含义:对象,类,方法,接口,消息,封装,继承,服务答:对象是客观世界中的实体在计算机中的表示。是一组数据成员和方法成员的封装体。是类类型的实例。类是一种抽象数据类型。是一组对象共性的描述。方法是在一个类中定义的过程或函数,实现类的功能的代码。接口是对象封装体向外部公布的一组具有公有属性的方法。是从对象外部与对象通信的唯一途径。消息是对象之间的通信机制,对象的客户通过接口方法调用请求对象服务称为消息调用。对象之间通过消息传递,互相协调、配合,共同实现软件系统的整体设计目标。消息的载体是对象提供的公有方法,即对象的接口。封装有以下两重含义:首先,是指将描述客观实体数据特征的数据和方法特征的代码组织在一起,作为一个整体,并为该整体命名标识,以区别于其它数据和程序代码。其次,通过对该整体内成员的访问属性的规定,使一部分成员的隐藏起来,对于封装体外成为不可见的,同时使另一部分成员对外开放,作为与外部交流的接口。继承是面向对象程序设计方法中描述的两个类之间一种增量包含关系。这两个类具有一种父子关系,子类通过为父类添加新的成员而创建。继承提供了利用一个类的代码创建新类的重用方法。继承关系也是对客观世界分类层次关系的一种模拟。服务即对象通过公有方法向外部提供功能。1.2试列举过程化、模块化、结构化等程序设计方法的主要特点。面向对象程序设计是如何包容和吸收其它几种程序设计方法的有用成分的。答:过程化程序设计方法以过程或函数作为程序的基本构造单位。侧重于算法表达和过程间参数传递的组织。模块化程序设计方法以独立编译的源程序模块作为大型应用程序的基本组织单位。注重于应用程序的开发管理。包括系统开发的任务分解、模块间通信管理、可重用代码库的组织、由不同语言生成的目标模块的连接等方面。结构化等程序设计方法以单入口单出口的可嵌套基本控制结构作为程序构造单位。提倡自顶向下的分析和自底向上的设计相结合的软件系统构造方法。重点关注程序结构清晰,以获得程序的可理解性和可维护性。面向对象程序设计方法包容了以上三种方法的所有积极成分。对象中包含的方法实际上就是过程或函数,方法的参数传递与过程或函数的传递都是利用堆栈进行的。在方法的实现时仍然用单入口单出口的基本控制结构编程。系统构造仍然使用自顶向下的分析和自底向上的设计过程。并用模块化方法管理整个系统的开发,整个软件系统由若干独立编译的源程序文件组成。面向对象方法对于以前程序设计方法的质的跃变在于将中算法与数据结构的多对多依赖变成了相互间的单一依赖关系。1.3面向对象程序设计方法成功地取代其它程序设计方法在程序设计领域的主导地位有哪些根本原因?答:面向对象程序设计方法成功地取代其它程序设计方法的主要原因是(1)计算机软硬件技术的超高速发展,促进了计算机应用领域的迅速扩展,带来了大规模复杂系统的开发需求。(2)程序设计方法研究中不断提高的数据抽象技术为复杂系统的开发带来了更有效、更能自然表示问题世界的系统构造模型。(3)硬件设备的性能提高,足以支付新方法的存储空间冗余和时间开销的代价。1.4有人说对象是一个“黑盒子”,应该怎样看待这种说法?答:对象是一个“黑盒子”,这种说法是一个很贴切的比喻。所谓“黑盒子”54 ,是指从用户的观点来看一个器件或产品时,并不关心其内部构造和原理,而只关心它的功能及如何使用这些功能。对象的封装性使对象的属性及功能的具体实现代码对于对象的客户是不可见的。客户只能通过接口方法使用对象功能。1.5试分析“对象与其所属的应用程序”和“对象与其所属的类”这两种关系的区别。答:对象与其所属的应用程序的关系是个别和整体的关系,对象与其所属的类的关系是具体实例和它所对应的抽象概念的关系,二者不可混为一谈。1.6试归纳总结子程序、过程、函数、方法、对象接口等概念的共同点及各自的特点。答:它们都是实现程序功能的代码块。子程序相对主程序而言,过程则关注本身的整体性。有时过程也特指无返回值的子程序。函数是有返回值的子程序,而且函数与数学中的函数概念一致,函数返回值与输入参数是“一一对应”或“一多对应”关系。函数的返回值与子程序的输出参数的概念是有区别的,一个函数只能有一个返回值而一个子程序可能有多个输出参数。方法特指对象封装体中的过程或函数。对象接口是对象的公有方法。1.7在一个医院里有医务人员、管理人员、后勤人员、临时工等人员。医务人员又分为医生、护士、化验员、药剂师。医生又有内科、外科、五官科、神经科之分。管理人员又分属为行政管理、设备管理、药品管理、财务管理等部门。请用面向对象的观点对上述信息进行分析,指出哪些是类,哪些是对象,并说明类与类之间存在的继承关系。若要根据上面的简要描述设计计算机医院人事管理系统,请画图表示上述人事关系。答:题目中提到的都是类,没有一个是类的实例,所以没有一个是对象。其中医务人员是基类,医生、护士、化验员、药剂师是它的四个子类,而内科医生、外科医生、五官科医生、神经科医生又是医生的子类。另外管理人员是行政管理人员、设备管理人员、药品管理人员、财务管理人员等子类的基类。习题2参考答案2.1C++与C语言的关系如何?它们的本质区别是什么?答:C++由C语言继承而来,并在C语言的基础上增加了对面向对象程序设计的支持,是传统的结构化程序设计方法和面向对象程序设计方法的结合。C++保留了C语言的全部精华、与C语言兼容,又比C语言更适宜于管理大型、复杂的程序。二者的本质区别是:C是面向过程的语言,而C++是面向对象的语言。C是战术语言,而C++是战略语言。2.2以下单词哪些是C++合法的标识符?54 publicarray[I]x3.53rdget_nameπnum1_sothi!x-ywhat?_for答:合法的标识符为:get_name、num1、_sot、_for。2.3保留字与一般标识符有什么不同?答:保留字又称关键字,是系统已预先定义的一些单词。这些单词虽然符合标识符的命名规则,但由于已经被C++语言预先赋予了特定的含义,因而不能被程序员用作一般的标识符来定义和使用。2.4文件包含命令的形式如何?有什么作用?答:文件包含命令的作用是让编译预处理器将指定文件的全部内容插入到当前源文件的该命令行处。它有两种形式:#include<文件名>和#include"文件名"。二者的区别在于,前者主要用于嵌入系统提供的头文件(一般存于C++系统所在目录的INCLUDE子目录下),后者主要用于嵌入用户自己定义的文件。对于前者,C++预处理器将在INCLUDE目录下搜索指定的头文件;对于后者,C++预处理器先在当前目录中搜索指定文件,若找不到再到INCLUDE目录下去搜索。2.5什么叫源程序?C++程序在计算机上是如何实现的?答:用C++等高级语言编写的程序称为源程序。源程序是不能被计算机直接识别和执行的。C++程序在计算机上的实现包括编辑、编译、连接、运行几个步骤。其中编辑是指将源程序由键盘输入并保存,得到源程序文件;编译是一个翻译过程,将C++源程序翻译成计算机能直接识别的机器语言程序,得到目标文件;连接程序把各个目标文件和要用到的库文件连接在一起,生成可执行文件,可执行文件是计算机能直接运行的文件。 2.6什么是空语句?它有什么作用?答:空语句是只有一个分号的语句。它主要用于语法上需要有一条语句但实际上又没有任何操作可执行的场合。2.7什么是C++中的块?主要用于什么地方?答:块即复合语句或称分程序,是括在一对花括号之间的语句序列,在语法上相当于一条单语句,凡是在单语句可用的地方都可以使用复合语句。复合语句主要用于语法上要求只能有一条语句,但又难以只用一条简单语句表达的情形,如循环语句的循环体等;或者用于形成局部化的封装体。2.8判断下列描述的对与错:(1)C++和C语言都是面向对象的语言。(2)一个C++源程序可以分别存放在几个源文件中。(3)C++对标识符内的英文字母是区分大、小写的。(4)预处理命令是在程序正常编译之后执行的。(5)一个源程序若通过编译、连接得到了exe文件,执行后就能得到正确的结果。(6)以下四种写法均是C++合法的注释语句:/**////**/*////*答:(1)错(2)对(3)对(4)错(5)错(6)错2.9分析下面程序的功能。若输入为9和4,写出程序的运行结果。#includevoidmain(){intn1,n2;cout<<"Pleaseentertwointegers:";cin>>n1>>n2;cout<<"("<>hours;seconds=hours*3600;cout<<"Thesecondis:"<>b1;54 (3)将b2的值加上b1的值,仍赋给b2;b2=b2+b1;(4)输出b1和b2的值;cout<<"b1="<voidmain(){constdoublepi(3.1415926),e(2.7182818);doubler=0.5;cout<<"(int)pi*r*r="<<(int)pi*r*r<=73)(2)(x!=y)||(c>"B")(3)z&&y||x>y(4)z||y&&x>y(5)200*x/y(6)double(x)/y+2354 (7)x/y+23(8)c+y%x(9)x*=int(b/a)+y(10)"c"–c==2||y%-x>0(11)++x<=y?x++:y++(12)*p*y(13)++x-y--54解答:(1)0(2)1(3)0(4)0(5)120(6)23.6(7)23(8)67(9)87(10)1(11)4(12)15(13)-14.4指出下列程序段中的错误并说明错误原因:54(1)floatlevel;cin>>level;switch(level){case1:cout<<"one";break;case1.5:cout<<"oneandahalf";break;case2:cout<<"two";break;default:;}(2)cin>>x>>y;ifx>ycout<0)cout<<"*";5454(4)下面程序段用于计算23除以5的余数:floatx=23,y=5,z;z=x%y; cout<<"23%5="<>n;switch(n){case1:x=x+10;case2:x=x-10;case3:x=x*2; default:; }54解答:(1)第一句和第六句错。switch后的表达式和case后的常量表达式只能是字符型、整型或枚举型,不能是浮点型。(2)第二句错。if后的表达式要加括号;句末应有分号。(3)死循环。(4)x、y、z应定义为整型(“%”的操作数应为整数)。(5)死循环。(6)各case子句中没有break语句,得到的结果与要求不一致。4.5分析下面的程序的循环次数并写出运行结果:54#includevoidmain(){intn=0,total=0;do{total=total+n;n++; }while(n++<20); cout<<"total="<voidmain(){inti=100,n=0; while(--i){if(i%5==0&&i%7==0){cout<voidmain(){intcount=0,a,b,c;for(inti=100;i<=999;i++){a=i/100;//a为百位数字b=(i–a*100)/10;//b为十位数字c=i–a*100–b*10;//c为个位数字if((a+b+c)%2==0){cout<voidmain(){floatx,f;cout<<"Pleaseenterx:";cin>>x;if(4voidmain(){longintn;intw;cout<<"Pleaseenteranumber:";cin>>n;w=1;while(n/=10)w++;cout<voidmain(){charch;54 intdight[10],other=0,i;for(i=0;i<=9;i++)dight[i]=0;cin>>ch;while(ch!="$"){if(ch>="0"&&ch<="9")dight[ch-"0"]++;elseother++;cin>>ch;}for(i=0;i<=9;i++)cout<voidmain(){inti,j;for(i=1;i<=4;i++){for(j=1;j<=5–i;j++)cout<<”“;for(j=1;j<=2*i-1;j++)cout<voidmain(){intn,sum=0,a=0;cout<<"Pleaseenteranumber:";cin>>n;for(inti=1;i<=n;i++){a=a+i;sum=sum+a;}cout<voidmain(){doublee=1,a=1;inti=1;do{a=a/i;e=e+a;i++;}while(a>=1e-6);cout<<"e="<voidmain(){inta[5]={34,256,87,46,90};intb[][3]={1,2,3,4,5,6,7,8,9};intx,y,z;x=a[2]+a[3];y=*a+*(a+4);z=b[1][2]+**b+**(b+1)+*(*(b+1)+1);cout<<"x="<voidmain(){charstr[]="Thereare3boys.";char*p=str;cout<voidmain(){constintn=5;inta[n][n],i,j;for(i=0;i<=n-1;i++){a[i][0]=1;a[i][i]=1;for(j=1;jvoidmain(){inta[10][10];for(inti=0;i<=9;i++){for(intj=0;j<=9;j++){a[i][j]=(i+j)%10;cout<voidmain(){constintn=10;doubledata[n];inti,k;cout<<"Pleaseenterthedata:";for(i=0;i<=n–1;i++)cin>>data[i];cout<<"Thepreviousarrayis:";for(i=0;i<=n–1;i++)cout<intcompare(floatt1,floatt2);voidmain(){floata[9],b[9];inti,n;n=0;cout<<"EnterA、BClass’sgrade:";for(i=0;i<9;i++)cin>>a[i]>>b[i];for(i=0;i<9;i++)if(compare(a[i],b[i])==1)n=n+1;if(n>5)cout<<"ClassAiswin!"<=t2)?1:0;}546.3下列程序企图对a、b两个数组进行整理,若a[i]voidswap(doublet1,doublet2){doublet;for(inti=1;i<10;i++)if(t1intseparate(double&f);voidmain(){inta;doubleb;cout<<"Enteradoubletypenumber:";cin>>b;a=separate(b);cout<<"Theinputnumberisdividedto"<intis_prime(longn){longk;k=sqrt(n);for(longi=2;i<=k;i++)if(n%i==0)return0;return1;}答案:#includevoidmain(){longn;cout<<"Pleaseinputaevennumber:";cin>>n;for(longi=4;i<=n;i+=2)for(longj=1;j<=i/2;j+=2)if(is_prime(j)&&is_prime(i-j)){cout<floatfact(intk);intCnm(intn,intm);voidmain(){intn,m,z;cout<<"Pleaseinputn,m:";cin>>n>>m;z=Cnm(n,m);cout<<"z="<intis_leap_year(inty);intfirst_day_of_year(inty);intdays_of_the_month(intm);intyear;voidmain(){intmonth,month_days,week_day,days_of_the_year;cout<<"Pleaseinputtheyear:";cin>>year;cout<<"Pleaseinputthemonth";cin>>month;cout<#includetypedefdouble(*Fp)(double);doubleintegrate(Fpfun,doublea,doubleb){doublen;cout<<”请输入积分区间划分个数:”;cin>>n;//决定精度doublestep=(b-a)/n;doublearea=0;while(a和作用域运算符。(6)已知类A有三个公有成员:voidf1(int),voidf2(int)和inta,则()是指向类A成员函数的指针。A.A*p;         B.intA::*pc=&A::a;C.void(A::*pa)(int);  D.A**p;(7)下列关于对象数组的描述中,()是错的。A.对象数组的数组名是一个地址常量;B.对象数组的下标是从0开始的;C.对象数组只能赋初值,不能被赋值;D.对象数组的数组元素是同一个类的对象.(8)下列定义中,()是定义指向类A的对象数组的指针。A.A*p[5];    B.A(*p)[5];C.(A*)p[5];D.A*p[];(9)说明语句constchar*ptr;中,ptr是()。A.指向字符常量的指针;  B.指向字符的常量指针;C.指向字符串常量的指针;D.指向字符串的常量指针。(10)关于new运算符的下列描述中,()是错的.A.使用它创建对象时要调用构造函数;B.使用它创建对象数组时必须指定初始值;C.它可以用来动态创建对象和对象数组;D.使用它创建的对象或对象数组可以使用运算符delete删除。答:(1)A(2)C(3)D(4)D(5)C(6)C(7)C(8)B(9)A(10)B7.2分析下列程序的运行结果。54(1)#includeclassB{private:inta,b;public:B(){}B(inti,intj){a=i;b=j;}voidprintb(){cout<classCount{staticintcount;public:54 Count(){count++;}staticintGetc(){returncount;}~Count(){count--;}};intCount::count=100;voidmain(){Countc1,c2,c3,c4;cout<classRect{doublew,h;public:Rect(doublea,doubleb){w=a;h=b;}frienddoublearea(Rect&r){returnr.w*r.h;}};voidmain(){Rectr1(3.0,4.0),r2(2.0,5.0);cout<constintN=100;classSet{intelems[N];intpc;public:Set(){pc=0;}Set(Set&s);voidEmpty(){pc=0;}intIsEmpty(){returnpc==0;}intIsMember(intn);intAdd(intn);voidprint();friendvoidreverse(Set*m);};Set::Set(Set&s){pc=s.pc;for(inti=0;i=N)return0;else{elems[pc++]=n;return1;}}voidSet::print(){cout<<”{“;for(inti=0;i0)cout<classB{intx,y;public:B();B(inti);B(inti,intj);~B();voidprint();};B::B(){x=y=0;cout<<"Defaultconstructorcalled.endl";}B::B(inti){x=i;y=0;cout<<"Constructor1calledendl";}B::B(inti,intj){x=i;y=j;cout<<"Constructor2calledendl";}B::~B(){cout<<"Destructorcalledendl";}voidB::print(){cout<<"x="<classA{inta;public:A(inti){a=i;}intfun(intb){returna*c+b;}intc;};voidmain(){Ax(8);intA::*pc;pc=&A::c;x.*pc=3;int(A::*pfun)(int);pfun=A::fun;A*p=&x;cout<<(p->*pfun)(5)<#includeclassStudent{private:charStudentNum[8];charName[10];intage;public:Student();Student(char*pn,char*pname="noname",intn=0){SetValue(pn,pname,n);}voidSetValue(char*pn,char*pname="noname",intn=0){strcpy(StudentNum,pn);strcpy(Name,pname);age=n;}voidprint(){cout<<"StudentNumber="<#includeclassStudent{private:charname[10];intg[4],sum;//分别存放一个学生4门课成绩和总分public:Student(){strcpy(name,"noname");g[0]=0;g[1]=0;g[2]=0;g[3]=0;sum=0;}Student(char*pn,int*ps,intn);voidprint(){cout<voidmain(){cout<<“欲穷千里目,”<classabc{public:abc(){cout<<"白日依山尽"<#includeclassCat{intage;charname[10];charcolour[15];staticintcatscount;public:Cat(intn=0,char*pn="noname",char*pcolour="white"):age(n){strcpy(name,pn);strcpy(colour,pcolour);catscount++;}staticintGetcatscount(){returncatscount;}voidprint();};intCat::catscount=0;voidCat::print(){cout<<"Thecat"snameis"<classItem{Item*next;intdata;Item(intd=0){data=d;next=0;}public:friendclassList;};classList{Item*list;Item*end();public:54 List(){list=0;}List(intd){list=newItem(d);}voidprint();//显示输出链表intinsert(intd=0);//插入链表项intappend(intd=0);//追加链表项voidcat(List&il);//两个链表相连接voidreverse();//将一个链表逆向输出intlength();//求链表的长度(项数)};Item*List::end(){Item*prv;Item*pt;prv=list;for(pt=list;pt;){prv=pt;pt=pt->next;}returnprv;}voidList::print(){if(list==0)cout<<"Thelistisempty!";cout<<"(";Item*pt=list;while(pt){cout<data<<"";pt=pt->next;}cout<<")"<next=list;list=pt;returnd;}intList::append(intd){Item*pt=newItem(d);if(list==0)list=pt;elseend()->next=pt;returnd;}voidList::cat(List&il){Item*pt=il.list;while(pt){append(pt->data);pt=pt->next;}}voidList::reverse(){Item*prv;Item*pt;Item*tmp;prv=0;pt=list;list=end();while(pt!=list){tmp=pt->next;pt->next=prv;prv=pt;pt=tmp;}list->next=prv;}intList::length(){intcnt=0;for(Item*pt=list;pt;){pt=pt->next;cnt++;}returncnt;}voidmain(){cout<<"1.Outputaemptylist:"<54#includeclassMember{intage;char*name;public:Member(inta,char*str){age=a;name=newchar[strlen(str)+1];strcpy(name,str);}voidprint(){cout<#include#includeclassCard{intcards[4][13];public:Card(){intk=1;for(inti=0;i<4;i++)for(intj=0;j<13;j++)cards[i][j]=k++;}voidsuffer(){srand(time(0));intr,s,k;for(inti=0;i<4;i++)for(intj=0;j<13;j++){r=rand()%4;s=rand()%13;k=cards[i][j];cards[i][j]=cards[r][s];//将52张牌逐一与随机选出的另一张牌交换cards[r][s]=k;}}voidshowCards(){for(inti=0;i<4;i++){for(intj=0;j<13;j++)if(cards[i][j]<=13)cout<<"S-"<13&&cards[i][j]<=26)cout<<"H-"<26&&cards[i][j]<=39)cout<<"D-"<13&&cards[i][j]<=26)cout<<"Hearts-"<26&&cards[i][j]<=39)cout<<"Diamonds-"<classA{inta,b;public:A(intx,inty){a=x;b=y;}voidmove(intxx,intyy){a+=xx;b+=yy;}voidprint(){cout<<”(“<classX{public:voidf(){cout<<"xxxxxxx"<#includeclassstring{char*name;intlength;public:string(char*str){length=strlen(str);name=newchar[length+1];strcpy(name,str);}voidshow(){cout<show();ptr1=&s2;ptr1->show();ptr2=&s2;ptr2->show();}54程序输出:SmithJeanJeantheageis:2分析:公有继承下的赋值兼容规则:指向基类的指针可以用来指向派生类的对象。用指向基类的指针访问派生类对象时,只能访问到派生类对象从基类中继承到的成员,面访问不到派生类新增添的成员。这种限制既对数据成员成立,也对函数成员成立。第一个ptr1->show();输出Smith第二个ptr1->show();输出Jean然后,ptr2->show();输出Jean和254 9.3分析下列程序的运行结果,指出派生类中area()函数重载的不同功能:#include54#includeclassPoint{doublex,y;public:Point(doublea,doubleb){x=a;y=b;}doublearea(){return0;}doubledistance(Point&,Point&);};doublePoint::distance(Point&p1,Point&p2){returnsqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}classcircle:publicPoint{intr;public:circle(intrad,inta,intb):Point(a,b){r=rad;}doublearea(){return3.1416*r*r;}};classtriangle:publicPoint{Pointp1,p2,p3;public:triangle(inta1,intb1,inta2,intb2,inta3,intb3):Point(0,0),p1(a1,b1),p2(a2,b2),p3(a3,b3){}doublearea(){doubles,s1,s2,s3;s1=distance(p1,p2);s2=distance(p1,p3);s3=distance(p2,p3);if((s1!=0)&&(s2!=0)&&(s3!=0)&&(s1+s2>s3)){s=(s1+s2+s3)/2;returnsqrt(s*(s-s1)*(s-s2)*(s-s3));}elsereturn0;}};voidmain(){circlec1(2,3,4),c2(5,0,0);trianglet1(-4,0,4,0,0,3);cout<#includeclassStudent{char*name;char*stunum;char*uniname;public:Student();Student(char*pn,char*ps,char*pu);voidprint();};Student::Student(char*pn,char*ps,char*pu){name=newchar[strlen(pn)+1];strcpy(name,pn);stunum=newchar[strlen(ps)+1];strcpy(stunum,ps);54 uniname=newchar[strlen(pu)+1];strcpy(uniname,pu);}voidStudent::print(){cout<<"name="<classBuilding{intlayernumber;inthousenum;floatsumarea;public:Building();Building(intm,intn,floats){cout<<"baseconstructorcalled."<classcharacter{chari;public:character(chara=0){i=a;}characteroperator++();characteroperator++(int);voidprint(){cout<classMatrix{double*ptr;introw,col;public:Matrix(intr,intc){row=r;col=c;ptr=newdouble[row*col];}double&operator()(inti,intj){returnptr[i*col+j];}};voidmain(){Matrixm(3,5);doublet=1024;for(inti=0;i<3;i++)for(intj=0;j<5;j++){m(i,j)=t;t=t/2;}for(i=0;i<3;i++){for(intj=0;j<5;j++)cout<classTest{staticintcount;intid;public:Test(){id=++count;cout<<"Test"<classTime{inthh,mm,ss;public:Time(){hh=0;mm=0;ss=0;}Timeoperator++();Timeoperator++(int);Timeoperator+(intsecond);voidprint(){cout<59){mm++;ss=0;}if(mm>59){hh++;mm=0;}if(hh>23)hh=0;return*this;}TimeTime::operator++(int){Timetemp=*this;++*this;returntemp;}TimeTime::operator+(intsecond){if(second<0){cout<<"Wrongentry!"<59){mm=mm+ss/60;ss=ss%60;}if(mm>59){hh=hh+mm/60;mm=mm%60;}if(hh>23)hh=hh%24;}return*this;}voidmain(){Timet1,t2;t1+100;++t1;t2=t1++;cout<<"t1:";t1.print();cout<<"t2:";t2.print();t1+3610;cout<<"t1:";t1.print();++t1;cout<<"t1:";t1.print();}549.6上机实验题:按已给出的函数原型为Matrix类重载+、-、*运算符,以完成正确的矩阵加法、减法、乘法计算,并编写main()函数,用给定的数据进行测试。54#includeclassMatrix{double*ptr;introw,col;public:Matrix(intr,intc){row=r;col=c;ptr=newdouble[row*col];}doubleoperator()(inti,intj){54 returnptr[i*col+j];}voidset(inti,intj,doublevalue){ptr[i*col+j]=value;}voidprint(){for(inti=0;i54classA{protected:intvalue;public:A(inta){value=a;}A(){value=1;}virtualvoidshow(){cout<<"A"svalueis:"<show();}voidmain(){Aobj1(10);Bobj2(12);Cobj3(25);display(&obj1);display(&obj2);display(&obj3);}54程序输出:A"svalueis:10B"svalueis:12,24C"svalueis:75,1,75obj3的构造调用了A、B类的无参构造函数。C没有新增数据成员,其成员value是从B继承的。10.4下面是一个终端硬件设备动程序库的抽象接口定义,试说明利用此接口为该库添加一种智能鼠标的驱动程序的方法和步聚。54classDevice{public:Device();~Device();virtualintopen(char*,int,int)=0;virtualintclose(int)=0;virtualintread(int,char*,unsigned)=0;virtualintwrite(int,char*,unsigned)=0;virtualintio_control(int,int)=0;};54参考解答:以Device为抽象基类定义一个实现类:classIntellegentMouse:publicDevice{54public:intopen(char*,int,int);intclose(int);intread(int,char*,unsigned);54 intwrite(int,char*,unsigned);intio_control(int,int);private:54···;//智能鼠标的属性定义}然后根据智能鼠标的硬件特性及操作特性重新定义接口函数。10.5上机实验题:下面是一个复数抽象类与其直角坐标表示法的实现类。请为它再定义一个极坐标表示法的实现类,并编一段程序对它们进行测试。#include#include#includeclassComplex{public:virtualdoublegetReal()=0;//gettherealpartvirtualdoublegetImage()=0;//gettheimagepartvirtualdoublegetMagnitude()=0;//getthemagnitudevirtualdoublegetAngle()=0;//gettheangle};voidshowComplex(Complex&c){cout<#includeconstdoublePI=3.14159;classIFunction//定义一个抽象类描述接口{public:virtual~IFunction(){}virtualdoubleoperator()(double)=0;};classf1:publicIFunction//实现类定义{doubler;public:f1(doublerad){r=rad;}doubleoperator()(doublex){returnsqrt(r*r-x*x);}doublegetr(){returnr;}};classf2:publicIFunction//实现类定义{public:f2(){}doubleoperator()(doublex){returnsin(x);}};classf3:publicIFunction//实现类定义{public:f3(){}doubleoperator()(doublex){returnx*x*x;}};classf4:publicIFunction//实现类定义{public:f4(){}doubleoperator()(doublex){return(x+2)/sqrt(2*x+1);}};classf5:publicIFunction//实现类定义{public:f5(){}doubleoperator()(doublex){returnsin(x/2)*sin(x/2);}};classf6:publicIFunction//实现类定义{public:f6(){}doubleoperator()(doublex){returnsqrt(1-sin(2*x));}};doubleintegrate(IFunction&fObj,doublea,doubleb,intn){//[a,b)为积分区间doublestep=(b-a)/n;doublearea=0;while(a>n;doubleresult;f1obj1(2);result=integrate(obj1,0,obj1.getr(),n);cout<(10?x+100:x-10)<<(w++||z++)<<(!wclassSearchNumber{intm,n,k;public:SearchNumber(inta1,inta2,inta3=0){m=a1;n=a2;k=a3;}intSearch(){intmax2=(m>n)?m:n;returnmax2;}intSearch()const{intmax3=(mk)?max3:k;returnmax3;}};voidmain(){SearchNumberD(19,35,57);constSearchNumberE(39,51,88);cout<classIndex{inti,j,temp;public:voidindexsort(int*a){for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(a[i]>a[j]){temp=a[j];a[j]=a[i];a[i]=temp;}}};voidmain(){Indexobj;ints[10]={2,3,5,1,7,9,0,4,6,8};54 obj.indexsort(s);int*p=s;for(inti=0;i<10;i++)cout<<*p++<<"";cout<#includeclassStudent{char*Name;char*Number;char*Sex;intAge;public:Student(char*name="",char*number="",char*sex="",intage=0);friendostream&operator<<(ostream&os,Student&ss);friendistream&operator>>(istream&os,Student&ss);};voidmain(){Studentdt("Liwen","101011","女",17),ds;cin>>ds;cout<#includeclassStudent{char*Name;char*Number;char*Sex;intAge;public:Student(char*name="",char*number="",char*sex="",intage=0){Name=newchar[strlen(name)+1];strcpy(Name,name);Number=newchar[strlen(number)+1];strcpy(Number,number);Sex=newchar[strlen(sex)+1];strcpy(Sex,sex);Age=age;}friendostream&operator<<(ostream&os,Student&ss);friendistream&operator>>(istream&os,Student&ss);};ostream&operator<<(ostream&os,Student&ss){os<>(istream&os,Student&ss){os>>ss.Name>>ss.Number>>ss.Sex>>ss.Age;returnos;}voidmain(){Studentdt("Liwen","101011","女",17),ds;cin>>ds;cout<#includevoidmain(){charch;ifstreamfin("d:\text2.txt");ofstreamfout("d:\text1.txt",ios::app);if(!fin)54 {cerr<<"Cannotopenfilefile.in";exit(-1);//如果原文件出错,显示信息并退出}if(!fout){cerr<<"Can"topenfilefile.out";exit(-1);//如果目的文件出错,显示信息并退出}while(fin.get(ch)){ch=char(ch-1);fout.put(ch);}cout<<"Thefileoperatinghasdown."<#includeclassPoint{intX,Y;public:Point(){}Point(intx,inty){X=x;Y=y;}friendostream&operator<<(ostream&os,Point&aPoint);friendistream&operator>>(istream&is,Point&aPoint);voidprint(){cout<<"("<>(istream&is,Point&aPoint){is>>aPoint.X>>aPoint.Y;returnis;//返回流的引用}voidmain(){intx,y;ofstreamwritefile("xpoint.dat");//创建一个文件流if(!writefile)//如果创建失败,退出{cout<<"Can"topenfile";exit(-1);}cout<<"inputthex、ywithblankseperated:";//标准流输出提示cin>>x>>y;//标准输入流输入数据PointPoint1(x,y);//创建点对象cout<<"inputx、yofanotherpoint:";//提示输入另一个点cin>>x>>y;//标准输入流输入数据PointPoint2(x,y);//创建点对象writefile<>Point3>>Point4;//把文件的数据读入点对象Point3.print();54 Point4.print();}5411.5(上机操作题)定义一个三角形类,创建其对象时,从键盘上输入每个三角形的三顶点。编写main()函数,从键盘上输入若干个三角形,并将它们以流的形式写入磁盘文件triangle.dat文件保存。54参考程序:#include#include#includeclassPoint{doublex,y;public:Point(){}Point(doublea,doubleb){x=a;y=b;}doublegetX(){returnx;}doublegetY(){returny;}doubledistanceTo(Point&p2){returnsqrt((x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y));}voidprint(){cout<<"("<>a>>b>>c>>d>>e>>f;tout[i]=Triangle(a,b,c,d,e,f);fileout.write((char*)&tout[i],sizeof(tout[i]));}fileout.close();ifstreamfilein("triangle.dat",ios::binary);if(!filein){cout<<"Can"topenfile";exit(-1);}for(i=0;i<3;i++)54 {filein.read((char*)&tin[i],sizeof(tin[i]));}filein.close();for(i=0;i<3;i++){tin[i].print();cout<<"Areaofthistriangle:";tin[i].ShowArea();cout<#includeclassStudent{char*Name;intAge;intlength;public:Student(char*name,intage){length=strlen(name);Name=newchar[length+1];strcpy(Name,name);Age=age;if(length<=0||length>10)throw0;if(age>30)throw1;}};voidmain(){try{Student("LiPing",32);}catch(intsize){if(size==0)cout<<"Nameistoolong"<54enumerrs{error0,error1};doubleDivide(doubletest1,doubletest2){try{if(test2==0)throwerror0;if(test2>=1000)throwerror1;}catch(errser){switch(er){caseerror0:cout<<"除数不能为0!"<#includedoublesqrtX(doublex){if(x>=0)returnsqrt(x);else{throw1;}}voidmain(){doublex[10];doubles=0;cout<<"请输入10个double型数据:";for(inti=0;i<10;i++){cin>>x[i];try{s+=sqrtX(x[i]);}catch(int){cout<<"负数不能开平方!输入数据无效。"<#includeclassStudent{char*Name;intAge;char*IDnumber;intIDlen;public:Student(char*name,intage,intIDlen);voidprint(){cout<>IDnumber[i];IDnumber[IDlen]="";intsize=(strlen(Name)+1+sizeof(Age)+strlen(IDnumber)+1+sizeof(IDlen));if(size>24)throw1;}catch(int){cout<<"学生对象总长度超过24字节"<voidmain(){doubleA[4][3]={10,20,30,50,40,0,0,60,50,70,10,0};doubleB[4][3]={5,20,60,10,10,50,50,0,10,70,10,0};doubleC[4][3];try{for(inti=0;i<4;i++)for(intj=0;j<3;j++)if(B[i][j]==0)throw0;elseC[i][j]=A[i][j]/B[i][j];}catch(int){cout<<"分母不能为0,请检查矩阵B中是否有0元素。"<classMatrix{double*ptr;introw,col;public:Matrix(intr,intc){row=r;col=c;ptr=newdouble[row*col];}doubleoperator()(inti,intj){returnptr[i*col+j];}voidset(inti,intj,doublevalue){ptr[i*col+j]=value;}voidprint(){54 for(inti=0;itemplateclassVector{Tx,y;public:Vector(){}Vector(Ta,Tb){x=a;y=b;}voidprint(){cout<<"<"<";}intoperator==(Vectorv);Vectoroperator-();};templateVectorVector::operator-(){Vectortemp;temp.x=-x;temp.y=-y;returntemp;}templateintVector::operator==(Vectorv){return(x==v.x&&y==v.y);}templateintisEqual(Ta,Tb){returna==b;}voidmain(){inta=215;cout<v1(2.5,12.5),v2(2.5,2.5);Vectorv3(5,12),v4(5,12);v1.print();v2.print();cout<54constintMaxSize=20;templateclassQueue{Typedata[MaxSize];inthead,tail;public:Queue(){head=0;tail=0;}voidclear(){head=0;tail=0;}voidinput(Type&x);Typegetout();intempty()const{returnhead==tail;}voidprintQueue()const;voidprintData()const;};templatevoidQueue::input(Type&x){try{if((tail+1)%MaxSize==head)throw1;tail=(tail+1)%MaxSize;data[tail]=x;}catch(int){cout<<"Queueoverflow!"<TypeQueue::getout(){Typetemp;try{if((head==tail))throw0;else{head=(head+1)%MaxSize;temp=data[head];}returntemp;}catch(int){cout<<"Queueempty!"<voidQueue::printQueue()const{cout<<"printqueue:"<voidQueue::printData()const{cout<<"printdata:"<intQueue;inta[]={1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181};cout<<"input:";inti;for(i=0;icharQueue;cout<<"inputastringlength19:";inti;chara;for(i=0;i>a;charQueue.input(a);}charQueue.printQueue();charQueue.printData();cout<>a;charQueue.input(a);}charQueue.printQueue();charQueue.printData();cout<classShape{public:virtualvoidarea()=0;virtualvoidperimeter()=0;};classCircle:publicShape{doubler;54 public:Circle(){doublex;cout<<"InputaCircle"radious:";cin>>x;r=x;}voidarea(){cout<<"Thiscircle"sareais"<<3.1416*r*r<>x;r=x;}voidarea(){cout<<"ThisSquareInCircle"sareais"<<2*r*r<area();}voidShowPerimeter(){factory()->perimeter();}};classCircleCreator:publicCreator{public:Shape*factory(){returnnewCircle();}};classSquareInCreator:publicCreator{public:Shape*factory(){returnnewSquareInCircle();}};voidmain(){CircleCreatora;SquareInCreatorb;a.ShowArea();b.ShowArea();a.ShowPerimeter();b.ShowPerimeter();}54参考解:只须增加以下两个类的定义:classSquareOutCircle:publicShape{doubler;public:SquareOutCircle(){doublex;cout<<"InputaSquareOutCircle"sradious:";cin>>x;r=x;}voidarea(){cout<<"ThisOutSquareOutCircle"sareais"<<4*r*r<constdoublePI=3.1416;classFigure{public:virtualvoidarea()=0;};classCircle:publicFigure{doubler;public:Circle(){}virtualvoidarea(){doublerad;cout<<"PleaseinputtheradiusofthisCircle:";cin>>rad;r=rad;cout<<"Circlewithradius"<>x>>y;a=x;b=y;cout<<"Trianglewithbase"<>x>>y;a=x;b=y;cout<<"Rectanglewithlength"<area();}};classCircleCreator:publicCreator{public:Figure*factory(){returnnewCircle;}};classRectangleCreator:publicCreator{public:Figure*factory(){returnnewRectangle;}};classTriangleCreator:publicCreator{public:Figure*factory(){returnnewTriangle;}54 };voidmain(){CircleCreatorc;TriangleCreatort;RectangleCreatorr;c.display();t.display();r.display();}54'