资源描述
第六章习题答案一、选择填空 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 calledConstructor calleda=0,b=0a=4,b=82、运行该程序输出结果如下所示。a=7,b=93、运行该程序输出结果如下所示。1044、运行该程序输出结果如下所示。1035,789.5045、运行该程序输出结果如下所示。10,1,2,3,4,5,6,7,8111,12,13,14,15,16,17,18,1919,18,17,16,15,14,13,12,116、运行该程序输出结果如下所示。Starting1:Default constructor called.Default constructor called.Default constructor called.Eding1:Starting2:Constructor: a=5,b=6Constructor: a=7,b=8Constructor: a=9,b=10Ending2:Destructor called.a=9,b=10Destructor called.a=7,b=8Destructor called.a=5,b=6Destructor called.a=5,b=6 Destructor called.a=3,b=4Destructor called.a=1,b=27、运行该程序输出结果如下所示。Default constructor called.Default constructor called.Default constructor called.Default constructor called.Destructor called.Constructor1 called.Destructor called.Constructor2 called.Destructor called.x=0,y=0x=5,y=0x=2,y=3Destructor called.Destructor called.Destructor called.8、运行该程序输出结果如下所示。Constructor called.0Constructor called.5Destructor called.55Destructor called.59、运行该程序输出结果如下所示。Constructor called.55Destructor called.510、运行该程序输出结果如下所示。Default Constructor called.Constructor:real=6.8,imag=0Constructor:real=5.6,imag=7.90+0I6.8+0I5.6+7.9IConstructor:real=1.2,imag=3.4Constructor:real=5,imag=0Default Constructor called.1.2+3.4I5+0I0+0I11、答:该程序中用string.h中所包含的函数有3种,它们是strcpy( )、strcat( )和strlen( ).该程序中使用了函数重载。它们是下述两个构造函数重载:String( )和String(const char * str)。类中成员函数Setc( )的功能是用来设置字符数组中某位置的一个指定字符。类中成员函数Getc( )的功能是用来从某个字符数组中获取指定位置的字符。类中成员函数Append( )的功能是在一个字符数组中追加一个指定的字符串,即将指定的字符串添加到已知串的后边。不行。该程序中有两处使用了new运算符。运行该程序输出结果如下所示。empty.a string.9a string.ithis a string.四、改正以下程序中的错误。1、该程序中point类的构造函数定义不正确,在main()中队数据成员的访问不正确,修改如下:#include class pointint x1,x2;public: point(int x,int y)point:x=x;point:y=y; void disp() coutx1endl; coutx2endl;/;void main()point data(5,5);data.disp();2、在main()函数中的p.x+=5和p.y+=6两个语句是错误的,因为保护数据仅能被类的成员函数访问。五、按下列要求编写程序。1、程序内容如下所示。#include class Testpublic:Test()Test(int i,int j=20)t1=i;t2=j;t+=j-i;static int fun(Test&T);friend int add(Test&T);private:int t1,t2;static int t;int Test:fun(Test&T)t+=T.t;return t;int add(Test&T)int n=T.t1+T.t2;return n;int Test:t=5;void main()Test a1,a2(10),a3(15,25);coutadd(a2)endl;coutTest:fun(a2)endl;2、程序内容如下所示。#include #include class Product char *name; int price; int quantity;public: Product(char *n,int p,int q) name =new charstrlen(n)+1; strcpy(name,n);price=p;quantity=q;Product() if(name) delete name; name=0;void buy(int money) int n,r; n=money/price; if(nquantity) cout数量不够endl; else quantity-=n; r=money%price; cout产品:name单价:price元 顾客; coutmoney元,买了n台,剩余r元endl;void get() const cout产品:name单价:price元 剩余quantity台endl;void main() Product p1(电视机,2000,15); p1.buy(7000); p1.get(); p1.buy(4500); p1.get();3、程序内容如下所示。#include #include class CDate private: int m_nDay; int m_nMonth; int m_nYear; public: CDate(); CDate(int day,int month,int year); void Display(); void AddDay(); void SetDate(int day,int month,int year); CDate(); private: bool IsLeapYear(); /判断该年是否为闰年;CDate:CDate()CDate:CDate(int day,int month,int year) m_nDay=day; m_nMonth=month; m_nYear=year;void CDate:Display() char day5; char month5; char year5; _itoa(m_nDay,day,10); _itoa(m_nMonth,month,10); _itoa(m_nYear,year,10); coutday/month/year31) if(m_nMonth=12) m_nYear+; m_nMonth=1; m_nDay=1;else m_nMonth+; m_nDay=1;void CDate:SetDate(int 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 if(m_nYear%100!=0)bLeap=true;else if(m_nYear%400!=0) bLeap=false; else bLeap=true; return bLeap;void main() CDate d; d.SetDate(2001,2,28); cout:; d.Display(); d.AddDay(); cout:; d.Display();4、程序内容如下所示。#include class Tc private:double unlead,lead,total;int unprice,price; public:Tc()unprice=17;price=16;void getdata() coutunlead; coutlead; total=unprice*unlead+price*lead;void disp() cout总收入:totalendl;void main() Tc A; A.getdata(); A.disp();5、程序内容如下所示。#include class CFactorialint value;int fact; public:CFactorial(int val);void CalculateFactorial();void Display();CFactorial:CFactorial(int val) value=val; fact=1;void CFactorial:CalculateFactorial() int i=value; while(i1) fact*=i-;void CFactorial:Display() coutvalue!=factendl;void main() CFactorial A(5); A.CalculateFactorial(); A.Display();6、程序内容如下所示。#include #include class rectangle private:float ledge,sedge; public:rectangle();rectangle(float a,float b) ledge=a;sedge=b;float area() return ledge*sedge;void addarea(rectangle r1,rectangle r2) cout总面积:r1.ledge*r1.sedge+ r2.ledge*r2.sedgeendl;void main() rectangle A(3.5,2.5),B(4.2,3.8),C; C.addarea(A,B);7、程序内容如下所示。#include #include class rectangle private:float ledge,sedge; public:rectangle();rectangle(float a,float b) ledge=a;sedge=b;float area() return ledge*sedge;void showlength() cout周长:(ledge+sedge)*2endl;rectangle tlength(rectangle r2) rectangle temp; temp.ledge=ledge+r2.ledge; temp.sedge=sedge+r2.sedge; return temp;void main() rectangle A(3.5,2.5),B(4.2,3.8); coutA; A.showlength(); coutB; B.showlength(); rectangle C=A.tlength(B); coutC; C.showlength();8、程序内容如下所示。#include #include class Line private:double x1,x2,y1,y2; public:Line();Line(double a,double b,double c,double d) x1=a;y1=b;x2=c;y2=d; cout线段端点x1,y1)-(x2,y2)0&r0&t1) cout0&r=1) cout=1 | r0&t1) coutendl; else coutendl;void main() Line A(2,2,18,18),B(1,12,19,5); twoline(A,B);9、本题涉及两个类student和cdegree,前者为学生类,包含学生的学号(no),姓名(name)和成绩(degree),而成绩degree是类cdegree的对象。cdegree类有3个数据成员,分别为数学(math),英语(english)和物理(phy)分数。程序内容如下所示。#include class student int no; char name10; class cdegree public: int math; int english; int phy;degree;public: void getdata() coutno; coutname; coutdegree.math; coutdegree.english; coutdegree.phy; void disp() cout学号:noendl; cout姓名:nameendl; cout数学分数:degree.mathendl; cout英语分数:degree.englishendl; cout物理分数:degree.phyendl;void main() student stud; stud.getdata(); stud.disp();10、程序内容如下所示。#include class Studentint english,computer,total; public:void getscore();void display();void sort(Student *);Student();void Student:getscore() coutenglish; coutcomputer; total=english+computer;void Student:sort(Student *p) int tmp,i,j; for(j=0;j2;j+)for(i=0;i2;i+) if (totaltotal) 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总分=totalendl;void main() Student *A3; for (int j=0;j3;j+) Aj=new Student; cout学生j+1getscore();int i;for (j=0;j2;j+) for(i=0;isort(Ai+1);coutendl排序结果如下:endl;for (i=0;idisplay();11、程序内容如下所示。#include struct list /定义栈 int data; list *next;class Stack /定义一个栈操作类list *ptr; public:Stack()ptr=NULL;void push(int i);int pop();void Stack:push(int 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;void main() Stack A; int arr=5,2,8,1,4,3,9,7,6; cout入栈顺序:; for (int i=0;i9;i+) coutarri ;A.push(arri);coutendl出栈顺序:;for (i=0;i9;i+) coutA.pop() ;coutendl;12、程序内容如下所示。#include struct list int data; list *next;class Queue list *ptrf,*ptrb; /队首和队尾指针 public:Queue() ptrf=ptrb=NULL;void enqueue(int);int dequeue();void Queue:enqueue(int x) /入队成员函数 list *newnode=new list; newnode-data=x; newnode-next=NULL; if (ptrb=NULL) ptrf=ptrb=newnode; else ptrb-next=newnode; ptrb=newnode;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;i5;i+) coutarri ; A.enqueue(arri); coutendl出队顺序:; for(i=0;i5;i+) coutA.dequeue() ; coutendl;13、程序内容如下所示。#include#includetypedef struct tree int data; tree *left,*right,*father;*bstree;class Btree static int n; static int m;public: tree *root; Btree() root=NULL; void create_Btree(int); void inorder(bstree); /中序遍历 void display() coutendl中序遍历序列: endl;inorder(root);coutdata!=k) print(p-left,k); print(p-right,k); else coutk的双亲结点的内容为:father-datadata=x; newnode-right=newnode-left=NULL; if(root=NULL) root=newnode; else bstree back; bstree current=root; while(current!=NULL) back=current; if(current-datax) current=current-left; else current=current-right; if(back-datax) back-left=newnode;newnode-father=back; else back-right=newnode;newnode-father=back; int Btree:count(bstree p) if(p=NULL) return 0; else return count(p-left)+count(p-right)+1; /这是运用了函数嵌套即递归的方法。void Btree:inorder(bstree temp) /这是中序遍历二叉树,采用了递归的方法。 if(temp!=NULL) inorder(temp-left); coutdataright); void main() Btree A; int array=7,4,1,5,12,8,13,11; int k; k=sizeof(array)/sizeof(array0); cout建立排序二叉树顺序: endl; for(int i=0;ik;i+) coutarrayi ; A.create_Btree(arrayi); coutendl; cout二叉树节点个数: A.count(A.root)endl; A.display(); 14、程序内容如下所示。#include #include struct list int data; list *next;class Stacklist *ptr; public:Stack()ptr=NULL;void push(int i);int pop();int empty() if (ptr=NULL) return 1; else return 0;void Stack:push(int 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;class Queue list *ptrf,*ptrb; public: Queue() ptrf=ptrb=NULL;void enqueue(int);int dequeue();void Queue:enqueue(int x) list *newnode=new list; newnode-data=x; newnode-next=NULL; if (ptrb=NULL)ptrf=ptrb=newnode; else ptrb-next=newnode; ptrb=newnode;int Queue:dequeue() list *tmp; int value; value=ptrf-data; tmp=ptrf; ptrf=ptrf-next; delete tmp; return value;void main() Stack S; Queue Q; char ch; cout 输入数据:; while(ch=getchar()!=.) S.push(ch); Q.enqueue(ch);while(!S.empty() & S.pop()=Q.dequeue();if (S.empty() cout输入的是回文数据。endl;else cout输入的不是回文数据。endl;15、程序内容如下所示。#include #include class magic int m44; int step; int first; int sum; public: void getdata(); void setfirstmagic(); void generatemagic(); void printmagic();void magic:getdata() coutfirst; coutstep;void magic:setfirstmagic() int i,j; int tmp; tmp=first; for(i=0;i4;i+) for(j=0;j4;j+) mij=tmp; tmp+=step;void magic:generatemagic() sum=m00+m33; for (int i=0,j=0;i4;i+,j+)mij=sum-mij; for (i=0,j=3;i4;i+,j-) mij=sum-mij;void magic:printmagic() int i,j; for(i=0;i4;i+) for(j=0;j4;j+) coutsetw(5)mij; coutendl;void main() magic A; A.getdata(); A.setfirstmagic(); cout原来的魔方如下:endl; A.printmagic(); A.generatemagic(); cout最终的魔方如下:endl; A.printmagic();
展开阅读全文