2022年面向对象程序设计C山师第六章习题答案.docx
精选学习资料 - - - - - - - - - 第六章习题答案一、挑选填空 1、A 2 、C 3、D 4 、 B 5 、D 6 、A 7 、C 8、A 9 、D 10、A 11 、C 12、A 13、B 14、 C 15、C 16、D 17、 B 18、C 19、A 20、D 21、C 22、B 二、判定以下描述的正确性,对者划,错者划× ; 1、 2、× 3、× 4、× 5、 6、 7、× 8、 9、× 10、 11、 12、 13、 14、 15、× 16、 17、 18、 19、 20、× 21、× 22、×三、分析以下程序的输出结果;1、运行该程序输出结果如下所示;Default constructor called Constructor called a=0,b=0 a=4,b=8 2、运行该程序输出结果如下所示;a=7,b=9 3、运行该程序输出结果如下所示;104 4、运行该程序输出结果如下所示;1035,789.504 5、运行该程序输出结果如下所示;1 0 ,1, 2,3,4,5,6,7,8 1 11 ,12,13,14,15, 16,17,18,19 19 ,18,17,16,15, 14,13,12, 11 6、运行该程序输出结果如下所示;Starting1: Default constructor called. Default constructor called. Default constructor called.Eding1: Starting2: Constructor: a=5,b=6 Constructor: a=7,b=8 Constructor: a=9,b=10 Ending2: Destructor called.a=9,b=10 Destructor called.a=7,b=8 Destructor called.a=5,b=6 Destructor called.a=5,b=6 Destructor called.a=3,b=4 1 / 22 名师归纳总结 - - - - - - -第 1 页,共 22 页精选学习资料 - - - - - - - - - Destructor called.a=1,b=2 7、运行该程序输出结果如下所示;Default constructor called. Defaultconstructor called. Default constructor called. Default constructor called. Destructor called. Constructor1 called. Destructor called. Constructor2 called. Destructor called. x=0,y=0 x=5,y=0 x=2,y=3 Destructor called. Destructor called. Destructor called. 8、运行该程序输出结果如下所示;Constructor called.0 Constructor called.5 Destructor called.5 5 Destructor called.5 9、运行该程序输出结果如下所示;Constructor called.5 5 Destructor called.5 10、运行该程序输出结果如下所示;Default Constructor called. Constructor:real=6.8,imag=0 Constructor:real=5.6,imag=7.9 0+0I 6.8+0I 5.6+7.9I Constructor:real=1.2,imag=3.4 Constructor:real=5,imag=0 Default Constructor called. 1.2+3.4I 5+0I 0+0I 11、答:该程序中用string.h 中所包含的函数有3 种,它们是strcpy 、strcat 和 strlen . 该程序中使用了函数重载;它们是下述两个构造函数重载:char * str ;2 / 22 String 和 Stringconst 名师归纳总结 - - - - - - -第 2 页,共 22 页精选学习资料 - - - - - - - - - 类中成员函数 Setc 的功能是用来设置字符数组中某位置的一个指定字符;类中成员函数 Getc 的功能是用来从某个字符数组中猎取指定位置的字符;类中成员函数 Append 的功能是在一个字符数组中追加一个指定的字符串,即将指定的字符串添加到已知串的后边;不行;该程序中有两处使用了 new 运算符;运行该程序输出结果如下所示;empty. a string. 9 a string. i this a string. 四、改正以下程序中的错误;1、该程序中point 类的构造函数定义不正确,在main 中队数据成员的拜访不正确,修改如下:#include <iostream.h> class point int x1,x2 ;public: pointint x,int ypoint:x=x;point:y=y ; void disp cout<<x1<<endl ; cout<<x2<<endl ; / ;void main point data5,5 ;data.disp; 2、在 main 函数中的 成员函数拜访;五、按以下要求编写程序;p.x+=5 和 p.y+=6 两个语句是错误的,由于爱护数据仅能被类的1、程序内容如下所示;#include <iostream.h> class Test public: Test Testint i,int j=20 3 / 22 名师归纳总结 - - - - - - -第 3 页,共 22 页精选学习资料 - - - - - - - - - t1=i ;t2=j ;t+=j-i ; static int funTest&T ;friend int addTest&T ;private: int t1,t2 ;static int t ; ;int Test:funTest&T t+=T.t ;return t ; int addTest&T int n=T.t1+T.t2 ;return n ; int Test:t=5 ;void main Test a1,a210,a315,25;cout<<adda2<<endl ;cout<<Test:funa2<<endl ; 2、程序内容如下所示;#include <iostream.h> #include <string.h> class Product char *name; int price ; int quantity ;public: Productchar *n,int p,int q name =new charstrlenn+1 ; strcpyname,n;price=p;quantity=q ; 4 / 22 名师归纳总结 - - - - - - -第 4 页,共 22 页精选学习资料 - - - - - - - - - Product ifname delete name; name=0; void buyint money int n,r ; n=money/price ; ifn>quantity cout<<" 数量不够 "<<endl ; else quantity-=n ; r=money%price ; cout<<" 产品: "<<name<<" 单价: "<<price<<" 元 顾客 " ; cout<<money<<" 元,买了 "<<n<<" 台,剩余 "<<r<<" 元"<<endl ; void get const cout<<" 产品: "<<name<<" 单价: "<<price<<" 元 剩余 "<<quantity<<" 台"<<endl ; ;void main Product p1" 电视机 ",2000,15 ; p1.buy7000 ; p1.get; p1.buy4500 ; p1.get; 3、程序内容如下所示;#include <iostream.h> #include <stdlib.h> class CDate private: int m_nDay ; int m_nMonth ; int m_nYear ;5 / 22 名师归纳总结 - - - - - - -第 5 页,共 22 页精选学习资料 - - - - - - - - - public: CDate ; CDateint day,int month,int year ; void Display ; void AddDay ; void SetDateint day,int month,int year ; CDate; private: bool IsLeapYear ; /判定该年是否为闰年 ;CDate:CDate CDate:CDateint day,int month,int year m_nDay=day ; m_nMonth=month ; m_nYear=year; void CDate:Display char day5 ; char month5 ; char year5 ; _itoam_nDay,day,10; _itoam_nMonth,month,10 ; _itoam_nYear,year,10; cout<<day<<"/"<<month<<"/"<<year<<endl; void CDate:AddDay m_nDay+ ; if IsLeapYear ifm_nMonth=2&&m_nDay=30 m_nMonth+ ; m_nDay=1 ; return; else ifm_nMonth=2&&m_nDay=29 6 / 22 名师归纳总结 - - - - - - -第 6 页,共 22 页精选学习资料 - - - - - - - - - m_nMonth+ ; m_nDay=1 ; return; ifm_nDay>31 ifm_nMonth=12 m_nYear+ ; m_nMonth=1 ; m_nDay=1 ; else m_nMonth+ ; m_nDay=1 ; void CDate:SetDateint day,int month,int year m_nDay=day ; m_nMonth=month ; m_nYear=year; CDate:CDate bool CDate:IsLeapYear bool bLeap; if m_nYear%4.=0 bLeap=false; else ifm_nYear%100.=0 bLeap=true;else ifm_nYear%400.=0 bLeap=false; else bLeap=true; return bLeap; void main 7 / 22 名师归纳总结 - - - - - - -第 7 页,共 22 页精选学习资料 - - - - - - - - - CDate d; d.SetDate2001,2,28; cout<<" 当前日期 => :"; d.Display ; d.AddDay ; cout<<" 当前日期加 1=>:"; d.Display ; 4、程序内容如下所示;#include <iostream.h> class Tc private: double unlead,lead,total ;int unprice,price ; public: Tcunprice=17 ;price=16; void getdata cout<<" 无铅汽油总量;"; cin>>unlead ; cout<<" 有铅汽油总量;"; cin>>lead ; total=unprice*unlead+price*lead ; void disp cout<<" 总收入: "<<total<<endl ; ;void main Tc A; A.getdata; A.disp ; 5、程序内容如下所示;#include <iostream.h> class CFactorial int value ;int fact ; public: 8 / 22 名师归纳总结 - - - - - - -第 8 页,共 22 页精选学习资料 - - - - - - - - - CFactorialint val ;void CalculateFactorial ;void Display ; ;CFactorial:CFactorialint val value=val ; fact=1; void CFactorial:CalculateFactorial int i=value ; whilei>1 fact*=i- ; void CFactorial:Display cout<<value<<".="<<fact<<endl; void main CFactorial A5 ; A.CalculateFactorial ; A.Display ; 6、程序内容如下所示;#include <iostream.h> #include <iomanip.h> class rectangle private: float ledge,sedge; public: rectangle ;rectanglefloat a,float b ledge=a;sedge=b; ;float area return ledge*sedge; ;void addarearectangle r1,rectangle r2 9 / 22 名师归纳总结 - - - - - - -第 9 页,共 22 页精选学习资料 - - - - - - - - - cout<<" 总面积: "<<r1.ledge*r1.sedge+ r2.ledge*r2.sedge<<endl ; ;void main rectangle A3.5,2.5,B4.2,3.8,C ; C.addareaA,B ; 7、程序内容如下所示;#include <iostream.h> #include <iomanip.h> class rectangle private: float ledge,sedge; public: rectangle ;rectanglefloat a,float b ledge=a;sedge=b; ;float area return ledge*sedge; ;void showlength cout<<" 周长: "<<ledge+sedge*2<<endl ; rectangle tlengthrectangle r2 rectangle temp; temp.ledge=ledge+r2.ledge ; temp.sedge=sedge+r2.sedge; return temp; ;void main rectangle A3.5,2.5,B4.2,3.8 ; cout<<"A" ; A.showlength ;10 / 22 名师归纳总结 - - - - - - -第 10 页,共 22 页精选学习资料 - - - - - - - - - cout<<"B" ; B.showlength ; rectangle C=A.tlengthB ; cout<<"C" ; C.showlength ; 8、程序内容如下所示;#include <iostream.h> #include <iomanip.h> class Line private: double x1,x2,y1,y2 ; public: Line ;Linedouble a,double b,double c,double d x1=a;y1=b;x2=c;y2=d; cout<<" 线段端点 "<<x1<<","<<y1<<"-"<<x2<<","<<y2<<""<<endl; friend twolineLine l1,Line l2 ; double r1=l2.y1*l2.x2-l1.x1-l1.y1*l2.x2-l2.x1+l1.x1-l2.x1*l2.y2-l2.y1 double r2=l1.y2-l1.y1*l2.x2-l2.x1-l1.x2-l1.x1*l2.y2-l2.y1;double r=r1/r2 ;double t=l1.x1-l2.x1+r*l1.x2-l1.x1/l2.x2-l2.x1;if r>0&&r<1&&t>0&&t<1 cout<<""<<endl ;else if r>0&&r<1&&t>=1 cout<<""<<endl ; else ifr>=1 | r<=0&& t>0&&t<1 cout<<""<<endl ; else cout<<""<<endl ; ;void main Line A2,2,18,18,B1,12,19,5 ; twolineA,B ; 9、此题涉及两个类student 和 cdegree,前者为同学类,包含同学的学号no,姓名(name)和成果 degree,而成果degree 是类 cdegree的对象; cdegree类有 3 个数据成员,分别为数学 math,英语 english和物理 phy 分数;11 / 22 名师归纳总结 - - - - - - -第 11 页,共 22 页精选学习资料 - - - - - - - - - 程序内容如下所示;#include <iostream.h> class student int no ; char name10 ; class cdegree public: int math ; int english ; int phy ;degree;public: void getdata cout<<" 学号: "; cin>>no ; cout<<" 姓名: "; cin>>name ; cout<<" 数学分数: "; cin>>degree.math; cout<<" 英语分数: "; cin>>degree.english ; cout<<" 物理分数: "; cin>>degree.phy ; void disp cout<<" 学号: "<<no<<endl ; cout<<" 姓名: "<<name<<endl ; cout<<" 数学分数: "<<degree.math<<endl ; cout<<" 英语分数: "<<degree.english<<endl ; cout<<" 物理分数: "<<degree.phy<<endl ; ;void main student stud; stud.getdata; stud.disp; 10、程序内容如下所示;#include <iostream.h> 12 / 22 名师归纳总结 - - - - - - -第 12 页,共 22 页精选学习资料 - - - - - - - - - class Student int english,computer,total ; public: void getscore;void display ;void sortStudent * ;Student; ;void Student:getscore cout<<" 输入英语成果 " ; cin>>english ; cout<<" 输入运算机成果 "; cin>>computer ; total=english+computer ; void Student:sortStudent *p int tmp,i,j ; forj=0 ;j<2 ;j+ fori=0 ;i<2;i+ if total<p->total tmp=total ; total=p->total ; p->total=tmp ; tmp=english ; english=p->english ; p->english=tmp ; tmp=computer ; computer=p->computer ; p->computer=tmp ; void Student:display cout<<" 英语 ="<<english<<" 运算机 ="<<computer<<" 总分 ="<<total<<endl ; void main Student *A3 ; for int j=0 ;j<3 ;j+ 13 / 22 名师归纳总结 - - - - - - -第 13 页,共 22 页精选学习资料 - - - - - - - - - Aj=new Student ; cout<<" 同学 "<<j+1<<endl ; Aj->getscore ; int i ;for j=0 ;j<2 ;j+ fori=0 ;i<2 ;i+ ; Ai->sortAi+1 cout<<endl<<" 排序结果如下:"<<endl ;for i=0 ;i<3 ;i+ Ai->display ; 11、程序内容如下所示;#include <iostream.h> struct list / 定义栈 int data; list *next ; ;class Stack /定义一个栈操作类 list *ptr ; public: Stackptr=NULL ; void pushint i ;int pop ; ;void Stack:pushint x / 入栈成员函数 list *newnode=new list ; newnode->data=x; newnode->next=ptr ; ptr=newnode ; int Stack:pop / 出栈成员函数 list *top ; int value ; value=ptr->data ; top=ptr ; ptr=ptr->next ; delete top; return value; 14 / 22 名师归纳总结 - - - - - - -第 14 页,共 22 页精选学习资料 - - - - - - - - - void main Stack A; int arr=5,2,8,1,4,3,9,7,6; cout<<" 入栈次序: "; for int i=0 ;i<9 ;i+ cout<<arri<<" " ;A.pusharri ; cout<<endl<<" 出栈次序: ";for i=0 ;i<9 ;i+ cout<<A.pop<<" " ;cout<<endl ; 12、程序内容如下所示;#include <iostream.h> struct list int data; list *next ; ;class Queue list *ptrf,*ptrb ; /队首和队尾指针 public: Queue ptrf=ptrb=NULL; void enqueueint ;int dequeue; ;void Queue:enqueueint x / 入队成员函数 list *newnode=new list ; newnode->data=x; newnode->next=NULL ; if ptrb=NULL ptrf=ptrb=newnode ; else ptrb->next=newnode ; ptrb=newnode ;15 / 22 名师归纳总结 - - - - - - -第 15 页,共 22 页精选学习资料 - - - - - - - - - ;int Queue:dequeue / 出队成员函数 list *tmp ; int value ; value=ptrf->data ; tmp=ptrf ; ptrf=ptrf->next ; delete tmp; return value; void main Queue A; int arr=3,12,8,9,11 cout<<" 入队次序; "; for int i=0 ;i<5 ;i+ cout<<arri<<" " ; A.enqueuearri ; cout<<endl<<" 出队次序: "; fori=0 ;i<5 ;i+ cout<<A.dequeue<<" " ; cout<<endl ; 13、程序内容如下所示;#include<iostream.h> #include<stdlib.h> typedef struct tree int data; tree *left,*right,*father;*bstree ;class Btree static int n; static int m ;public: tree *root ; Btree root=NULL ;16 / 22 名师归纳总结 - - - - - - -第 16 页,共 22 页精选学习资料 - - - - - - - - - void create_Btreeint ; void inorderbstree ; / 中序遍历 void display cout<<endl<<"中序遍历序列 : "<<endl ;inorderroot ;cout<<endl ; int countbstree ; / 运算二叉树的个数 int printbstree,int ; /输出要查找的值对应的双亲结点的内容 ;int Btree:n=0 ;int Btree:m=0 ;int Btree:printbstree p,int k ; ifp=NULLreturn 0 else ifp->data.=k printp->left,k ; printp->right,k ; else cout<<k<<" 的双亲结点的内容为:"<<p->father->data<<endl ; return 0; void Btree:create_Btreeint x bstree newnode=new tree; newnode->data=x; newnode->right=newnode->left=NULL ifroot=NULL root=newnode ; else bstree back; bstree current=root ; whilecurrent.=NULL back=current ; ifcurrent->data>x current=current->left ; else current=current->right ;17 / 22 名师归纳总结 - - - - - - -第 17 页,共 22 页精选学习资料 - - - - - - - - - ifback->data>x back->left=newnode ;newnode->father=back ; else back->right=newnode ;newnode->father=back ; int Btree:countbstree p ifp=NULL return 0; else return countp->left+countp->right+1; / 这是运用了函数嵌套即递归的方法;void Btree:inorderbstree temp / 这是中序遍历二叉树,采纳了递归的方法; iftemp.=NULL inordertemp->left ; cout<<temp->data<<" " ; inordertemp->right ; void main