基本情况说明:
公司的职工分为三类:普通职工,经理,老板,显示信息时需要显示职工的编号、姓名、岗位、以及职责。
普通员工:完成经理下发的任务
经理:完成老板下发的任务,并且分发任务给员工
老板:完成公司大大小小的所有任务
管理系统中需要实现的功能如下:
- 退出管理系统
- 增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工的信息为:职工编号,职工姓名,部门编号
- 显示职工信息:显示公司所有职工的信息
- 删除离职职工:按照编号删除指定的职工
- 修改职工信息:按照编号修改职工的信息
- 查找职工信息:按照职工的编号或者职工的姓名查找职工的信息
- 按照编号排序:按照职工的编号,进行排序,排序规则由用户指定
- 清空所有文档:清空文件中所有的职工信息,清空前需要确认
1、创建项目
点击VS图标—>创建新项目—>空项目—>输入项目名称—>右击源文件点添加—>点击新建项—>修改名称(博主这里修改为main.cpp),是为了与其他的cpp文件分开—>输入文件编写模板
模板:
#include<iostream>
using namespace std;
int main()
{
system("pause");
return 0;
}
2、创建管理类
添加和workerManager.cpp文件,并添加workerManager类,并且给一个构造函数和析构函数的空实现
头文件创建过程:右击头文件—>添加—>新建项—>选中.h文件修改名称为workerManager.h—>添加
源文件同理
workerManager.h
#pragma once
#include<iostream>
using namespace std;
class workerManager
{
workerManager();
~workerManager();
};
workerManager.cpp
#include"workerManager.h"
workerManager::workerManager()
{
}
workerManager::~workerManager()
{
}
3、菜单功能
- 在管理类workerManager.h中添加成员函数 void showMenu();
void showMenu();
- 在管理类workerManager.cpp中实现 showMenu()函数
void workerManager::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 << endl;
}
- 在职工管理系统.cpp中测试菜单功能
4、退出功能
1、在main函数中提供分支选择,提供每个功能接口
#include"workerManager.h"
#include<iostream>
using namespace std;
int main()
{
workerManager wm;
while (true)
{
wm.showMenu();
int select = 0;
cout << "请输入您的选择:" << endl;
cin >> select;
switch (select)
{
case 0:
wm.exitSystem();
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
default:
system("cls");
break;
}
}
system("pause");
return 0;
}
2、实现退出功能
- 在workerManager.h中提供相应的退出系统的成员函数 void exitSystem();
void exitSystem();
- 在workerManager.cpp文件具体实现
void workerManager::exitSystem()
{
cout << "欢迎下次使用职工管理系统!" << endl;
system("pause");
exit(0);
}
5、创建职工类
1、创建职工抽象类
- 创建文件worker.h文件
- 在.h文件中添加三个成员属性—职工编号,职工姓名,职工所在部门编号
- 添加三个纯虚函数—显示个人信息,获得岗位名称—获取各个岗位的职责
#pragma once
#include<iostream>
using namespace std;
class Worker
{
public:
//1、显示个人信息,
virtual void show_Person_Information() = 0;
//2、获得岗位名称
virtual string obtain_Post_Name() = 0;
//3、获取各个岗位的职责
virtual string obtain_Post_Duty() = 0;
int staff_Id;
string staff_Name;
int staff_Department_Id;
};
2、创建普通员工类
- 继承抽象职工类,重写父类中的纯虚函数
- 在源文件和头文件中创建employee.cpp和employee.h文件
- 给出构造函数初始化成员属性
#pragma once
#include"worker.h"
class Employee:public Worker
{
public:
Employee(int id,string name,int pId);
void show_Person_Information();
string obtain_Post_Name();
string obtain_Post_Duty();
};
#include"employee.h"
Employee::Employee(int Id, string name, int pId)
{
this->staff_Id = Id;
this->staff_Name = name;
this->staff_Department_Id = pId;
}
void Employee::show_Person_Information()
{
cout << "职工编号:" << this->staff_Id
<< "\t职工姓名:" << this->staff_Name
<< "\t职工岗位:" << this->obtain_Post_Name()
<< "\t岗位职责:" << this->obtain_Post_Duty() << endl;
}
string Employee::obtain_Post_Name()
{
return "普通员工";
}
string Employee::obtain_Post_Duty()
{
return "完成经理交给的任务";
}
3、创建经理类
- 继承抽象职工类,重写父类中的纯虚函数
- 在源文件和头文件中创建manager.cpp和manager.h文件
#pragma once
#include"worker.h"
class Manager :public Worker
{
public:
Manager(int id, string name, int pId);
void show_Person_Information();
string obtain_Post_Name();
string obtain_Post_Duty();
};
#include"manager.h"
Manager::Manager(int Id, string name, int pId)
{
this->staff_Id = Id;
this->staff_Name = name;
this->staff_Department_Id = pId;
}
void Manager::show_Person_Information()
{
cout << "职工编号:" << this->staff_Id
<< "\t职工姓名:" << this->staff_Name
<< "\t职工岗位:" << this->obtain_Post_Name()
<< "\t岗位职责:" << this->obtain_Post_Duty() << endl;
}
string Manager::obtain_Post_Name()
{
return "经理";
}
string Manager::obtain_Post_Duty()
{
return "完成老板交给的任务,并把任务下发给员工";
}
4、创建老板类
- 继承抽象职工类,重写父类中的纯虚函数
- 在源文件和头文件中创建boss.cpp和boss.h文件
#pragma once
#include"worker.h"
class Boss :public Worker
{
public:
Boss(int id, string name, int pId);
void show_Person_Information();
string obtain_Post_Name();
string obtain_Post_Duty();
};
#include"boss.h"
Boss::Boss(int Id, string name, int pId)
{
this->staff_Id = Id;
this->staff_Name = name;
this->staff_Department_Id = pId;
}
void Boss::show_Person_Information()
{
cout << "职工编号:" << this->staff_Id
<< "\t职工姓名:" << this->staff_Name
<< "\t职工岗位:" << this->obtain_Post_Name()
<< "\t岗位职责:" << this->obtain_Post_Duty() << endl;
}
string Boss::obtain_Post_Name()
{
return "老板";
}
string Boss::obtain_Post_Duty()
{
return "完成公司大大小小的所有任务";
}
5、测试是否能够产生多态
- 在main函数添加测试文件
//测试代码
Worker* worker = NULL;//父类的指针
worker = new Employee(1, "张三", 1);//子类的对象
worker->show_Person_Information();
delete worker;
worker = new Manager(2, "李四", 2);
worker->show_Person_Information();
delete worker;
worker = new Boss(3, "王五", 3);
worker->show_Person_Information();
delete worker;
- 运行效果如下:
6、添加职工
功能描述:批量添加职工,并且保存在文件中
1、功能分析
用户在批量创建时,可能会创建不同种类的员工,我们需要将信息存放在一个数组中,但是数组中必须保存相同的数据类型。所有我们需要将父类的指针worker*保存在数值中,通过多态指向子类的对象。并且将指针开辟到堆区,通过worker**维护这个指针。
2、功能实现
- 在workerManager.h的头文件中添加成员属性
1、记录文件中人数个数
2、员工数组的指针
void addWorkerInformation();
//记录文件中人数个数
int file_Person_Number;
//员工数组的指针
Worker** worker_Array_Pointer;
- 在workerManager的构造函数中初始化属性
- 在workerManager.h中添加成员函数 增加职工
- 在workerManager.cpp文件中实现这个函数
步骤:
1、输入增加职工的数量
2、计算新的空间大小
3、开辟新的空间
4、将原先空间的内容存放到现有空间下
5、输入新的数据
6、释放原有的空间
7、更改空间的指向
8、更新新空间的个数
9、提示信息
void workerManager::addWorkerInformation()
{
cout << "请输入需要添加职工的人数:" << endl;
int add_Worker_Number=0;
cin >> add_Worker_Number;
if (add_Worker_Number > 0)
{
int new_Space_Size = this->file_Person_Number + add_Worker_Number;
Worker **new_Space =new Worker*[new_Space_Size];
if (this->worker_Array_Pointer != NULL)
{
for (int i = 0; i < this->file_Person_Number; i++)
{
new_Space[i] = this->worker_Array_Pointer[i];
}
}
for (int i = 0; i < add_Worker_Number; i++)
{
int Id;
string name;
int department_Select;
cout << "请输入第:" << i + 1 << "个新职工的编号:" << endl;
cin >> Id;
cout << "请输入第:" << i + 1 << "个新职工的姓名:" << endl;
cin >> name;
cout << "请输入该职工的岗位:" << endl;
cout << "1、普通职工" << endl;
cout << "2、经理" << endl;
cout << "3、老板" << endl;
cin >> department_Select;
Worker* worker = NULL;
switch (department_Select)
{
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;
}
new_Space[this->file_Person_Number + i] = worker;
}
delete[]this->worker_Array_Pointer;
this->worker_Array_Pointer = new_Space;
this->file_Person_Number = new_Space_Size;
cout << "成功添加" << add_Worker_Number << "名新的职工" << endl;
}
else
{
cout << "您输入的人数有误!" << endl;
system("pause");
}
system("pause");
system("cls");
}
- 释放堆区的空间
workerManager::~workerManager()
{
if (this->worker_Array_Pointer != NULL)
{
delete this->worker_Array_Pointer;
this->worker_Array_Pointer = NULL;
}
}
7、文件交互-写文件
功能描述:对文件进行读写
1、设置文件路径
在workerManager.h中添加宏常量,并且包含头文件fstream
2、成员函数声明
在workerManager.h中添加成员函数 void save*()
void saveFile();
3、成员函数具体实现
1、创建流对象
2、用输出的方式打开文件—写文件
3、将每个人数据写道文件中
4、关闭文件
void workerManager::saveFile()
{
ofstream ofs;
ofs.open(FILENAME, ios::out);
for (int i = 0; i < this->file_Person_Number; i++)
{
ofs << this->worker_Array_Pointer[i]->staff_Id << " "
<< this->worker_Array_Pointer[i]->staff_Name << " "
<< this->worker_Array_Pointer[i]->staff_Department_Id << " "
<< endl;
}
ofs.close();
}
8、文件交换-读文件
目的:每次程序开始时,将程序中的数据读到程序中
构造函数初始化:
- 第一次使用,文件未初始化
1、在workerManager.h中添加新的成员属性 判断文件是否为空
bool file_Is_Empty;
2、修改workerManager.cpp文件中的构造函数代码
- 文件存在,但是数据被用户清空
- 文件存在,并且保存了职工的所有数据
初始化数组:
根据职工的数据,初始化Worker** worker_Array_Pointer指针
- 在workerManager.h中添加成员函数 void init()函数
void initial_Worker();
- workerManager.cpp具体实现
void workerManager::initial_Worker()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
int id;
string name;
int departmentId;
int index=0;
while (ifs >> id && ifs >> name && ifs >> departmentId)
{
Worker* worker = NULL;
if (departmentId == 1)
{
worker = new Employee(id, name, departmentId);
}
else if (departmentId == 2)
{
worker = new Manager(id, name, departmentId);
}
else if (departmentId == 3)
{
worker = new Boss(id, name, departmentId);
}
this->worker_Array_Pointer[index] = worker;
index++;
}
ifs.close();
}
9、显示职工
显示功能:显示当前职工信息
1、显示职工函数声明
在workerManager.h中添加成员函数 void show()
void show_Worker_Information();
在workerManager.cpp中实现成员函数 void show()
void workerManager::show_Worker_Information()
{
if (this->file_Is_Empty)
{
cout << "文件不存在或记录为空!" << endl;
}
else
{
for (int i = 0; i < this->file_Person_Number; i++)
{
//利用多态调用接口
this->worker_Array_Pointer[i]->show_Person_Information();
}
}
system("pause");
system("cls");
}
10、删除职工
1、在workerManager.h中添加成员函数 void delete_worker()
2、先定义一个函数确定职工是否存在,在workerManager.h中添加成员函数isExist;
3、isExist函数的实现
int workerManager::worker_isExist(int id)
{
int index = -1;
for (int i = 0; i < this->file_Person_Number; i++)
{
if (this->worker_Array_Pointer[i]->staff_Id == id)
{
index = i;
break;
}
}
return index;
}
4、在workerManager.cpp实现 void delete_worker()
void workerManager::delete_Worker_Information()
{
if (this->file_Is_Empty)
{
cout << "文件不存在或记录为空!" << endl;
}
else
{
cout << "请输入删除员工的编号" << endl;
int id=0;
cin >> id;
int idResult = this->worker_isExist(id);
if (idResult != -1)
{
for (int i = idResult; i < this->file_Person_Number-1; i++)//数组中最后一个元素的位置
{
this->worker_Array_Pointer[i] = this->worker_Array_Pointer[i + 1];
}
this->file_Person_Number--;
this->saveFile();
cout << "删除成功!" << endl;
}
else
{
cout << "职工的编号不存在,删除失败!" << endl;
}
}
system("pause");
system("cls");
}
11、修改职工
1、在workerManager.h中添加修改职工声明 void modify_()
2、在workerManager.cpp中实现这个函数
void workerManager::modify_Worker_Information()
{
if (this->file_Is_Empty)
{
cout << "文件不存在或记录为空!" << endl;
}
else
{
cout<< "请输入修改员工的编号" << endl;
int id = 0;
cin >> id;
int idResult = this->worker_isExist(id);
if (idResult != -1)
{
delete this->worker_Array_Pointer[idResult];
int newId=0;
string newName=" ";
int newDepartmentId=0;
cout << "查到: " << id << "号职工,请输入新职工工号:" << endl;
cin >> newId;
cout << "请输入新姓名:" << endl;
cin >> newName;
cout << "请输入新的岗位:" << endl;
cout << "1、普通职工" << endl;
cout << "2、经理" << endl;
cout << "3、老板" << endl;
cin >> newDepartmentId;
Worker* worker = NULL;
switch (newDepartmentId)
{
case 1:
worker = new Employee(newId, newName, newDepartmentId);
break;
case 2:
worker = new Manager(newId, newName, newDepartmentId);
break;
case 3:
worker = new Boss(newId, newName, newDepartmentId);
break;
default:
break;
}
//关系到数组中
this->worker_Array_Pointer[idResult] = worker;
cout << "修改成功!" << endl;
//保存到文件中
this->saveFile();
}
else
{
cout << "查找失败,不存在这个员工!" << endl;
}
}
system("pause");
system("cls");
}
12、查找职工
1、在workerManager.h中添加查找职工声明 void find_()
2、在workerManager.cpp中实现这个函数
void workerManager::find_Worker_information()
{
if (this->file_Is_Empty)
{
cout << "文件不存在或记录为空!" << endl;
}
else
{
cout << "请输入查找的方式:" << endl;
cout << "1、按职工编号查找" << endl;
cout << "2、按职工姓名查找" << endl;
int select = 0;
cin >> select;
if (select==1)
{
int id;
cout << "请输入查找的职工编号:" << endl;
cin >> id;
int idResult = this->worker_isExist(id);
if (idResult != -1)
{
cout << "查找成功!该职工的信息如下:" << endl;
this->worker_Array_Pointer[idResult]->show_Person_Information();
}
else
{
cout << "查找失败,查无此人!" << endl;
}
}
else if (select == 2)
{
string name;
cout << "请输入查找的职工姓名:" << endl;
cin >> name;
bool flag = false;//查到的标志
for (int i = 0; i < this->file_Person_Number; i++)
{
if (this->worker_Array_Pointer[i]->staff_Name == name)
{
cout << "查找成功!该职工的编号为:" << this->worker_Array_Pointer[i]->staff_Id << endl;
cout << "该职工的信息如下:" << endl;
flag = true;
this->worker_Array_Pointer[i]->show_Person_Information();
}
}
if(flag==false)
{
cout << "查找失败,查无此人!" << endl;
}
}
else
{
cout << "输入有误!" << endl;
}
}
//system("pause");
}
13、排序
1、在workerManager.h中添加查找职工声明 void sort_()
2、在workerManager.cpp中实现这个函数
void workerManager::sort_Worker_Information()
{
if (this->file_Is_Empty)
{
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 < this->file_Person_Number; i++)
{
int min_Or_Max = i;//声明最小值或者最大值下标
for (int j = i + 1; j < this->file_Person_Number; j++)
{
if (select == 1)//升序排列
{
if (this->worker_Array_Pointer[min_Or_Max]->staff_Id>this->worker_Array_Pointer[j]->staff_Id)
{
min_Or_Max = j;
}
}
else//降序排列
{
if (this->worker_Array_Pointer[min_Or_Max]->staff_Id < this->worker_Array_Pointer[j]->staff_Id)
{
min_Or_Max = j;
}
}
}
if (i != min_Or_Max)
{
Worker* temporary_Number = this->worker_Array_Pointer[i];
this->worker_Array_Pointer[i]=this->worker_Array_Pointer[min_Or_Max];
this->worker_Array_Pointer[min_Or_Max] = temporary_Number;
}
}
cout << "排序成功!排序后的结果为:" << endl;
this->saveFile();
this->show_Worker_Information();
}
}
14、清空文件
1、在workerManager.h中添加查找职工声明 void clear_()
2、在workerManager.cpp中实现这个函数
void workerManager::clear_Worker_File_Information()
{
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->worker_Array_Pointer != NULL)
{
for (int i = 0; i < this->file_Person_Number; i++)
{
if (this->worker_Array_Pointer[i] != NULL)
{
delete this->worker_Array_Pointer[i];
}
}
this->file_Person_Number = 0;
delete[] this->worker_Array_Pointer;
this->worker_Array_Pointer = NULL;
this->file_Is_Empty = true;
}
cout << "清空成功!" << endl;
}
}