You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

456 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "workermanager.h"
WorkerManager::WorkerManager() {
// 初始化情况共三种
// 1、文件不存在
ifstream ifs;
ifs.open(FILENAME, ios::in); // 读文件
if (!ifs.is_open()) {
cout << "文件不存在" << endl;
// 初始化属性设置初始化记录人数为0
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;
// 初始化属性设置初始化记录人数为0
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
<< "姓名:" << this->m_EmpArray[i]->m_Name
<< "职位:" << this->m_EmpArray[i]->m_DeptId;
}
*/
}
// 展示菜单
void WorkerManager::Show_Menu() {
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;
}
// 0------------------退出系统
void WorkerManager::ExitSystem() {
cout << "欢迎下次使用" << endl;
system("pause");
exit(0); // 退出
}
// 1------------------添加信息
void WorkerManager::Add_Emp() {
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; // 部门选择
cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
cin >> id;
cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
cin >> name;
cout << "请选择新职工职位:" << 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:
cout << "输入有误!" << endl;
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();
} else {
cout << "输入数据有误" << endl;
}
// 按任意键清屏,回到上一级目录
system("pause");
system("cls");
}
// 保存文件
void WorkerManager::save() {
ofstream ofs; // 通过文件输出流的对象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(); // 操作结束后,关闭文件
}
// 3、文件存在并且记录数据对应上面的代码
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++;
}
ifs.close();
return num;
}
// 初始化员工
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;
// 根据不同的部门id创建不同对象
if (dId == 1) // 1普通职工
{
worker = new Employee(id, name, dId);
} else if (dId == 2) // 2经理
{
worker = new Manager(id, name, dId);
} else // 3老板
{
worker = new Boss(id, name, dId);
}
// 存放在数组中
this->m_EmpArray[index] = worker;
index++;
}
// 关闭文件
ifs.close();
}
// 2------------------显示职工
void WorkerManager::Show_Emp() {
// 判断文件是否为空
if (this->m_FileIsEmpty) {
cout << "文件不存在或记录为空!" << endl;
} else {
for (int i = 0; i < m_EmpNum; i++) {
// 利用多态调用接口
this->m_EmpArray[i]->showInfo();
}
}
// 按任意键后清屏
system("pause");
system("cls");
}
// 3------------------删除职工
void WorkerManager::Del_Emp() {
if (this->m_FileIsEmpty) // 为空
{
cout << "文件不存在或者记录为空!" << endl;
} else {
// 按照职工编号删除
cout << "请输入想要删除的职工编号:" << endl;
int id = 0;
cin >> id;
int index = this->IsExist(id); // 接受返回值
if (index != -1) // 说明职工存在并且要删除掉index位置上的职工
{
// 利用数据前移来删除元素
for (int i = index; i < this->m_EmpNum - 1; i++) {
this->m_EmpArray[i] = this->m_EmpArray[i + 1]; // 赋值
}
this->m_EmpNum--; // 更新数组中记录人员
this->save(); // 重要点!!!!删除后 数据同步到文件中
cout << "删除成功!" << endl;
} else {
cout << "删除失败,未找到该职工" << endl;
}
// 清屏
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; // 返回值
}
// 4------------------修改职工
void WorkerManager::Mod_Emp() {
if (this->m_FileIsEmpty) // 文件不存在
{
cout << "文件不存在或者记录为空!" << endl;
} else // 文件存在
{
cout << "请输入修改职工的编号:" << endl;
int id;
cin >> id;
int ret = this->IsExist(id); // 反馈搜索结果
if (ret != -1) {
// 查找到编号的职工
delete this->m_EmpArray[ret]; // 释放原来的数据
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, dSelect);
break;
case 2: // 经理
worker = new Manager(newId, newName, dSelect);
break;
case 3: // 老板
worker = new Boss(newId, newName, dSelect);
break;
default:
break;
}
// 更新数据到数组中
this->m_EmpArray[ret] = worker;
cout << "修改成功!" << endl;
// 保存到文件中
this->save();
} else {
cout << "修改失败,查无此人!" << endl;
}
}
system("pause");
system("cls");
}
// 5------------------查找员工
void WorkerManager ::Find_Emp() {
if (this->m_FileIsEmpty) {
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 ret = IsExist(id);
if (ret != -1) {
cout << "查找成功,该职工信息如下:" << endl;
this->m_EmpArray[ret]->showInfo(); // 调用的是之前写的函数
} else {
cout << "查找失败,查无此人" << endl;
}
} else if (select == 2) // 按姓名查找
{
string name; // 接收姓名
cout << "请输入查找姓名:" << endl;
cin >> name;
bool flag = false; // 查找到的标志,默认没有找到职工
for (int i = 0; i < m_EmpNum; i++) {
if (m_EmpArray[i]->m_Name == name) {
if (m_EmpArray[i]->m_Name == name) {
cout << "查找成功。职工编号为:" << m_EmpArray[i]->m_Id
<< "号的信息如下:" << endl;
flag = true; // 找到为ture
// 调用显示信息接口
this->m_EmpArray[i]->showInfo();
}
}
if (flag == false) {
// 查无此人
cout << "查找失败,查无此人!" << endl;
}
}
} else {
cout << "输入选项有误!" << endl;
}
}
system("pause");
system("cls");
}
// 6------------------按照编号排序
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 < this->m_EmpNum; j++) // 二次循环
{
if (select == 1) // 升序
{
if (this->m_EmpArray[minOrMax]->m_Id > this->m_EmpArray[j]->m_Id) {
minOrMax = j; // 更新下标
}
} else // 降序
{
if (this->m_EmpArray[minOrMax]->m_Id < this->m_EmpArray[j]->m_Id) {
minOrMax = j;
}
}
}
// 判断一开始认定的最大值或者最小值是不是计算的最大值或者最小值,如果不是交换数据
if (i != minOrMax) {
// 交换元素
worker* temp = this->m_EmpArray[i];
m_EmpArray[i] = this->m_EmpArray[minOrMax];
m_EmpArray[minOrMax] = temp;
}
}
cout << "排序成功,排序结果为:" << endl;
this->save(); // 排序后结果保存到文件里
this->Show_Emp(); // 展示所有的职工这部分在上面的Show_Emp函数中已经写过清屏操作这里不需要再写
}
}
// 7------------------清空文件
void WorkerManager::Clean_File() {
cout << "确认清空?" << endl;
cout << "1-是" << endl;
cout << "2-否" << endl;
int select = 0;
cin >> select;
if (select == 1) {
// 清空文件
ofstream ofs(
FILENAME,
ios::trunc); // 打开模式ios::trunc,如果文件存在,删除文件并重新创建
ofs.close();
if (this->m_EmpArray != NULL) {
// 删除堆区的每个职工对象
for (int i = 0; i < this->m_EmpNum; i++) // 释放堆区的数据
{
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;
}
}
delete[] this->m_EmpArray;
this->m_EmpArray = NULL;
}
}