(1) 设计一个人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:name(姓名),number(编号),birthday(出生日期),id(身份证号)等等。其中“出生日期”定义为一个“日期”类(具有属性):year(年),month(月),date(日)内嵌子对象。用成员函数实现对人员信息的录入和显示等必要的功能操作(自己独立思考设计)。要求包括:构造函数和析构函数,拷贝构造函数,内联成员函数。
(2) 从people(人员)类派生出student(学生)类,添加属性:班号 char chassNO;从people(人员)类派生出teacher(教师)类,添加属性:职务 char principalship,部门 char department;.从 student类中派生出graduate(研究生)类,添加属性:专业 char subject,导师 teacher adviser(为(教师类内嵌子对象));从graduate类和 teacher类派生出TA(助教生)类,注意虚基类的使用,重载相应的成员函数。
(3) 对people类重载“= =”运算符和“=”运算符,“= =”运算符判断两个people类对象的id属性是否相等;“=”运算符实现people类对象的赋值操作。
(4)定义一个对people类对象数组按编号排序的函数,一个按编号查找people对象的函数。
#include
#include
#include
#include
using namespace std;
static int number=0; //编号
class date //时间类
{
public:
int year;
int month;
int day;
};
class people //定义people类
{ protected:
char name[20];
char sex[10];
char id[18];
date birthday;
public:
void setname(char *n)
{ strcpy(name,n);}
char *getname()
{ return name;}
int getnumber()
{return number;}
void setsex(char *s)
{
strcpy(sex,s);
}
char *getsex()
{ return sex;}
void setid(char *i)
{ strcpy(id,i);}
char* getid()
{return id;}
void setyear(int i) //设置
{ birthday.year=i;}
int getyear() //获得
{return birthday.year;}
void setmonth(int i) //设置
{ birthday.month=i;}
int getmonth() //获得
{return birthday.month;}
void setday(int i) //设置
{ birthday.day=i;}
int getday() //获得
{return birthday.day;}
};
class student:public people //学生类
{
private:
char classno[7]; //班号
public:
void setclassno(char *c)
{ strcpy(classno,c);}
char *getclassno()
{ return classno;}
};
class teacher:virtual public people //老师类
{
protected:
char principaiship[11];
char department[21];
public:
void setprin(char *p)
{ strcpy(principaiship,p);}
char *getprin()
{ return principaiship;}
void setdepart(char *d)
{ strcpy(department,d);}
char *getdepart()
{ return department;}
};
class graduate:virtual public student //研究生类
{
protected:
char subject[21];
public:
void setsubject(char *s)
{ strcpy(subject,s);}
char *getsubject()
{ return subject;}
};
int main()
{
student s;
teacher t;
graduate g;
char namestr[21]; //字符的变量
char b[18];
int a=0;
int i=0; char y; int c; //定义传值过程中的变量
char flag; //判断是否继续输入的变量
//ofstream ofile("people.bin",ios::out |ios::binary); //定义输出的一个对象ofile
//建立结构体,用于write和read的传值
struct data
{
int year,month,day,nn;
char name[20],sex[10],classno[7],principaiship[11],department[21],subject[21],id[18];
};
//number=ds.nn;
data ds={0,0,0,0,0};//初始化结构体
people *p[3]={&s,&t,&g}; //分配地址
do
{
cout<<"**********************************************************"<>c;
if(c==1)
{
number++; //调用一次标号加一
cout<<"输入学生姓名:"<>namestr;
p[i]->setname(namestr);//设置学生姓名
strcpy(ds.name,namestr); //姓名的传值
//判断性别
do
{
cout<<"输入性别(m/f)"<>y;
if (y=='m'||y=='f')
{
if(y=='m')
{
p[i]->setsex(namestr);
strcpy(ds.sex,"男");
}
else if(y=='f')
{
p[i]->setsex(namestr);
strcpy(ds.sex,"女");
}
}
else
{
cout << "error!\n";
cout << "again\n";
cin >> y;
}
}while( y=='m'||y=='f') ;
//获取id信息
cout<<"输入id:"<>b;
p[i]->setid(b);
strcpy(ds.id,b); //id的传值
//获取编号
cout<<"输入编号:"<>namestr;
s.setclassno(namestr);
strcpy(ds.classno,namestr); //班号的传值
//获取生日
cout<<"输入生日:"<<"\n"<<"year:"<>a;
s.setyear(a);
ds.year=a;
cout<<"month:"<>a;
if(a<=12)
{
s.setmonth(a);
ds.month=a;
}
else
{
cout << "输入错误!"<>a;
}
}while(a>12);
//判断日期
cout<<"day:"<>a;
if(a<=30)
{
s.setday(a);
ds.day=a;
}
else
{
cout<<"输入错误!"<>a;
}
}while(a>30);
cout<<"录入成功"<>flag;
}
//添加老师信息
else if(c==2)
{
number++;
i = 1 ;
cout<<"输入老师姓名?"<>namestr;
strcpy(ds.name,namestr);
p[i]->setname(namestr);
do
{
cout<<"输入性别(m/f)"<>y;
if(y=='m'||y=='f')
{
if(y=='m')
{
p[i]->setsex(namestr);
strcpy(ds.sex,"男");
}
else if( y=='f')
{
p[i]->setsex(namestr);
strcpy(ds.sex,"女");
}
}
else
{
cout<<"输入错误!"<>y;
}
} while(y=='m'||y=='f');
//id的获得
cout<<"输入id:"<>a;
p[i]->setid(b);
strcpy(ds.id,b);
// 获得老师职务信息
cout<<"输入老师职务?"<>namestr;
t.setprin(namestr);
strcpy(ds.principaiship,namestr);
// 获得部门信息
cout<<"输入部门:"<>namestr;
t.setdepart(namestr);
strcpy(ds.department,namestr);
// 获得生日信息
cout<<"输入生日: "<<"\n"<<"year:"<>a;
s.setyear(a);
ds.year=a;
do
{
cout<<"month:"<>a;
if(a<=12)
{
s.setmonth(a);
ds.month=a;
}
else
{
cout <<"输入错误!"<>a;
}
} while(a>12);
do
{
cout<<"day:"<>a;
if(a<=30)
{
s.setday(a);
ds.day=a;
}
else
{
cout<<"error!"<>a;
}
} while(a>30);
//将得到的信息写入文挡保存
ofstream ofile("people.bin",ios::out |ios::binary|ios_base::app);
if(!ofile)
{
cout<<"Cannot open file.\n";
return 1;
}
ofile.write((char * )&ds,sizeof ds);
ofile.close();
cout<<"录入成功!"<>flag;
}
//添加研究生信息
else if(c==3)
{
number++;
i=2;
cout<<"输入研究生姓名:"<>namestr;
strcpy(ds.name,namestr);
p[i]->setname(namestr);
//判断性别
do
{
cout<<"输入性别(m/f)"<>y;
if(y=='m'||y=='f')
{
if(y=='m')
{
p[i]->setsex(namestr);
strcpy(ds.sex,"男");
}
else if( y=='f')
{
p[i]->setsex(namestr);
strcpy(ds.sex,"女");
}
}
else
{
cout<<"输入错误!"<>y;
}
} while(y=='m'||y=='f');
//获得id信息
cout<<"输入id:"<>a;
p[i]->setid(b);
strcpy(ds.id,b);
// 获得专业信息
cout<<"输入专业:"<>namestr;
g.setsubject(namestr);
strcpy(ds.subject,namestr);
// 获得生日信息
cout<<"输入生日: "<<"\n"<<"year:"<>a;
s.setyear(a);
ds.year=a;
//判断月份
do
{
cout<<"month:"<>a;
if(a<=12)
{
s.setmonth(a);
ds.month=a;
}
else
{
cout <<"输入错误!"<>a;
}
} while(a>12);
//判断日期
do
{
cout<<"day:"<>a;
if(a<=30)
{
s.setday(a);
ds.day=a;
}
else
{
cout<<"error!"<>a;
}
} while(a>30);
//将得到的信息写入文挡保存
ofstream ofile("people.bin",ios::out |ios::binary|ios_base::app);
if(!ofile)
{
cout<<"Cannot open file.\n";
return 1;
}
ofile.write((char * )&ds,sizeof ds);
ofile.close();
cout<<"录入成功!"<>flag;
}
//输入编码查询信息
else if(c==4)
{
cout<<"请输入编码:"<>z;
//读取文件通过指针定位来查找需要的信息
fstream iofile;
iofile.open("peoplo.bin",ios::in|ios::out);
iofile.seekp(sizeof(ds),ios::beg);
iofile.read((char*)&ds,sizeof ds);
cout<<"*************************************"<>flag;
}
else if(c==5) //列出所有信息
{
cout<<"信息列表:"<>flag;
}
else
cout<<"输入错误!"<