职工管理系统------码字不易,转载请声明出处 作者水平有限,如有问题,多多交流

1.项目需求:

2.实现的功能

3.项目架构

4.具体实现(代码附后面)

a.创建主函数源文件

创建主函数源文件(职工管理系统.app) 在此文件中用switch语句实现功能选择,具体的操作在管理类中实现

b.创建管理类

创建管理类workerManager(包括头文件和源文件) 之后的功能实现都在此源文件中实现

c.实现第4和5步

在管理类中先实现第4和5步(注意函数应先在.h文件中声明,具体在.pp文件中实现)具体实现看代码–有注释

d.完成第6步

使用多态的知识,创建职工(worker)类作为父类,其中包含三个属性(员工编号、姓名和部门编号)和两个函数(显示信息函数和获取部门函数),分别创建员工(Employee)类、经理(Manager)类和老板(Boss)类这三个子类 各部分代码如下:(由于父类worker不需要实现,故用纯虚函数代替) worker.h

#pragma once

#include

#include

using namespace std;

//职工抽象类 (父类)

class Worker

{

public:

//显示个人信息

virtual void showInfo()=0;

//获取岗位名称

virtual string getDeptName() = 0;

int m_id;

string m_name;

int m_deptId;

};

Employee.h

#pragma once

#include

#include

using namespace std;

#include"worker.h"

class Employee :public Worker

{

public:

//构造函数

Employee(int id,string name,int dId);

//显示个人信息

virtual void showInfo();

//获取岗位名称

virtual string getDeptName();

};

Employee.cpp

#include"employee.h"

#include

//构造函数

Employee::Employee(int id,string name ,int dId)

{

this->m_id = id;

this->m_name = name;

this->m_deptId = dId;

}

//显示个人信息

void Employee::showInfo()

{

cout << "职工编号:" << this->m_id

<< "\t职工姓名:" << this->m_name

<< "\t岗位:" << this->getDeptName()

<< "\t岗位职责:完成经理交给的任务" << endl;

}

//获取岗位名称

string Employee::getDeptName()

{

return string("员工");

}

Manager.h

#pragma once

#include

#include

using namespace std;

#include"worker.h"

//经理类

class Manager :public Worker

{

public:

Manager(int id, string name, int dId);

//显示个人信息

virtual void showInfo() ;

//获取岗位名称

virtual string getDeptName();

};

Manager.cpp

#include"manager.h"

Manager::Manager(int id,string name,int dId)

{

this->m_id = id;

this->m_name = name;

this->m_deptId = dId;

}

//显示个人信息

void Manager::showInfo()

{

cout << "职工编号:" << this->m_id

<< "\t职工姓名:" << this->m_name

<< "\t岗位:" << this->getDeptName()

<< "\t岗位职责:完成老板交给的任务,并下发任务给员工" << endl;

}

//获取岗位名称

string Manager::getDeptName()

{

return string("经理");

}

Boss.h

#pragma once

#include

#include

using namespace std;

#include"worker.h"

//老板类

class Boss :public Worker

{

public:

Boss(int id,string name,int dId);

virtual void showInfo();

//获取岗位名称

virtual string getDeptName();

};

Boss.cpp

#include"boss.h"

Boss::Boss(int id, string name, int dId)

{

this->m_id = id;

this->m_name = name;

this->m_deptId = dId;

}

void Boss::showInfo()

{

cout << "职工编号:" << this->m_id

<< "\t职工姓名:" << this->m_name

<< "\t岗位:" << this->getDeptName()

<< "\t岗位职责:管理公司所有事务" << endl;

}

//获取岗位名称

string Boss::getDeptName()

{

return string("老板");

}

e.完成添加职工操作

