实验:编写一个人员信息管理系统。这个系统的功能是:交互式的实现校园人员信息的录入与显示。
分析:
学校里,主要有四类人员:大学本科学生、教师、研究生和助教。
大学本科生每周有固定的学时数。教师除了固定的学时数外,还有每周的教学时数。研究生除了固定的学时数外,每周还可以自由做一定的研究。助教生除了上课外,还要做研究和一定的教学工作。
人员的基本信息包括姓名、编号、性别、身份证号、总学时数以及每周固定学时数。各个人员之间的关系: people类派生出student 类和teacher类,student 类派生出graduate类, graduate类和teacher类派生出TA类。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int Allweeks;
class people
{
public:
people() :Id(0), Name("0"), Sex("0"), IdCard("0"), All_Studytime(0), Weekly_Studytime(0)
{
}
virtual void Set_Data() = 0;
virtual void Print_Data() = 0;
protected:
string Name;
int Id;
string Sex;
string IdCard;
double Weekly_Studytime;
double All_Studytime;
};
class student : virtual public people
{
public:
virtual void Set_Data()
{
string name;
int id;
string sex;
string idcard;
double weekly_studytime;
cout << "依次输入本科生姓名,编号,性别,身份证号,每周固定学时数" << endl;
cin >> name >> id >> sex >> idcard >> weekly_studytime;
Name = name;
Id = id;
Sex = sex;
IdCard = idcard;
Weekly_Studytime = weekly_studytime;
All_Studytime = Weekly_Studytime * Allweeks;
}
virtual void Print_Data()
{
cout << endl;
cout << "本科生" << endl;
cout << "姓名:" << Name << endl;
cout << "编号:" << Id << endl;
cout << "性别:" << Sex << endl;
cout << "身份证号:" << IdCard << endl;
cout << "每周固定学时数:" << Weekly_Studytime << endl;
cout << "总学时数:" << All_Studytime << endl;
}
protected:
};
class teacher :virtual public people
{
public:
virtual void Set_Data()
{
string name;
int id;
string sex;
string idcard;
double weekly_studytime;
double weekly_teachtime;
cout << "依次输入人员姓名,编号,性别,身份证号,每周固定学时数,每周教学时数" << endl;
cin >> name >> id >> sex >> idcard >> weekly_studytime >> weekly_teachtime;
Name = name;
Id = id;
Sex = sex;
IdCard = idcard;
Weekly_Studytime = weekly_studytime;
All_Studytime = Weekly_Studytime * Allweeks;
Weekly_Teachtime = weekly_teachtime;
}
virtual void Print_Data()
{
cout << endl;
cout << "教师" << endl;
cout << "姓名:" << Name << endl;
cout << "编号:" << Id << endl;
cout << "性别:" << Sex << endl;
cout << "身份证号:" << IdCard << endl;
cout << "每周固定学时数:" << Weekly_Studytime << endl;
cout << "总学时数:" << All_Studytime << endl;
cout << "每周教学时数:" << Weekly_Teachtime << endl;
}
protected:
double Weekly_Teachtime;
};
class graduate : virtual public student
{
public:
virtual void Set_Data()
{
string name;
int id;
string sex;
string idcard;
double weekly_studytime;
double researchtime;
cout << "依次输入人员姓名,编号,性别,身份证号,每周固定学时数,总研究时长" << endl;
cin >> name >> id >> sex >> idcard >> weekly_studytime >> researchtime;
Name = name;
Id = id;
Sex = sex;
IdCard = idcard;
Weekly_Studytime = weekly_studytime;
All_Studytime = Weekly_Studytime * Allweeks;
Reserachtime = researchtime;
}
virtual void Print_Data()
{
cout << endl;
cout << "研究生" << endl;
cout << "姓名:" << Name << endl;
cout << "编号:" << Id << endl;
cout << "性别:" << Sex << endl;
cout << "身份证号:" << IdCard << endl;
cout << "每周固定学时数:" << Weekly_Studytime << endl;
cout << "总学时数:" << All_Studytime << endl;
cout << "总研究时长:" << Reserachtime << endl;
}
protected:
double Reserachtime;
};
class TA : public graduate, public teacher
{
public:
virtual void Set_Data()
{
string name;
int id;
string sex;
string idcard;
double weekly_studytime;
double weekly_teachtime;
double researchtime;
cout << "依次输入人员姓名,编号,性别,身份证号,每周固定学时数,每周教学时数,总研究时长" << endl;
cin >> name >> id >> sex >> idcard >> weekly_studytime >> weekly_teachtime >> researchtime;
Name = name;
Id = id;
Sex = sex;
IdCard = idcard;
Weekly_Studytime = weekly_studytime;
All_Studytime = Weekly_Studytime * Allweeks;
Weekly_Teachtime = weekly_teachtime;
Reserachtime = researchtime;
}
virtual void Print_Data()
{
cout << endl;
cout << "助教" << endl;
cout << "姓名:" << Name << endl;
cout << "编号:" << Id << endl;
cout << "性别:" << Sex << endl;
cout << "身份证号:" << IdCard << endl;
cout << "每周固定学时数:" << Weekly_Studytime << endl;
cout << "总学时数:" << All_Studytime << endl;
cout << "每周教学时数:" << Weekly_Teachtime << endl;
cout << "总研究时长:" << Reserachtime << endl;
}
protected:
};
void UI()
{
cout << endl;
cout << " ******************************************" << endl;
cout << " * 欢迎使用人员信息管理系统:) *" << 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 << " * 0.退出系统 *" << endl;
cout << " ******************************************" << endl;
cout << endl;
}
int main()
{
cout << "设置本学期周数:" << endl;
cin >> Allweeks;
people* p = nullptr;
vector<people*> stu;
vector<people*> teach;
vector<people*> grad;
vector<people*> ta;
while (true)
{
UI();
cout << "请输入操作选项:" << endl;
int option;
cin >> option;//输入操作选项
if (option == 0)
break;
switch (option)
{
case 1:
p = new student;
p->Set_Data();
stu.push_back(p);
break;
case 2:
p = new teacher;
p->Set_Data();
teach.push_back(p);
break;
case 3:
p = new graduate;
p->Set_Data();
grad.push_back(p);
break;
case 4:
p = new TA;
p->Set_Data();
ta.push_back(p);
break;
case 5:
if (stu.empty())
{
cout << "暂无本科生信息" << endl;
}
for (vector<people*>::iterator it = stu.begin(); it != stu.end(); it++)
{
(*it)->Print_Data();
}
break;
case 6:
if (teach.empty())
{
cout << "暂无教师信息" << endl;
}
for (vector<people*>::iterator it = teach.begin(); it != teach.end(); it++)
{
(*it)->Print_Data();
}
break;
case 7:
if (grad.empty())
{
cout << "暂无研究生信息" << endl;
}
for (vector<people*>::iterator it = grad.begin(); it != grad.end(); it++)
{
(*it)->Print_Data();
}
break;
case 8:
if (ta.empty())
{
cout << "暂无助教信息" << endl;
}
for (vector<people*>::iterator it = ta.begin(); it != ta.end(); it++)
{
(*it)->Print_Data();
}
break;
case 9:
if (stu.empty() && teach.empty() && grad.empty() && ta.empty())
{
cout << "暂无人员信息" << endl;
}
for (vector<people*>::iterator it = stu.begin(); it != stu.end(); it++)
{
(*it)->Print_Data();
}
for (vector<people*>::iterator it = teach.begin(); it != teach.end(); it++)
{
(*it)->Print_Data();
}
for (vector<people*>::iterator it = grad.begin(); it != grad.end(); it++)
{
(*it)->Print_Data();
}
for (vector<people*>::iterator it = ta.begin(); it != ta.end(); it++)
{
(*it)->Print_Data();
}
break;
}
}
}
小tips:
push——back()是浅拷贝,子类若有堆区数据要写一个拷贝构造函数
疑问:
基类加个纯虚函数会报错
delete p会报错