职工管理系统
这两天在B站上看c++,看到老师写了一个职工管理系统,整体框架都在,结果写了一个c风格的职工管理系统,然后就又看着老师的管理系统来了一遍
写职工管理系统的时候C++的优势一下就体现出来了
- c++ 代码可以解决升级指针调用麻烦的问题,一个类中加入指针,可以在类函数中解决掉升级指针的问题,变量也可以在不同的函数中共享,在c语言中就必须去升级指针去在不同的函数中调用,对于普通变量如果不去加入指针就要去使用全局变量。
- 由于有了父类,就可以在父类中去写不同职工之间相同的内容(姓名,编号,职位),提供了一个整体的模板,只需要再去子类中写不同的东西就可以了
- 在去打印职工信息的时候,纯虚函数方便的多,要的内容有差异,但是只需要调用同一个函数,就可以去做不同的事情,属实很香,c就得去一个个的区分 ,代码量会大很多
- 不需要去定义全局变量,比如很多函数会判断文件是否为空,不使用全局变量的话,就需要一次次的调用函数,效率自然会降低,C++就可以在父类中定义一个变量,增加了函数的封装性,可移植性也增强
分文件去写,也不用在一个文件中不断的去找东西,不同类型的东西放在不同的柜子里总归是好
分文件去写,也不用在一个文件中不断的去找东西,不同类型的东西放在不同的柜子里总归是好找的多。
说几个这个管理系统的缺点吧
- 用的是指针数组存储的每个人信息,没有用链表,每次加入 / 删除新职员的时候就需要去创建一个新的指针数组去重新存储,再释放掉原本开辟的内存,让维护的指针重新改变指向
- 用指针数组会在对编号进行排序的时候产生问题,如果职工足够的多,还能不能满足的了需求就难说了
- 删除掉一个人的信息时,开辟、释放内存之后,修改指针指向,对文件操作时,又将文件原有的内容全部删除,再去重新按照这个指针数组去写入内容,实在是太垮了,后面自己得改改这个东西,属实写的有的臭了
虽然这个管理系统效率上有很大的缺点,但是学习价值还是可以的,可以理解一些c++的内容
成果展示
-
- 添加新职工
- 添加新职工
-
2.显示所有职工信息
-
3.修改职工信息
-
4.查找职工具体信息
-
5.按照职工编号进行排序
这个管理系统分文件进行写,这样让不同功能的代码进行分区,更容易进行多人开发,自己找也比一个文件方便的多
代码展示
菜单类
该职工管理系统使用了四个类,
第一个类workerManager,这是对整个系统进行维护,并且去创建一些需要在菜单界面需要调用的函数
对系统进行一个整体的包裹
class WorkerManager
{
public :
//记录员工数
int m_EmpNum;
//二级指针维护创建的数组
Worker ** m_EmpArray;
//判断文件是否为空
bool m_FileIsEmpty = false;
WorkerManager();
void Add_Emp();
//菜单
void Show_Menu();
//退出
void Exit_System();
//保存数据到文件
void save();
//得到员工数量
int get_EmpNum();
//读取职工信息到指针
void Init_Emp();
//显示职工信息
void Display();
//删除职工时,判断职工是否存在
int IsExist(string name);
//删除离职职工
void Del_Emp();
//修改职工信息
void Change_Emp();
//查找职工信息
void Find_Emp();
//对职工编号进行排序
void Sort();
//清空文档
void Truc_File();
~WorkerManager();
};
对workerManager类构造函数的实现
目的就是统计职工总人数,并且将文件的内容读取到指针中
还有个重要的细节
m_FileIsEmpty 用来判断文件是否为空,要注意这个标志什么时候需要改,如果不及时改会读取不出内容
WorkerManager :: WorkerManager()
{
ifstream ifs;
ifs.open(FILENAME,ios :: in);
//文件未创建
if(!ifs.is_open())
{
cout << "文件不存在" << endl;
this -> m_EmpNum = 0;
this -> m_EmpArray = NULL;
this -> m_FileIsEmpty = true;
ifs.close();
return ;
}
//文件存在,并且没有记录
char ch;
ifs >> ch;
if(ifs.eof())
{
cout << "文件为空!" << endl;
this -> m_EmpNum = 0;
this -> m_FileIsEmpty = true;
this -> m_EmpArray = NULL;
ifs.close();
return ;
}
int num = this -> get_EmpNum();
cout << "职工个数为 : " << num << endl;
this -> m_EmpNum = num;
this -> Init_Emp();
}
首先要判断文件内容是否为空,如果不为空,去统计出职工个数,并且去添加维护指针的内容,方便调用
职工类
第二个类是对职工类进行一个包裹,提供一个模板,就好比大家常用的ppt模板,提供一个框架,用户往里面去填充内容
worker纯虚函数,提供一个函数空框架,让不同类对同一个函数有不同的改变
三个变量创建在worker 是因为老板类,职工类,经理类都有这几个变量,可以直接调用
class Worker
{
public :
//显示个人信息
virtual void showInfo() = 0;
//获取岗位名称
virtual string getDeptName() = 0;
int Mid; // 编号
string Name; //姓名
int Did; //职工所在部门编号
};
老板类:
class Boss : public Worker
{
public :
Boss(int mid,string name,int did);
virtual void showInfo();
virtual string getDeptName();
};
老板类的具体实现:
Boss :: Boss(int mid,string name,int did)
{
Mid = mid;
Name = name;
Did = did;
}
void Boss :: showInfo()
{
cout << " " << Mid
<< "\t\t" << Name
<< "\t\t" << this -> getDeptName()
<< "\t\t" << "管理公司所有事务 " << endl;
}
string Boss :: getDeptName()
{
return "总裁";
}
其他两个类实现和老板类基本差不多,就不贴代码了
重要功能代码
只要会了添加职工,就基本已经完成了一大半了
void WorkerManager :: Add_Emp()
{
cout << "请输入增加员工的数量:";
int addNum = 0;
cin >> addNum;
if(addNum > 0)
{
//添加职工后的人数
int newSize = this -> m_EmpNum + addNum;
//开辟一个新的指针数组,用来重新存储职工信息
Worker ** newSpace = new Worker *[newSize];
if(this -> m_EmpArray != NULL)
{
//读取到原有的职工信息
for(int i = 0; i < this -> m_EmpNum ; ++ i)
{
newSpace[i] = this -> m_EmpArray[i];
}
}
int k = addNum;
//继续添加职工信息
for(int i = 0 ; i < addNum ; ++ i)
{
int id ;
string name;
int did;
cout << "请输入第 " << i + 1 << " 个新员工编号 : " << endl;
cin >> id;
cout << "请输入第 " << i + 1 << " 个新员工姓名 :" << endl;
cin >> name;
cout << "请输入第 " << i + 1 << " 个新员工职位 :" << endl;
cout << "1、普通职工" << endl;
cout << "2、经理" << endl;
cout << "3、老板" << endl;
cin >> did;
Worker * worker = NULL;
switch(did)
{
case 1 :
worker = new Employee(id,name,1);
break;
case 2 :
worker = new Manager(id,name,2);
break;
case 3 :
worker = new Boss(id,name,3);
break;
default :
cout << "输入职工类有误" << endl;
k -- ;
continue;
break;
}
newSpace[this -> m_EmpNum + i] = worker;
}
//释放掉指针原来指向的内存
delete[] this -> m_EmpArray;
//修改指向为刚刚创建的新内存
this -> m_EmpArray = newSpace;
//修改职工人数大小
this -> m_EmpNum = newSize;
cout << "成功添加 " << k << " 名新职工!" << endl;
//保存内容到文件
this -> save();
//如果不修改这个值,在文件为空的情况下去添加职工后,进行读取的时候
//不能读取到内容,因为显示函数会首先判断文件是否为空,为空直接退出函数
this -> m_FileIsEmpty = false;
}
else
{
cout << "输入有误" << endl;
}
}
再学习对文件进行操作,把握住其他部分,职工管理系统就算完成了
void WorkerManager :: save()
{
ofstream ofs;
ofs.open(FILENAME,ios :: out);
if(!ofs.is_open())
{
cout << "打开失败" << endl;
}
for(int i = 0 ; i < this -> m_EmpNum ; ++ i)
{
//存储时用空格分隔开
ofs << this -> m_EmpArray[i] -> Mid << " "
<< this -> m_EmpArray[i] -> Name << " "
<< this -> m_EmpArray[i] -> Did << endl;
}
ofs.close();
}
我就不贴出自己写的纯c的c++职工管理系统了,太拉垮了