先需要在workerManager类中定义两个属性(此时类中员工数和存放员工的数组),由于员工不是一类,故数组中存放的是子类的地址,子类创建出来本身就是数组,故workerManager类中创建的数组是存放数组的数组(方法为://职工数组指针Worker** m_EmpArray;) 然后完成添加职工的操作,批量添加,创建新的数组(大小变为原人数加加新添加成员人数),将原有成员复制到新数组中,在添加新的职工,具体看代码实现。

f.完成8和9步

将数据存入文件中,否则程序一关闭,堆区数据丢失,找不到之前的文件信息。

g.完成后面的部分

具体操作参照d步,代码中都有注释,详情看代码。

5.上代码

workerManager.h

#pragma once//防止头文件重复包含

#include//包含输入输出流头文件

#include

using namespace std;//使用标准的命名空间

#include"worker.h"

#include"employee.h"

#include"manager.h"

#include"boss.h"

#define FILENAME "empFile.txt"

class WorkerManager

{

public:

WorkerManager();

//显示菜单

void showMenu();

//退出系统

void ExitSystem();

//添加职工功能

void AddEmp();

//保存文件

void save();

//统计文件中人数

int get_EmpNum();

//初始化员工

void init_Emp();

//显示职工信息

void show_Emp();

//删除职工

void Del_Emp();

//按照职工编号判断职工是否存在,若存在返回职工在数组中的位置,不存在返回-1

int IsExist(int id);

//修改职工

void Mod_Emp();

//按照编号查找职工

void Find_EmpByBh();

//按照姓名查找职工

void Find_EmpByName();

//排序职工

void Sort_Emp();

//清空文件

void Clean_File();

//判断文件是否为空标志

bool m_fileIsEmpty;

//记录职工人数

int m_EmpNum;

//职工数组指针

Worker** m_EmpArray;

~WorkerManager();

};

workerManager.cpp

#include"workerManager.h"

WorkerManager::WorkerManager()

{

//1.文件不存在

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;

}

//2.文件存在 数据为空

char ch;

ifs >> ch;

if (ifs.eof())

{

//文件为空

/*cout << "文件为空" << endl;*/

//初始化记录人数

this->m_EmpNum = 0;

//初始化数组指针

this->m_EmpArray = NULL;

//初始化文件是否为空

this->m_fileIsEmpty = true;

ifs.close();

return;

}

//3.文件存在,并记录数据

int num = this->get_EmpNum();

//cout << "职工人数为:" << num << endl;

this->m_EmpNum = num;

//开辟空间

this->m_EmpArray = new Worker * [this->m_EmpNum];

//将文件中的数据,存到数组中

this->init_Emp();

//测试文件

//for (int i = 0; i < this->m_EmpNum; i++)

//{

// cout << "职工编号:" << this->m_EmpArray[i]->m_id

// << "\t姓名:" << this->m_EmpArray[i]->m_name

// << "\t部门:" << this->m_EmpArray[i]->m_deptId << endl;

//}

}

//统计文件中人数

int WorkerManager::get_EmpNum()

{

ifstream ifs;

ifs.open(FILENAME, ios::in);//打开文件 读

int id;

string name;

int dId;

int num = 0;

while (ifs >> id && ifs >> name && ifs >> dId)

{

//统计人数变量

num++;

}

return num;

}

//展示菜单

void WorkerManager::showMenu()

{

cout << "************************************************" << endl;

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 << "************************************************" << endl;

cout << endl;

}

//保存文件

void WorkerManager::save()

{

ofstream ofs;

ofs.open(FILENAME, ios::out);//用输出的方式代开文件 --写文件

//将每个人的数据写入文件中

for (int i = 0; i < this->m_EmpNum; i++)

{

ofs << this->m_EmpArray[i]->m_id << " "

<< this->m_EmpArray[i]->m_name << " "

<< this->m_EmpArray[i]->m_deptId << endl;

}

ofs.close();

}

void WorkerManager::ExitSystem()

{

cout << "欢迎下次使用" << endl;

system("pause");

exit(0);//退出系统

}

void WorkerManager::AddEmp()

{

cout << "请输入添加职工数量:" << endl;

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];

}

}

//批量添加新成员

for (int i = 0; i < addNum; i++)

{

int id;//职工编号

string name;//职工姓名

int dSelect;//部门选项

while (true)

{

cout << "请输入第" << i + 1 << "位新职工的编号:" << endl;

cin >> id;

int ret = this->IsExist(id);

/*cout << "ret=" << ret << endl;*/

if (ret==-1)

{

break;

}

cout << "您输入的编号已存在" << endl;

}

cout << "请输入第" << i+1<< "位新职工的姓名:" << endl;

cin >> name;

cout << "请选择第" << i+1<< "位新职工的职位:" << endl;

cout << "1.员工" << endl;

cout << "2.经理" << endl;

cout << "3.老板" << endl;

cin >> dSelect;

Worker* Worker = NULL;

switch (dSelect)

{

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:

break;

}

//将创建职工职责,保存到数组中

newSpace[this->m_EmpNum + i] = Worker;

}

//释放原有空间

delete[] this->m_EmpArray;

//更新新空间指向

this->m_EmpArray = newSpace;

//更新新的职工人数

this->m_EmpNum = newSize;

