面向对象编程实验报告
题目: 高校人员信息管理系统设计与实现
学生姓名:
学 号:
院 (系): 电气与信息工程学院
专 业: 网络工程
2016 年 6月 25日
一、 实验目的
1.要求能够熟练掌握C++语言的基本知识和技能。
2.基本掌握面向对象程序设计的基本思路和方法。
3.能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
二、 实验内容
1、问题描述
某高校有四类员工:教师、实验员、行政人员,教师兼行政人员;共有的信息包括:编号、姓名、性别、年龄等。其中,教师还包含的信息有:所在系部、专业、职称;实验员还包含的信息由:所在实验室、职务;行政人员还包含的信息有:政治面貌、职称等。
2、功能要求
(1)添加功能:程序能够任意添加上述四类人员的记录,可提供选择界面供用户选择所要添加的人员类别,要求员工的编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据编号、姓名等信息对已添加的记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
(3)显示功能:可显示当前系统中所有记录,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
(5)删除功能:主要实现对已添加的人员记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空!”并返回操作;否则,输入要删除的人员的编号或姓名,根据所输入的信息删除该人员记录,如果没有找到该人员信息,则提示相应的记录不存。
(6)统计功能:能根据多种参数进行人员的统计。能统计四类人员数量以及总数,
统计男、女员工的数量。
(7)保存功能:可将当前系统中各类人员记录存入文件中,存入方式任意。
(8)读取功能:可将保存在文件中的人员信息读入到当前系统中,供用户进行使用。
三、 实验环境
Microsoft Visual studio 2010
四、 设计思路或方案
1.类设计
此系统共设计了5个类:公有类(class CCommon),教师类(class Cteacher),实验员类(class Cassistant),行政人员类(class Cexecution),教师兼行政人员类(class Ctea_exe)
(1) 人员的管理需包含人员的基本信息,所以定义一个公有类如下表所示
表一 公有类
类名 |
公有类 |
数据成员 |
protected: int number; //编号 string name; //姓名 string sex; //性别 int age; //年龄 |
(2) 根据高校人员的工作性质的不同,将所以员工分为五类, 分别是教师类(class Cteacher),实验员类(class Cassistant),行政人员类(class Cexecution),教师兼行政人员类(class Ctea_exe)
表二 教师类
类名 |
教师类 |
数据成员 |
protected: string department;//所在系部 string profession;//专业 string position;//职称 |
成员函数 |
public: void set(int _number,string _name,string_sex,int_age,string_department,string_profession,string _position) void output() |
表三 实验员类
类名 |
实验员类 |
数据成员 |
protected: string laboratory; //所在实验室 string position; //职称 |
成员函数 |
public: void set(int_number,string _name,string_sex,int_age,string_laboratory,string_position) void output() |
表四 行政人员类
类名 |
行政人员类 |
数据成员 |
protected: string politics;//政治面貌 string position;//职称 |
成员函数 |
public:void set(int _number,string _name,string _sex,int _age,string _politics,string _position) void output() |
表五 教师兼行政人员类
类名 |
教师兼行政人员类 |
数据成员 |
protected: string politics;//政治面貌 string department;//所在系部 string profession;//专业 string position;//职称 |
成员函数 |
public:void . set(int _number, string _name,string_sex,int_age,string_politics,string_department,string _profession,string _position) void output() |
2.类之间的关系
公有类是基类,教师类、实验员类、行政人员类是其派生类,教师兼行政人员类是教师和行政人员类的派生类,这样定义能使程序变得更加简单,派生类的成员函数和数据成员可使用基类的,使用了派生和继承,使程序变得简单化。
3.函数设计
定义了教师菜单函数,实验员菜单函数,行政人员菜单函数,教师兼行政人员类,这些函数可调用派生类中的添加成员函数,查询成员函数,显示成员函数,编辑成员函数,删除成员函数,统计成员函数,保存成员函数,读取成员函数。
五、 程序清单
/*-------------------------------------共 有 类-------------------------------------*/
class CCommon//公有类
{
protected:
int number;//编号
string name;//姓名
string sex;//性别
int age;//年龄
};
/*------------------------教 师 类--------------------------------------*/
class Cteacher:
public CCommon//教师类
{
protected:
string department;//所在系部
string profession;//专业
string position;//职称
public:
void set(int _number,string _name,string _sex,int_age,string _department,string
_profession,string _position)
{
number = _number;
name = _name;
sex = _sex;
age = _age;
department = _department;
profession = _profession;
position = _position;
}//输入教师数据
void output();
~Cteacher()
{
}//析构函数
friend int find_nu(Cteacher teacher[], int _nu, int&t);
friend int find_na(Cteacher teacher[], string _na, int&t);
friend void add(Cteacher teacher[], int _fa);
friend void dele(Cteacher teacher[], int _fa);
friend void closefile(Cteacher teacher[] ,int &t);
friend void _statistics(Cteacher teacher[], int &t);
};
void teacher_manage();
/*----------------------------实 验 员 类-------------------------------------------*/
class Cassistant:public CCommon//实验员类
{
protected:
string laboratory;//所在实验室
string position;//职称
public:
void set(int _number,string _name,string _sex,int_age,string _laboratory,string
_position)
{
number = _number;
name = _name;
sex = _sex;
age = _age;
laboratory = _laboratory;
position = _position;
}//输入实验员数据
void output();
~Cassistant()
{
}//析构函数
friend int find_nu(Cassistant assistant[], int _nu, int&t);
friend int find_na(Cassistant assistant[], string _na,int &t);
friend void add(Cassistant assistant[], int _fa);
friend void dele(Cassistant assistant[], int _fa);
friend voidclosefile(Cassistant assistant[] ,int &t);
friend void _statistics(Cassistant assistant[], int&t);
};
void assistant_manage();
/*----------------------------行 政 人 员 类--------------------------------------------*/
class Cexecution:public CCommon//行政人员类
{
protected:
string politics;//政治面貌
string position;//职称
public:
void set(int _number,string _name,string _sex,int_age,string _politics,string
_position)
{
number = _number;
name = _name;
sex = _sex;
age = _age;
politics = _politics;
position = _position;
}//输入行政人员数据
void output();
~Cexecution()
{
}//析构函数
friend int find_nu(Cexecution execution[], int _nu, int&t);
friend int find_na(Cexecution execution[], string _na,int &t);
friend void add(Cexecution execution[], int _fa);
friend void dele(Cexecution execution[], int _fa);
friend void closefile(Cexecution execution[] ,int&t);
friend void _statistics(Cexecution execution[], int&t);
};
void execution_manage();
/*---------------------------行 政 人 员 兼 教 师 类-------------------------------------*/
class Ctea_exe:public CCommon//行政人员兼教师类
{
protected:
string politics;//政治面貌
string department;//所在系部
string profession;//专业
string position;//职称
public:
void set(int _number,string _name,string _sex,int_age,string _politics,string
_department,string _profession,string _position)
{
number = _number;
name = _name;
sex = _sex;
age = _age;
politics = _politics;
department = _department;
profession =_profession;
position = _position;
}//输入行政人员兼教师数据
void output();
~Ctea_exe()
{
}//析构函数
friend int find_nu(Ctea_exe tea_exe[], int _nu, int&t);
friend int find_na(Ctea_exe tea_exe[], string _na, int&t);
friend void add(Ctea_exe tea_exe[], int _fa);
friend void dele(Ctea_exe tea_exe[], int _fa);
friend void closefile(Ctea_exe tea_exe[] ,int &t);
friend void _statistics(Ctea_exe tea_exe[], int &t);
};
void tea_exe_manage();
/*---------------------------------统 计 总 人 数---------------------------------------*/
void statistics_all();//数据统计数
void statistics_teacher();
void statistics_assistant();
void statistics_execution();
void statistics_tea_exe();
void order();
const int Max = 100;//各人员总人数最大值
#endif
共设计了5个类:公有类(class CCommon), 教师类(class Cteacher),实验员类(class Cassistant),行政人员类(class Cexecution),教师兼行政人员类(class Ctea_exe)
函数部分
教师系统(部分代码)
/*----------------------------教师类中的各个函数操作-----------------------*/
void _add(Cteacher *teacher, int &t)//1教师添加信息
{
int number,age;
stringname,sex,department,profession,position;
cout<<"添加信息->请输入:"<<endl;
while(1)
{
number=t+1;
cout<<"姓名(输入0结束输入)";
cin>>name;
if("0"== name)
break;
cout<<"性别(M--man,W--woman)";
while(1)
{
cin>>sex;
if(sex =="M"||sex == "W")
{
cout<<"年龄";
cin>>age;
cout<<"系部";
cin>>department;
cout<<"专业";
cin>>profession;
cout<<"职称";
cin>>position;
teacher[t].set(number,name,sex,age,department,profession,position);
++t;
break;
}
else
cout<<"输入性别错误,请重新输入!"<<endl;
}
}
}
void _query(Cteacher teacher[], int &t)//2查询信息
{
int choice;
int flag,nu;
string na;
cout<<"1---编号,2---姓名"<<endl;
while(1)
{
cin>>flag;
if(1 == flag||2== flag)
break;
else
cout<<"输入错误请重新输入!"<<endl;
}
switch(flag)
{
case 1://编号查询
{
do
{
cout<<"请输入编号!"<<endl;
cin>>nu;
if(find_nu(teacher,nu,t) < t)
teacher[find_nu(teacher,nu,t)].output();
else
cout<<"查无此人!"<<endl;
cout<<"是否继续1是2否"<<endl;
cin>>choice;
if(choice == 2)
break;
}while(choice== 1);
};break;
case 2://姓名查询
{
do
{
cout<<"请输入姓名!"<<endl;
cin>>na;
if(find_na(teacher,na,t)<t)
teacher[find_na(teacher,na,t) ].output();
else
cout<<"查无此人!"<<endl;
cout<<"是否继续1是2否"<<endl;
cin>>choice;
if(choice == 2)
break;
}while(choice== 1);
};break;
}
}
int find_nu(Cteacher teacher[], int _nu, int &t)//编号查询方式
{
int i;
for(i=0;i<t;i++)
if(teacher[i].number==_nu)
return i;
return t;
}
int find_na(Cteacher teacher[], string _na, int &t)//姓名查询方式
{
int i;
for(i=0;i<t;i++)
if(teacher[i].name==_na)
return i;
return t;
}
void _display(Cteacher teacher[], int &t)//3显示功能
{
int i;
cout<<endl;
cout<<"编号\t姓名\t性别\t年龄\t系部\t专业\t职称"<<endl;
for(i=0;i<t;i++)
teacher[i].output();
cout<<"--------------------------------------------"<<endl<<endl;
}
void _delete(Cteacher teacher[], int &t)//删除数据
{
intscore,de,choice1;
while(1)
{
cout<<"请输入需要删除的编号!"<<endl;
cin>>score;
de=find_nu(teacher,score,t);
if(de<t)
{
teacher[ de].output();
dele(teacher,de);
}
else
cout<<"查无此人!"<<endl;
cout<<"是否继续(1是2否):";
cin>>choice1;
if(choice1 == 2)
{ cout<<"已退出!"<<endl;
break;
}
}
}
void teacher_put()//退出
{
cout<<"谢谢使用教师系统!"<<endl;
}
void teacher_manage()//教师类总调用函数-
{
Cteacherteacher[Max];
int i,t;
while (1)
{
t =openfile(teacher);//文件中的行数
teacher_muen();//打印菜单
cin >> i;
switch (i)
{
case 1:_add(teacher,t); break;//添加功能
case 2:_query(teacher, t); break;//查询功能
case 3:_display(teacher, t); break;//显示功能
case 4:_edit(teacher, t); break;//编辑功能
case 5: _delete(teacher,t); break;//删除功能
case 6:_statistics(teacher,t); break;//统计功能
default :teacher_put(); goto loop;//退出功能
}
closefile(teacher,t);
}
loop:
cout<<"--------------------------------------------"<<endl;
}
void _statistics(Cteacher teacher[], int &t)//统计数据
{
inti,boy=0,girl=0,sum=0;
for(i=0;i<t;i++)
{
if(teacher[i].sex== "W")
girl++;
if(teacher[i].sex=="M")
boy++;
}
sum = girl+boy;
cout<<"教师总共有"<<sum<<endl;
cout<<"男有"<<boy<<"人 女有"<<girl<<"人"<<endl;
}
void statistics_teacher()//教师统计函数
{
int t;
Cteacherteacher[Max];
t =openfile(teacher);
_statistics(teacher,t);
}
实验员系统(部分代码)
/*****************实 验 员*********************/
/*--------------------------添 加 数 据------------------------*/
void _add(Cassistant *assistant, int &t)
{
int number,age;
stringname,sex,laboratory,position;
cout<<"添加信息->请输入:"<<endl;
while(1)
{
number=t+1;
cout<<"姓名(输入0结束):";
cin>>name;
if(name=="0")
break;
cout<<"性别(M--man,W--woman):";
while(1)
{
cin>>sex;
if(sex =="M"||sex == "W")
{
cout<<"年龄:";
cin>>age;
cout<<"实验室:";
cin>>laboratory;
cout<<"职称:";
cin>>position;
assistant[t].set(number,name,sex,age,laboratory,position);
++t;
break;
}
else
cout<<"输入性别错误,请重新输入!"<<endl;
}
}
}//添加信息
/*------------------------查 询 数 据-----------------------------*/
void _query(Cassistant assistant[], int &t)
{
int choice;
int flag,nu;
string na;
cout<<"1---编号,2---姓名"<<endl;
while(1)
{
cin>>flag;
if(1 == flag||2== flag)
break;
else
cout<<"输入错误请重新输入";
}
switch(flag)
{
case 1://编号查询
{
do
{
cout<<"请输入编号!"<<endl;
cin>>nu;
if(find_nu(assistant,nu,t)<t)
assistant[find_nu(assistant,nu,t) ].output();
else
cout<<"查无此人!"<<endl;
cout<<"是否继续1是2否"<<endl;
cin>>choice;
if(choice == 2)
break;
}while(choice ==1);
};break;
case 2://姓名查询
{
do
{
cout<<"请输入姓名!"<<endl;
cin>>na;
if(find_na(assistant,na,t)<t)
assistant[find_na(assistant,na,t) ].output();
else
cout<<"查无此人!"<<endl;
cout<<"是否继续1是2否"<<endl;
cin>>choice;
if(choice == 2)
break;
}while(choice== 1);
};break;
};
}//查询信息
/*------------使 用 编 号 查 询 数 据 方 式--------------------*/
int find_nu(Cassistant assistant[], int _nu, int &t)
{
int i;
for(i=0;i<t;i++)
if(assistant[i].number==_nu)
return i;
return t;
}//编号查询方式
/*---------使 用 姓 名 查 询 数 据 方 式-----------------*/
int find_na(Cassistant assistant[], string _na, int&t)
{
int i;
for(i=0;i<t;i++)
if(assistant[i].name==_na)
return i;
return t;
}//姓名查询方式
/*----------------------------删 除 数 据--------------------------*/
void _delete(Cassistant assistant[], int &t)
{
intscore,de,choice1;
while(1)
{
cout<<"请输入需要删除的编号!"<<endl;
cin>>score;
de=find_nu(assistant,score,t);
if(de<t)
{
assistant[ de].output();
dele(assistant,de);
}
else
cout<<"查无此人!"<<endl;
cout<<"是否继续(1是2否):";
cin>>choice1;
if(choice1 == 2)
{
cout<<"已退出!"<<endl;
break;
}
}
}
/*-----------------统 计 数 据--------------------------------*/
void _statistics(Cassistant assistant[], int &t)
{
inti,boy=0,girl=0,sum=0;
for(i=0;i<t;i++)
{
if(assistant[i].sex=="W")
girl++;
if(assistant[i].sex=="M")
boy++;
}
sum=girl+boy;
cout<<"实验员总共有"<<sum<<endl;
cout<<"男有"<<boy<<"人 女有"<<girl<<"人"<<endl;
}//统计
/*-----------------------实 验 员 类 总 调 用 函 数-----------------------------*/
void assistant_manage()
{
Cassistantassistant[Max];
int i,t;
while (1)
{
t=openfile(assistant);
assistant_muen();//打印菜单
cin >> i;
switch (i)
{
case 1:_add(assistant,t); break;//添加功能
case 2:_query(assistant, t); break;//查询功能
case 3:_display(assistant, t); break;//显示功能
case 4:_edit(assistant, t); break;//编辑功能
case 5:_delete(assistant,t); break;//删除功能
case 6:_statistics(assistant,t); break;//统计功能
default :assistant_put(); goto loop;//退出功能
}
closefile(assistant,t);
}
loop:
cout<<"--------------------------------------------"<<endl;
}
/*--------------------------------实 验 员 统 计 函 数-----------------------------*/
void statistics_assistant()
{
int t;
Cassistant assistant[Max];
t=openfile(assistant);
_statistics(assistant,t);
}
行政人员系统(部分代码)
/*************************行 政 人 员*****************************/
/*----------------------------添 加 数 据-----------------*/
void _add(Cexecution *execution, int &t)
{
int number,age;
stringname,sex,politics,position;
cout<<"添加信息->请输入:"<<endl;
while(1)
{
number=t+1;
cout<<"姓名(输入0结束):";
cin>>name;
if(name=="0")
break;
cout<<"性别(M--man,W--woman):";
while(1)
{
cin>>sex;
if(sex =="M"||sex == "W")
{
cout<<"年龄:";
cin>>age;
cout<<"政治面貌:";
cin>>politics;
cout<<"职称:";
cin>>position;
execution[t].set(number,name,sex,age,politics,position);
++t;
break;
}
else
cout<<"输入性别错误,请重新输入!"<<endl;
}
}
}//添加信息
/*---------------------------查 询 数 据--------------------*/
void _query(Cexecution execution[], int &t)
{
int choice;
int flag,nu;
string na;
cout<<"1---编号,2---姓名"<<endl;
while(1)
{
cin>>flag;
if(1 == flag||2== flag)
break;
else
cout<<"输入错误请重新输入";
}
switch(flag)
{
case 1://编号查询
{
do
{
cout<<"请输入编号!"<<endl;
cin>>nu;
if(find_nu(execution,nu,t)<t)
execution[find_nu(execution,nu,t) ].output();
else
cout<<"查无此人!"<<endl;
cout<<"是否继续1是2否"<<endl;
cin>>choice;
if(choice == 2)
break;
}while(choice== 1);
};break;
case 2://姓名查询
{
do
{
cout<<"请输入姓名!"<<endl;
cin>>na;
if(find_na(execution,na,t)<t)
execution[ find_na(execution,na,t)].output();
else
cout<<"查无此人!"<<endl;
cout<<"是否继续1是2否"<<endl;
cin>>choice;
if(choice == 2)
break;
}while(choice ==1);
};break;
}
}//查询信息
/*-----------------使 用 编 号 查 询 数 据 方 式------------------*/
int find_nu(Cexecution execution[], int _nu, int &t)
{
int i;
for(i=0;i<t;i++)
if(execution[i].number==_nu)
return i;
return t;
}//编号查询方式
/*---------------------------使 用 姓 名 查 询 数 据 方 式 ----------------------------*/
int find_na(Cexecution execution[], string _na, int&t)
{
int i;
for(i=0;i<t;i++)
if(execution[i].name==_na)
return i;
return t;
}//姓名查询方式
/*-----------------------------------编 辑 数 据-----------------------------*/
void _edit(Cexecution execution[], int &t)
{
intscore,fa,choice;
while(1)
{ cout<<"请输入需要编辑的编号:"<<endl;
cin>>score;
fa =find_nu(execution,score,t);
if(fa<t)
{
execution[fa].output();
add(execution,fa);
}
else
cout<<"查无此人!"<<endl;
cout<<"是否继续(1是2否):";
cin>>choice;
if(choice !=1)
break;
}
}//编辑功能
/*----------------------------删 除 数 据-----------------------*/
void _delete(Cexecution execution[], int &t)
{
intscore,de,choice1;
while(1)
{
cout<<"请输入需要删除的编号!"<<endl;
cin>>score;
de=find_nu(execution,score,t);
if(de<t)
{
execution[ de].output();
dele(execution,de);
} else
cout<<"查无此人!"<<endl;
cout<<"是否继续(1是2否):";
cin>>choice1;
if(choice1 == 2)
{
cout<<"已退出!"<<endl;
break;
}
}
}
/*-------------------------统 计 数 据-----------------------------*/
void _statistics(Cexecution execution[], int &t)
{
inti,boy=0,girl=0,sum=0;
for(i=0;i<t;i++)
{
if(execution[i].sex=="W")
girl++;
if(execution[i].sex=="M")
boy++;
}
sum=girl+boy;
cout<<"实验员总共有"<<sum<<endl;
cout<<"男有"<<boy<<"人 女有"<<girl<<"人"<<endl;
}//统计
/*--------------------------------退 出--------------------------------*/
void execution_put()
{
cout<<"谢谢使用教师系统!"<<endl;
}//退出
/*-----------------------行 政 人 员 类 总 调 用 函 数-----------------*/
void execution_manage()
{
Cexecutionexecution[Max];
int i,t;
while (1)
{
t=openfile(execution);
execution_muen();//打印菜单
cin >> i;
switch (i)
{
case 1:_add(execution,t); break;//添加功能
case 2:_query(execution, t); break;//查询功能
case 3:_display(execution, t); break;//显示功能
case 4:_edit(execution, t); break;//编辑功能
case 5:_delete(execution,t); break;//删除功能
case 6:_statistics(execution,t); break;//统计功能
default :execution_put(); goto loop;//退出功能
}
closefile(execution,t);
}
loop:
cout<<"--------------------------------------------"<<endl;
}
行政人员兼教师系统(部分代码)
*************************行 政 人 员 兼 教 师******************/
//主菜单
/*----------------------------添 加 数 据-------------------------*/
void _add(Ctea_exe *tea_exe, int &t)
{
int number,age;
stringname,sex,politics,department,profession,position;
cout<<"添加信息->请输入:"<<endl;
while(1)
{
number=t+1;
cout<<"姓名(输入0结束):";
cin>>name;
if(name == "0")
break;
cout<<"性别(M--man,W--woman):";
while(1)
{
cin>>sex;
if(sex =="M"||sex == "W")
{
cout<<"年龄:";
cin>>age;
cout<<"政治面貌:";
cin>>politics;
cout<<"系部:";
cin>>department;
cout<<"专业:";
cin>>profession;
cout<<"职称:";
cin>>position;
tea_exe[t].set(number,name,sex,age,politics,department,profession,position
);
++t;
break;
}
else
cout<<"输入性别错误,请重新输入!"<<endl;
}
}
}//添加信息
/*----------------------------------查 询 数 据-----------------------------*/
void _query(Ctea_exe tea_exe[], int &t)
{
int choice;
int flag,nu;
string na;