实验5(1) 类的组合参考答案一、实验目的与实验要求(1)理解类组合的概念与作用。
(2)掌握对象成员的定义方法,理解对象成员的构造与析构方法。
(3)理解组合后类的构造函数与析构函数的调用次序。
(4)掌握对象成员中私有成员和保护成员的访问方法。
二、实验内容题目1:对象成员的定义、构造与访问。
定义三个类Member1、Member2和New。
Member2中包含有Member1类型的成员,New中包含有Member1与Member2类型的成员。
程序的具体要求如下。
①在Member1类中,它含有一个int型私有数据成员x以及三个公有成员函数。
三个成员函数分别为构造函数、析构函数与显示函数show( )。
show( )函数的作用是输出x的值。
②在Member2类中,它含有三个私有数据成员,分别是Member1型的对象obj1、obj2与int型的数据y。
此外,它还含有三个公有成员函数,分别是构造函数、析构函数与显示函数show( )。
show( )函数的作用是输出y的值。
③在New类中,它含有三个私有数据成员,分别是Member1型的对象m1、Member2型的对象m2与int型的数据z。
此外,它还含有三个公有成员函数,分别是构造函数、析构函数与显示函数show( )。
show( )函数的作用是输出z的值。
④main( )函数中定义一个New型的对象,并调用show( )函数。
程序为:#include<iostream>using namespace std;class Member1{public:Member1(int a){x = a;cout << "constructing Member1 " << x << endl;}~Member1( ){cout << "donstructing Member1\n";}void show( ){cout << "Member1 x = " << x << endl;}private:int x;};class Member2{public:Member2( int a,int b,int c ):obj1(a),obj2(b){y = c;cout << "constructing Member2 " << y << endl;}~Member2( ){cout << "donstructing Member2\n";}void show( ){cout << "Member2 y = " << y << endl;}private:Member1 obj1, obj2;int y;};class New{public:New( int a,int b,int c,int d,int e): m1(a),m2(b,c,d){z = e;cout << "constructing New " << z << endl;}~New( ){cout << "donstructing New\n";}void show( ){cout << "New z = " << z << endl;}private:Member1 m1;Member2 m2;int z;};int main( ){New ex(1,2,3,4,5);ex.show( );return 0;}题目2:类组合的应用。
编写一个程序,对一批学生的资料进行处理。
程序的具体要求如下。
①编写日期类Date,它含有三个私有int型数据成员year、month、day,分别表示年、月、日。
此外,它还含有五个公有成员函数,分别是构造函数、显示函数Show( )、取值函数GetYear( )、GetMonth( )和GetDay( )。
Show( )的功能是输出当前对象的日期,GetYear( )、GetMonth( )、GetDay( )的作用分别是返回year、month和day的值。
②编写学生类Student,它含有三个私有数据成员,分别是字符串型变量name、int型变量score与Date型变量birthday,分别表示学生的姓名、成绩与出生日期。
此外,它还含有五个公有成员函数,分别是构造函数、显示函数Show( )、取值函数GetName( )、GetScore( )和GetDate( )。
Show( )的功能是输出当前对象的所有信息,GetName( )、GetScore( )、GetDate( ) 的作用分别是返回name的首地址、score的值以及birthday的值。
③编写函数CompareDate。
它的原型如下,它的作用是比较日期d1和d2的前后。
如果d1在d2前,返回-1,如果d1在d2后,返回1,如果d1和d2是同一天,返回0。
int CompareDate( Date d1, Date d2 );④编写函数SortByName。
它的原型如下,它的作用是对st数组的前num个数据按姓名进行排序。
void SortByName( Student * st , int num );⑤编写函数SortByScore。
它的原型如下,它的作用是对st数组的前num个数据按成绩进行排序。
void SortByScore( Student *st , int num );⑥编写函数SortByBirthday。
它的原型如下,它的作用是对st数组的前num个数据按出生日期进行排序。
void SortByBirthday( Student * st, int num );⑦编写函数PrintStudent。
它的原型如下,它的作用是输出st数组的前num项。
void PrintStudent( Student *st , int num );⑧编写主函数main( ),在main( )中定义对象数组st,并调用上述函数进行测试。
st数组使用下列数据进行初始化。
Jack, 99, 1990, 2, 5Mike, 62, 1989, 12, 25Tom, 88, 1990, 3, 14Kate, 74, 1989, 10, 15Rowen, 92, 1990, 5, 22程序如下:#include<iostream>using namespace std;class Date{public:Date( int y = 2000 , int m = 1 , int d = 1 ){year = y;month = m;day = d;}void Show( ){cout << year << "-" << month << "-" << day << endl;}int GetYear( ){return year;}int GetMonth( ){return month;}int GetDay( ){return day;}private:int year;int month;int day;};class Student{public:Student( int y=0,int m=0,int d=0,int s=0,char *p=" " ): birthday(y,m,d){strcpy( name, p );score = s;}void Show( ){cout << name << " " << score << " ";birthday.Show();}char * GetName( ){return name;}int GetScore( ){return score;}Date GetDate( ){return birthday;}private:char name[20];int score;Date birthday;};int CompareDate( Date d1, Date d2 );void SortByName( Student *, int num );void SortByScore( Student *, int num );void SortByBirthday( Student *, int num );void PrintStudent( Student *, int num );int main( ){Student st[5] = {Student(1990,2,5,99,"Jack"),Student(1989,12,25,62,"Mike"),Student(1990,3,14,88,"Tom"),Student(1989,10,15,74,"Kate"),Student(1990,5,22,92,"Rowen")};PrintStudent( st,5);cout<<endl;SortByName(st,5);PrintStudent(st,5);cout<<endl;SortByScore(st,5);PrintStudent(st,5 );cout<<endl;SortByBirthday(st,5);PrintStudent(st,5);return 0;}int CompareDate( Date d1, Date d2 ){ //int t;if (d1.GetYear()<d2.GetYear())return-1;else if(d1.GetYear()==d2.GetYear())if(d1.GetMonth()<d2.GetMonth())return -1;else if (d1.GetMonth()==d2.GetMonth())if(d1.GetDay()<d2.GetDay())return -1;else if (d1.GetDay()==d2.GetDay())return 0;else return 1;else return 1;else return 1;}void SortByName( Student *st, int num ){Student t;int k;for(int i=0;i<num;i++){ k=i;for(int j=i+1;j<num;j++)// if(st[k].GetName()>st[j].GetName())if(strcmp(st[k].GetName(),st[j].GetName() )>0)k=j;t=st[k];st[k]=st[i];st[i]=t;}}void SortByScore( Student *st, int num ){Student t;int k;for(int i=0;i<num;i++){ k=i;for(int j=i+1;j<num;j++)if(st[k].GetScore()<st[j].GetScore())k=j;t=st[k];st[k]=st[i];st[i]=t;}}void SortByBirthday( Student *st, int num ){Student t;int k;for(int i=0;i<num;i++){ k=i;for(int j=i+1;j<num;j++)if(CompareDate(st[k].GetDate(),st[j].GetDate())==1) k=j;t=st[k];st[k]=st[i];st[i]=t;}}void PrintStudent( Student *st, int num ){ for (int i=0;i<num;i++)st[i].Show();}运行结果为:Jack 99 1990-2-5Mike 62 1989-12-25Tom 88 1990-3-14Kate 74 1989-10-15Rowen 92 1990-5-22Jack 99 1990-2-5Kate 74 1989-10-15Mike 62 1989-12-25Rowen 92 1990-5-22Tom 88 1990-3-14Jack 99 1990-2-5Rowen 92 1990-5-22Tom 88 1990-3-14Kate 74 1989-10-15Mike 62 1989-12-25Kate 74 1989-10-15Mike 62 1989-12-25Jack 99 1990-2-5Tom 88 1990-3-14Rowen 92 1990-5-22Press any key to continue三、实验指导题目1指导:①程序的主要代码如下,在横线上补充相应的语句。