【带你敲】职工管理系统(下)

简介: 笔记

11、删除职工

功能描述:按照职工的编号进行删除职工操作


11.1 删除职工函数声明


在workerManager.h中添加成员函数 void Del_Emp();

//删除职工
  void Del_Emp();

11.2 职工是否存在函数声明


很多功能都需要用到根据职工是否存在来进行操作如:删除职工、修改职工、查找职工


因此添加该公告函数,以便后续调用


在workerManager.h中添加成员函数 int IsExist(int id);

//按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1
  int IsExist(int id);

11.3 职工是否存在函数实现


在workerManager.cpp中实现成员函数 int IsExist(int id);


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


11.4 删除职工函数实现


在workerManager.cpp中实现成员函数 void Del_Emp();

//删除职工
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");
}


11.5 测试删除职工


在main函数分支 3 选项中,调用删除职工接口

1.png

测试1 - 删除不存在职工情况


2.png

测试2 - 删除存在的职工情况


删除成功提示图:

3.png

再次显示所有职工信息,确保已经删除

4.png


查看文件中信息,再次核实员工已被完全删除

5.png


至此,删除职工功能实现完毕!


12、修改职工


功能描述:能够按照职工的编号对职工信息进行修改并保存


12.1 修改职工函数声明


在workerManager.h中添加成员函数 void Mod_Emp();


//修改职工
  void Mod_Emp();

12.2 修改职工函数实现


在workerManager.cpp中实现成员函数 void Mod_Emp();


//修改职工
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)
    {
    case1:
    worker = new Employee(newId, newName, dSelect);
    break;
    case2:
    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");
}


12.3 测试修改职工


在main函数分支 4 选项中,调用修改职工接口

6.png

测试1 - 修改不存在职工情况

7.png

测试2 - 修改存在职工情况,例如将职工 “李四” 改为 “赵四”

8.png


修改后再次查看所有职工信息,并确认修改成功

9.png

再次确认文件中信息也同步更新

10.png


至此,修改职工功能已实现!


13、查找职工


功能描述:提供两种查找职工方式,一种按照职工编号,一种按照职工姓名


13.1 查找职工函数声明


在workerManager.h中添加成员函数 void Find_Emp();


//查找职工
  void Find_Emp();

13.2 查找职工函数实现


在workerManager.cpp中实现成员函数 void Find_Emp();


//查找职工
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)
    {
      cout << "查找成功,职工编号为:"
                           << m_EmpArray[i]->m_Id
                           << " 号的信息如下:" << endl;
      flag = true;
      this->m_EmpArray[i]->showInfo();
    }
    }
    if (flag == false)
    {
    //查无此人
    cout << "查找失败,查无此人" << endl;
    }
  }
  else
  {
    cout << "输入选项有误" << endl;
  }
  }
  system("pause");
  system("cls");
}

13.3 测试查找职工


在main函数分支 5 选项中,调用查找职工接口

11.png

测试1 - 按照职工编号查找 - 查找不存在职工

12.png


测试2 - 按照职工编号查找 - 查找存在职工


13.png

测试3 - 按照职工姓名查找 - 查找不存在职工14.png

测试4 - 按照职工姓名查找 - 查找存在职工(如果出现重名,也一并显示,在文件中可以添加重名职工)


例如 添加两个王五的职工,然后按照姓名查找王五

15.png16.png

至此,查找职工功能实现完毕!


14、排序


功能描述:按照职工编号进行排序,排序的顺序由用户指定


14.1 排序函数声明


在workerManager.h中添加成员函数 void Sort_Emp();

//排序职工
  void Sort_Emp();

14.2 排序函数实现


在workerManager.cpp中实现成员函数 void Sort_Emp();


//排序职工
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();
  }
}  


14.3 测试排序功能


在main函数分支 6 选项中,调用排序职工接口

17.png

测试:


首先我们添加一些职工,序号是无序的,例如:18.png


测试 - 升序排序

19.png


文件同步更新

20.png


测试 - 降序排序

21.png

文件同步更新


22.png

至此,职工按照编号排序的功能实现完毕!


15、清空文件


功能描述:将文件中记录数据清空


15.1 清空函数声明


在workerManager.h中添加成员函数 void Clean_File();

//清空文件
  void Clean_File();

15.2 清空函数实现


在workerManager.cpp中实现员函数 void Clean_File();


//清空文件
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");
}


15.3 测试清空文件


在main函数分支 7 选项中,调用清空文件接口

23.png

测试:确认清空文件

24.png

再次查看文件中数据,记录已为空

25.png

打开文件,里面数据已确保清空,该功能需要慎用!

26.png


随着清空文件功能实现,本案例制作完毕 ^ _ ^


相关文章
|
算法 Java 调度
|
SQL 存储 关系型数据库
什么是关系型数据库?有什么优缺点
什么是关系型数据库?有什么优缺点
|
11月前
|
运维 Kubernetes Cloud Native
云原生技术:构建现代应用的新范式
【10月更文挑战第9天】 云原生是一种通过云计算环境优化的软件开发和运行方法论,旨在最大化利用云平台的灵活性、可扩展性和弹性。本文将深入探讨云原生技术的基本原理、核心组件以及其在实际项目中的应用。我们将从Kubernetes的容器编排机制入手,逐步探讨如何通过自动化工具实现持续集成与持续部署(CI/CD),最终展示如何构建一个高效、可靠的云原生应用。
185 2
|
11月前
|
云安全 弹性计算 安全
云上攻防:实例元数据、控制台接管
随着企业上云趋势增强,云安全成为焦点。云服务提供高效的数据存储和计算能力,但也带来数据保护和访问控制的新挑战。攻击者常利用云服务漏洞,威胁企业数据安全。本文探讨云上攻防关键领域,如元数据泄露、AKSK安全、控制台接管等,提出防御措施,帮助企业应对云安全风险。
459 2
云上攻防:实例元数据、控制台接管
|
8月前
|
Docker 容器 存储
2024 年 docker 提示index.docker.io
在使用 Docker 时遇到连接 Docker Hub 的错误,即使配置了阿里源、清华源等国内镜像源仍无法解决。错误提示为连接超时或主机未响应。最终发现许多 Docker Hub 已关闭,阿里源也仅限于阿里产品内使用。解决方法是搭建私有 Docker Hub。
1846 5
|
Python
布尔值
布尔值。
204 12
|
Linux
使用Kali Linux跟踪任何设备位置
如果您的手机在某处丢失或被某人偷走了,您可以使用此技巧,或者如果您的兄弟姐妹/朋友/家人失踪并使用他们的电话,那么您可以使用此技巧来定位并找到他们,
934 0
使用Kali Linux跟踪任何设备位置
|
C语言
C语言实现三子棋(详解版)(二)
C语言实现三子棋(详解版)
106 0
|
传感器 数据采集 监控
LabVIEW高温往复摩擦测试系统中PID控制
LabVIEW高温往复摩擦测试系统中PID控制
114 0