首页 > 留学知识库

问题: c++课程设计!

3.4 人员信息资料管理(限最多2人完成)
具体设计要求求实现如下功能:
(1)建立人员信息数据,包括编号、姓名、性别、出生时间、岗位(部门)、参加工作时间和年龄(必须通过计算得到)等等其他信息;
(2)根据人员信息表,建立只含有姓名和年龄的信息简表(可选功能);
(3)使用继承的方法构造3个类,(即人员类——虚基类,教师类和学生类——派生类)使用相应的对象放置10个人员信息;
(4)编写同名display()成员函数,用来输出数组的内容;
(5)按不同类别输出人员信息,比如按系输出教师信息(可选功能);
(6)要求对“<<”和“>>”运算符进行重载。考虑到输入人员编号时,也会因不小心引入空格,而且名字中也需要有空格,所以重载“>>’’运算符时,需要满足这个要求;
(7)抽取并计算人员的平均年龄;
(8)检索(查找)指定信息(如按姓名检索、按年龄检索);
(9)显示年龄分布的图形;
参考系统界面如下:
1-增加一位人员(教师、学生)记录
2-显示全部人员记录
3-计算人员平均年龄
4-删除一个人员记录
5-按岗位(部门)输出人员信息(可选)
6-按姓名检索所有信息
7-结束程序运行

解答:

#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>

#define maxsize 100
fstream iofile;

class Time
{
public:
int year;
int month;
int day;
};

class Telem
{
public:
char name[20];
char sex[10];
Time birthtime;
char num[20];
char workpart[20];
Time worktime;
int year;
friend istream& operator>>(istream& input,Telem& T);
friend ostream& operator<<(ostream& output,Telem& T);
friend int operator-(Time & t1,Time & t2);
};

class People
{
public:
People();
virtual void AddF()=0;
virtual void Addall()=0;
virtual void Add()=0;
virtual void Display();
virtual void Displaypart(char p[]);
virtual void Findname(char n[]);
virtual void Findyear(int );
virtual int Aveyear();
virtual void Del(char n[])=0;
virtual void Del(int );
protected:
Telem data[maxsize];
Time now;
int length;
};

class Teacher:virtual public People
{
public:
virtual void AddF();
virtual void Addall();
virtual void Add();
virtual void Display();
virtual void Del(int i);
virtual void Del(char n[]);
};

class Student:virtual public People
{
public:
virtual void AddF();
virtual void Addall();
virtual void Add();
virtual void Display();
virtual void Del(int i);
virtual void Del(char n[]);
};

People::People()
{
length=0;
now.year=2009;
now.month=5;
now.day=26;
}

void People::Display()
{
int i;
for(i=0;i<length;i++)
cout<<data[i];
}

void People::Displaypart(char p[])
{
int i,c;
for(i=0;i<length;i++)
if(strcmp(data[i].workpart,p)==0)
{
cout<<"输出选择姓名1 性别2 编号3 工作地点4 出生日期5 工作时间6 年龄7 退出选择8"<<endl;
while(cin>>c)
{
switch(c)
{
case 1: cout<<"姓名:"<<data[i].name<<endl;break;
case 2: cout<<"性别:"<<data[i].sex<<endl;break;
case 3: cout<<"编号:"<<data[i].num<<endl;break;
case 4: cout<<"工作地点:"<<data[i].workpart<<endl;break;
case 5: cout<<"出生日期:"<<data[i].birthtime.year<<" "<<data[i].birthtime.month<<" "<<data[i].birthtime.day<<" "<<endl;break;
case 6: cout<<"工作时间:"<<data[i].worktime.year<<" "<<data[i].worktime.month<<" "<<data[i].worktime.day<<" "<<endl;break;
case 7: cout<<"年龄:"<<data[i].year<<endl;break;
case 8: goto loop;
default:cout<<"操作错误......"<<endl;
}
}
loop:;
}
}
void People::Findname(char n[])
{
int i;
for(i=0;i<length;i++)
if(strcmp(data[i].name,n)==0)
cout<<data[i];
}
void People::Findyear(int y)
{
int i;
for(i=0;i<length;i++)
if(data[i].year==y)
cout<<data[i];
}

int People::Aveyear()
{
int i,s=0;
for(i=0;i<length;i++)
s+=data[i].year;
return s/length;
}