//更新职工不为空标志

this->m_fileIsEmpty = false;

//提示添加成功

cout << "成功添加" << addNum << "名新职工" << endl;

//保存数据到文件中

this->save();

//按任意键后 清屏回到上级目录

system("pause");

system("cls");

}

else

{

cout << "输入数据有误" << endl;

}

}

//初始化员工

void WorkerManager::init_Emp()

{

ifstream ifs;

ifs.open(FILENAME, ios::in);

int id;

string name;

int dId;

int index = 0;

while (ifs >> id && ifs >> name && ifs >> dId)

{

Worker* worker = NULL;

if (dId == 1)//普通员工

{

worker = new Employee(id, name, dId);

}

if (dId == 2)//经理

{

worker = new Manager(id, name, dId);

}

if (dId == 3)//经理

{

worker = new Boss(id, name, dId);

}

this->m_EmpArray[index] = worker;

index++;

}

//关闭文件

ifs.close();

}

//显示职工信息

void WorkerManager::show_Emp()

{

//判断文件是否为空

if (this->m_fileIsEmpty)

{

cout << "文件不存在或数据被清空" << endl;

}

else

{

for (int i = 0; i < this->m_EmpNum; i++)

{

//利用多态调用程序接口

this->m_EmpArray[i]->showInfo();

}

}

//按任意键后清屏

system("pause");

system("cls");

}

//按照职工编号判断职工是否存在,若存在返回职工在数组中的位置,不存在返回-1

int WorkerManager::IsExist(int id)

{

int index = -1;

for (int i = 0; i < this->m_EmpNum; i++)

{

if (this->m_EmpArray[i]->m_id == id)

{

index = i;

break;

}

}

return index;

}

//删除职工

void WorkerManager::Del_Emp()

{

if (this->m_fileIsEmpty)

{

cout << "文件不存在或记录为空" << endl;

}

else

{

int id;

cout << "请输入要删除员工编号:" << endl;

cin >> id;

int index = this->IsExist(id);

if (index!=-1)

{

for (int i = index; i < this->m_EmpNum - 1; i++)

{

//数据前移

this->m_EmpArray[i] = this->m_EmpArray[i + 1];

}

this->m_EmpNum--;//更新数组中记录人员个数

//若数组中记录人员个数为0 则更新文件是否为空

this->m_fileIsEmpty = (this->m_EmpNum == 0 ? true : false);

//数据同步更新到文件

this->save();

cout << "删除成功!" << endl;

}

else

{

cout << "删除失败,未找到该职工" << endl;

}

}

//按任意键 清屏

system("pause");

system("cls");

}

//修改职工

void WorkerManager::Mod_Emp()

{

if (this->m_fileIsEmpty)

{

cout << "文件不存在或记录为空" << endl;

}

else

{

cout << "请输入需要修改职工的编号:" << endl;

int id = 0;

cin >> id;

int index = this->IsExist(id);

if (index != -1)

{

//查找到编号的职工

delete this->m_EmpArray[index];

int newId = 0;

string newName = " ";

int dSelect = 0;

cout << "查到:" << id << "号职工,请输入新职工号:" << endl;

cin >> newId;

cout << "请输入姓名:" << endl;

cin >> newName;

cout << "请输入岗位:" << endl;

cout << "1.普通员工" << endl;

cout << "2.经理" << endl;

cout << "3.老板" << endl;

cin >> dSelect;

Worker* worker = NULL;

switch (dSelect)

{

case 1:

worker = new Employee(newId, newName, 1);

break;

case 2:

worker = new Manager(newId, newName, 2);

break;

case 3:

worker = new Boss(newId, newName, 3);

break;

default:

break;

}

//更新数据到数组中

this->m_EmpArray[index] = worker;

cout << "修改成功!" << endl;

//保存到文件中

this->save();

}

else

{

cout << "修改失败,查无此人!" << endl;

}

}

//按任意键清屏

system("pause");

system("cls");

}

//按照编号查找职工

void WorkerManager::Find_EmpByBh()

{

if (this->m_fileIsEmpty)

{

cout << "文件不存在或记录为空" << endl;

}

else

{

cout << "请输入您要查找职工的编号:" << endl;

int id;

cin >> id;

int ret = IsExist(id);

if (ret != -1)

{

cout << "查找成功!该职工信息如下:" << endl;

this->m_EmpArray[ret]->showInfo();

}

else

{

cout << "查找不到您要找的编号的员工" << endl;

}

}

//按任意键清屏

system("pause");

system("cls");

}