void People::Del(int i)
{
int j;
if(i<1||i>length)
cout<<"不存在第"<<i<<"个元素";
for(j=i;j<length;j++)
data[j-1]=data[j];
length--;
}
void Student::AddF()
{
int flag=0;
iofile.open("Student_information.txt",ios::in|ios::binary);
while(iofile.seekg(ios::cur))
{
iofile.seekg(length*sizeof(data[length]),ios::beg);
iofile.read((char*)&data[length],sizeof(data[length]));

length++;
if(length==maxsize)
{
flag=1;
goto loop;
}
}
People::Del(length);
cout<<"添加人员信息成功......"<<endl;
loop:
if(1==flag)
cout<<"人员信息储存空间已满......"<<endl;
iofile.close();
}
void Student::Addall()
{
char ans;
int flag=0;
iofile.open("Student_information.txt",ios::out|ios::binary);

do
{

cin>>data[length];
data[length].year=now-data[length].birthtime;
iofile.write((char*)&data[length],sizeof(data[length]));
cout<<"添加人员信息成功......"<<endl;
length++;
if(length==maxsize)
{
flag=1;
goto loop;
}
cout<<"contine(Y|N)?";
cin>>ans;
}while('y'==ans||'Y'==ans);
loop:
if(1==flag)
cout<<"人员信息储存空间已满......"<<endl;
iofile.close();
}

void Student::Add()
{
int flag=0;
iofile.open("Student_information.txt",ios::app|ios::out|ios::binary);
if(length==maxsize)
{
flag=1;
goto loop;
}
cin>>data[length];
data[length].year=now-data[length].birthtime;
iofile.write((char*)&data[length],sizeof(data[length]));
cout<<"添加人员信息成功......"<<endl;
length++;
loop:
if(1==flag)
cout<<"人员信息储存空间已满......"<<endl;
iofile.close();
}
void Student::Display()
{
cout<<"*********************学生信息************************"<<endl;
if(0==length) cout<<"无......"<<endl;
int i;
for(i=0;i<length;i++)
cout<<data[i];
}
void Student::Del(char n[])
{
int i,j,k;
for(i=0;i<length;i++)
if(strcmp(data[i].name,n)==0)
{
k=i+1;break;
}
if(k<1) cout<<"不存在姓名"<<n<<"的人员信息";
for(j=k;j<length;j++)
data[j-1]=data[j];
length--;
cout<<"删除人员信息成功......"<<endl;
}
void Student::Del(int i)
{
int j;
if(i<1||i>length)
cout<<"不存在第"<<i<<"个元素";
for(j=i;j<length;j++)
data[j-1]=data[j];
length--;
cout<<"删除成功......"<<endl;

}
void Teacher::AddF()
{
int flag=0;
iofile.open("Teacher_information.txt",ios::in|ios::binary);
while(iofile.seekg(sizeof(data[length]),ios::cur))
{
if(iofile.seekg(length*sizeof(data[length]),ios::beg))
iofile.read((char*)&data[length],sizeof(data[length]));
else
break;
length++;

if(length==maxsize)
{
flag=1;
goto loop;
}
}
People::Del(length);
cout<<"添加人员信息成功......"<<endl;
loop:
if(1==flag)
cout<<"人员信息储存空间已满......"<<endl;
iofile.close();
}
void Teacher::Addall()
{
char ans;
int flag=0;
iofile.open("Teacher_information.txt",ios::in|ios::out|ios::binary);

do
{

cin>>data[length];
data[length].year=now-data[length].birthtime;

iofile.write((char*)&data[length],sizeof(data[length]));

cout<<"添加人员信息成功......"<<endl;
length++;
if(length==maxsize)
{
flag=1;
goto loop;
}
cout<<"contine(Y|N)?";
cin>>ans;
}while('y'==ans||'Y'==ans);
loop:
if(1==flag)
cout<<"人员信息储存空间已满......"<<endl;
iofile.close();
}
void Teacher::Add()
{
int flag=0;
iofile.open("Teacher_information.txt",ios::app|ios::out|ios::binary);
if(length==maxsize)
{
flag=1;
goto loop;
}
cin>>data[length];
data[length].year=now-data[length].birthtime;

iofile.write((char*)&data[length],sizeof(data[length]));

cout<<"添加人员信息成功......"<<endl;
length++;
loop:
if(1==flag)
cout<<"人员信息储存空间已满......"<<endl;
iofile.close();
}
void Teacher::Display()
{
cout<<"*********************教师信息************************"<<endl;
if(0==length) cout<<"无......"<<endl;
int i;
for(i=0;i<length;i++)
cout<<data[i];
}

void Teacher::Del(char n[])
{
int i,j,k;
for(i=0;i<length;i++)
if(strcmp(data[i].name,n)==0)
{
k=i+1;break;
}
if(k<1) cout<<"不存在姓名"<<n<<"的人员信息";
for(j=k;j<length;j++)
data[j-1]=data[j];
length--;
cout<<"删除人员信息成功......"<<endl;
}
void Teacher::Del(int i)
{
int j;
if(i<1||i>length)
cout<<"不存在第"<<i<<"个元素";
for(j=i;j<length;j++)
data[j-1]=data[j];
length--;
cout<<"删除成功......"<<endl;

}
istream& operator>>(istream& input,Telem& T)
{
int y,m,d;
cout<<"请输入姓名(以#结尾):"<<endl;
input.getline(T.name,20,'#');
cout<<"请输入性别(以#结尾 男或女):"<<endl;
input.getline(T.sex,10,'#');
cout<<"编号(以#结尾):"<<endl;
input.getline(T.num,20,'#');
cout<<"工作部门(以#结尾):"<<endl;
input.getline(T.workpart,20,'#');
cout<<"请输入出生日期:"<<endl;
input>>y>>m>>d;
T.birthtime.year=(y>=1900&&y<=2100)?y:1900;
T.birthtime.month=(m>=1&&m<=12)?m:1;
T.birthtime.day=(d>=1&&d<=31)?d:1;
cout<<"参加工作时间:"<<endl;
input>>y>>m>>d;
T.worktime.year=(y>=1900&&y<=2100)?y:1900;
T.worktime.month=(m>=1&&m<=12)?m:1;
T.worktime.day=(d>=1&&d<=31)?d:1;
return input;
}

ostream& operator<<(ostream& output,Telem& T)
{
cout<<"姓名:";
output<<T.name<<endl;
cout<<"性别:";
output<<T.sex<<endl;
cout<<"编号:";
output<<T.num<<endl;
cout<<"工作部门:";
output<<T.workpart<<endl;
cout<<"出生日期:";
output<<T.birthtime.year<<" "<<T.birthtime.month<<" "<<T.birthtime.day<<endl;
cout<<"参加工作时间:";
output<<T.worktime.year<<" "<<T.worktime.month<<" "<<T.worktime.day<<endl;
cout<<"年龄:";
output<<T.year<<endl;
return output;
}
int operator-(Time & t1,Time & t2)
{
return t1.year-t2.year;
}

void Showmenu()
{

cout<<"****************人员信息管理系统***********************"<<endl;
cout<<"* 0-从文件录入全部人员(教师、学生)记录 *"<<endl;
cout<<"* 1-从键盘录入全部人员(教师、学生)记录 *"<<endl;
cout<<"* 2-增加一位人员(教师、学生)记录 *"<<endl;
cout<<"* 3-显示全部人员记录 *"<<endl;
cout<<"* 4-计算人员平均年龄 *"<<endl;
cout<<"* 5-删除一个人员记录 *"<<endl;
cout<<"* 6-按部门输出人员信息(可选) *"<<endl;
cout<<"* 7-按姓名或年龄检索所有信息 *"<<endl;
cout<<"* 8-显示菜单目录 *"<<endl;
cout<<"* 9-结束程序运行 *"<<endl;
cout<<"*******************************************************"<<endl;
}
int main()
{
Teacher tea;
Student stu;
People *pt=&tea;
People *ps=&stu;
int c=0,k=0,l=0,i=0;
char nam[20],part[20];
Showmenu();
for(;;)
{
cout<<"请根据菜单执行相应操作: ";
cin>>c;
switch(c)
{
case 0:
{
cout<<"***********从文件录入全部人员(教师、学生)记录*****"<<endl;
cout<<"**********录入教师信息************"<<endl;
pt->AddF();
cout<<"**********录入学生信息************"<<endl;
ps->AddF();
break;
}
case 1:
{
cout<<"***********录入全部人员(教师、学生)记录*****"<<endl;
cout<<"**********从键盘输入教师信息************"<<endl;
pt->Addall();
cout<<"**********从键盘输入学生信息************"<<endl;
ps->Addall();
break;
}
case 2:
{
cout<<"************从键盘增加一位人员(教师、学生)记录****"<<endl;
cout<<"*****教师操作请按1 学生操作请按2*****"<<endl;
cin>>k;
if(1==k)
pt->Add();
else if(2==k)
ps->Add();
else
cout<<"操作错误..."<<endl;
break;
}
case 3:
{
cout<<"************显示全部人员记录**************"<<endl;
pt->Display();
ps->Display();
break;
}
case 4:
{
cout<<"************计算人员平均年龄**************"<<endl;
cout<<"*****教师操作请按1 学生操作请按2*****"<<endl;
cin>>k;
if(1==k)
cout<<"教师平均年龄:"<<pt->Aveyear()<<endl;
else if(2==k)
cout<<"学生平均年龄:"<<ps->Aveyear()<<endl;
else
cout<<"操作错误......"<<endl;
break;

}
case 5:
{
cout<<"************删除一个人员记录******************"<<endl;
cout<<"*****教师操作请按1 学生操作请按2*****"<<endl;
cin>>k;
if(1==k)
{
cout<<"按姓名删除1 按位置删除2"<<endl; cin>>l;
if (1==l)// 注意'\n' endl 区别
{
cout<<"请输入要删除人员的姓名(以#结尾):"<<endl;cin.getline(nam,20,'#');
pt->Del(nam);
}
else if(2==l)
{
cout<<"请输入要删除人的位置:"<<endl;cin>>i;
pt->Del(i);
}
else
cout<<"操作错误......"<<endl;

}
else if(2==k)
{
cout<<"按姓名删除1 按位置删除2"<<endl; cin>>l;
if (1==l)
{
cout<<"请输入要删除人员的姓名(以#结尾):"<<endl;cin.getline(nam,20,'#');
ps->Del(nam);
}
else if(2==l)
{
cout<<"请输入要删除人的位置:"<<endl;cin>>i;
ps->Del(i);
}
else
cout<<"操作错误......"<<endl;
}
else
cout<<"操作错误......"<<endl;
break;

}
case 6:
{
cout<<"************按部门输出人员信息(可选)**"<<endl;
cout<<"*****教师操作请按1 学生操作请按2*****"<<endl;
cin>>k;
if(1==k)
{
cout<<"请输入要输出人员的部门(以#结尾):"<<endl;cin.getline(part,20,'#');
pt->Displaypart(part);
}
else if(2==k)
{
cout<<"请输入要输出人员的部门(以#结尾):"<<endl;cin.getline(part,20,'#');
ps->Displaypart(part);
}
else
cout<<"操作错误......"<<endl;
break;
}
case 7:
{
cout<<"************按姓名或年龄检索所有信息**********"<<endl;
cout<<"*****教师操作请按1 学生操作请按2*****"<<endl;
cin>>k;
if(1==k)
{
cout<<"按姓名查找1 按年龄查找2"<<endl; cin>>l;
if (1==l)
{
cout<<"请输入要查找人员的姓名(以#结尾):"<<endl;cin.getline(nam,20,'#');
pt->Findname(nam);
}
else if(2==l)
{
cout<<"请输入要查找人的年龄:"<<endl;cin>>i;
pt->Findyear(i);
}
else
cout<<"操作错误......"<<endl;
}
else if(2==k)
{
cout<<"按姓名查找1 按年龄查找2"<<endl; cin>>l;
if (1==l)
{
cout<<"请输入要查找人员的姓名(以#结尾):"<<endl;cin.getline(nam,20,'#');
ps->Findname(nam);
}
else if(2==l)
{
cout<<"请输入要查找人的年龄:"<<endl;cin>>i;
ps->Findyear(i);
}
else
cout<<"操作错误......"<<endl;
}
else
cout<<"操作错误......"<<endl;
break;
}
case 8:
{
cout<<"************显示菜单目录*************************"<<endl;
Showmenu();
break;
}
case 9:
{
cout<<"************结束程序运行**********************"<<endl;
exit(0);
}
default:cout<<"操作错误......"<<endl;
}

}
return 0;
}