//按照姓名查找职工

void WorkerManager::Find_EmpByName()

{

if (this->m_fileIsEmpty)

{

cout << "文件不存在或记录为空" << endl;

}

else

{

cout << "请输入您要查找职工的姓名:" << endl;

string name=" ";

cin >> name;

int flag = 0;

for (int i = 0; i < m_EmpNum; i++)

{

if (this->m_EmpArray[i]->m_name ==name)

{

this->m_EmpArray[i]->showInfo();

flag++;

}

}

if (flag == 0)

{

cout << "没有您输入名字的员工" << endl;

}

}

//按任意键清屏

system("pause");

system("cls");

}

//排序职工

void WorkerManager::Sort_Emp()

{

if (this->m_fileIsEmpty)

{

cout << "文件不存在或数据为空!" << endl;

system("pause");

system("cls");

}

else

{

cout << "请选择排序方式:" << endl;

cout << "1.按职工序号升序" << endl;

cout << "2.按职工序号降序" << endl;

int select = 0;

cin >> select;

for (int i = 0; i < m_EmpNum; i++)

{

int minormax = i;

for (int j = i + 1; j < m_EmpNum; j++)

{

if (select == 1)//升序

{

if (m_EmpArray[minormax]->m_id > m_EmpArray[j]->m_id)

{

minormax = j;

}

}

else//降序

{

if (m_EmpArray[minormax]->m_id < m_EmpArray[j]->m_id)

{

minormax = j;

}

}

}

if (i != minormax)

{

Worker* temp = m_EmpArray[i];

m_EmpArray[i] = m_EmpArray[minormax];

m_EmpArray[minormax] = temp;

}

}

cout << "排序成功,排序后结果为:" << endl;

this->save();

this->show_Emp();

system("pause");

system("cls");

}

}

//清空文件

void WorkerManager::Clean_File()

{

cout << "确认清空?" << endl;

cout << "1.确认" << endl;

cout << "2.返回" << endl;

int select = 0;

cin >> select;

if (select == 1)

{

//打开模式 ios::trunc 如果删除文件并重新创建

ofstream ofs(FILENAME, ios::trunc);

ofs.close();

if (this->m_EmpArray != NULL)

{

for (int i = 0; i < this->m_EmpNum; i++)

{

if (this->m_EmpArray[i] != NULL)

{

delete this->m_EmpArray[i];

}

}

//删除堆区数组指针

this->m_EmpNum = 0;

delete[] this->m_EmpArray;

this->m_EmpArray = NULL;

this->m_fileIsEmpty = true;

}

cout << "文件已清空!" << endl;

}

//任意键清空

system("pause");

system("cls");

}

WorkerManager::~WorkerManager()

{

if (this->m_EmpArray != NULL)

{

//删除堆区的每个职工对象

for (int i = 0; i < this->m_EmpNum; i++)

{

if (this->m_EmpArray[i] != NULL)

{

delete this->m_EmpArray[i];

}

}

delete[] this->m_EmpArray;

this->m_EmpArray = NULL;

}

}

main.cpp

#include

#include"workerManager.h"

using namespace std;

#include"worker.h"

//#include"employee.h"

//#include"manager.h"

//#include"boss.h"

int main()

{

//实例化管理者对象

WorkerManager wm;

int choice = 0;//用来存储用户选项

while (true)

{

//调用展示菜单成员函数

wm.showMenu();

cout << "请输入您的选择:" << endl;

cin >> choice;

switch (choice)

{

case 0://推出系统

wm.ExitSystem();

break;

case 1://增加职工

wm.AddEmp();

break;

case 2://显示职工

wm.show_Emp();

break;

case 3://删除职工

wm.Del_Emp();

break;

case 4://修改职工

wm.Mod_Emp();

break;

case 5://查找职工

{

cout << "请选择您通过编号或者姓名查找员工:" << endl;

cout << "1.编号\t2.姓名" << endl;

int Select = 0;

cin >> Select;

if (Select == 1)

{

wm.Find_EmpByBh();

}

else if (Select == 2)

{

wm.Find_EmpByName();

}

else

{

cout << "您输入有误,按任意键返回上级菜单" << endl;

system("pause");

system("cls");

}

break;

}

case 6://排序职工

wm.Sort_Emp();

break;

case 7://清空文档

wm.Clean_File();

break;

default:

system("cls");//清平操作

break;

}

}

system("pause");

return 0;

}

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: