目录
1.管理系统需求
2.创建项目
3.创建管理类
管理类可以:制作菜单界面;执行用户操作;实现文件交互
3.1 头文件实现
#pragma once // 头文件只编译一次
#include<iostream> // 输入、输出源文件
using namespace std; // 标准命名空间
class WorkManager
{
public:
// 构造函数
WorkManager();
// 析构函数
~WorkManager();
};
3.2 源文件实现
#include"workManager.h"
WorkManager::WorkManager()
{
}
WorkManager::~WorkManager()
{
}
4.菜单功能
4.1 添加成员函数
在头文件中包含下列函数
void Show_Menu();
4.2 菜单功能实现
在源文件中添加菜单函数
// 展示菜单
void WorkManager::Show_Menu()
{
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;
}
4.3 测试菜单功能
// 调用菜单展示成员函数
wm.Show_Menu();
5.退出功能
5.1 提供功能接口
使用循环和选择,进行系统操作
int main()
{
// 实例化对象
WorkManager wm;
int select = 0;
while (true)
{
// 调用菜单展示成员函数
wm.Show_Menu();
cout << "请输入您的选择:" << endl;
cin >> select; // 提供一个选择变量
switch (select)
{
case 0: // 退出系统
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;
}
}
5.2 实现退出功能
// 退出菜单
void WorkManager::Exit_Menu()
{
cout << "欢迎下次使用" << endl;
system("pause");
exit(0); // 程序正常退出
}
5.3 测试功能
case 0: // 退出系统
wm.Exit_Menu();
6.创建职工类
6.1 创建职工抽象类
#pragma once
#include<iostream>
#include<string>
using namespace std;
// 职工抽象类
class Worker
{
public:
// 行为
// 显示个人信息
virtual void showInfo() = 0; // 纯虚函数,不做实现
// 获取岗位名称
virtual string getDeptName() = 0;
// 属性
// 职工编号
int m_Id;
// 职工姓名
string m_name;
// 所在部门
int m_DeptId;
};
6.2 创建员工类
头文件
#pragma once
using namespace std;
#include<iostream>
#include<string>
#include"worker.h"
// 普通员工
class Employee:public Worker // 定义一个继承职员类的员工类
{
public:
// 构造函数
Employee(int id,string name, int dId); // 初始化
virtual void showInfo();
virtual string getDeptName();
};
源文件
#include"employee.h"
// 构造函数,给自身属性初始化
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"员工";
}
经理与老板类添加方式同员工类
7.添加职工
批量添加职工,保存到文件中。以添加员工为例
头文件
#pragma once
using namespace std;
#include<iostream>
#include<string>
#include"worker.h"
// 普通员工
class Employee:public Worker // 定义一个继承职员类的员工类
{
public:
// 构造函数
Employee(int id,string name, int dId); // 初始化
virtual void showInfo();
virtual string getDeptName();
};
源文件
#include"employee.h"
// 构造函数,给自身属性初始化
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"员工";
}
添加职工函数
// 添加职工
void WorkManager::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);
case 3:
worker = new Boss(id, name, 3);
default:
break;
}
// 将职工指针保存到数组中
newSpace[this->m_EmpNum + i] = worker;
}
// 释放原有堆区空间
delete[] this->m_EmpArray;
// 更改新空间指向
this->m_EmpArray = newSpace;
// 更新职工人数
this->m_EmpNum = newSize;
// 提示
cout << "成功添加" << addNum << "名新职工!" << endl;
}
else
{
cout << "输入有误" << endl;
}
// 清屏
system("pause");
system("cls");
}
主函数使用
case 1: // 增加职工
wm.Add_Emp();
8.写文件
数据保存在堆区,运行结束后被释放。析构函数释放堆区内容
// 析构函数
WorkManager::~WorkManager()
{
if (this->m_EmpArray != NULL)
{
delete[] this->m_EmpArray;
this->m_EmpArray = NULL;
}
}
头文件
// 保存文件函数
void save();
源文件
/ 保存文件
void WorkManager::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(); // 关闭文件
}
函数调用,在成员添加函数末尾,即添加结束后
// 保存数据到文件中
this->save();
写入后保存为txt格式文件
9.读文件
修改初始化属性,添加文件标志位
9.1 文件未创建
在头文件中添加标志位
// 添加文件不存在标志位
bool m_FileIsEmpty;
在源文件中添加文件不存在初始化属性
// 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;
}
9.2 文件存在且数据为空
// 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;
}
添加职工后更新文件存在标志位
// 更新职工是否为空标志位
this->m_FileIsEmpty = false;
9.3 文件存在且保存职工数据
头文件
// 统计文件中人数
int get_EmpNum();
源文件中统计文件中人数
// 统计文件中人数
int WorkManager::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;
}
构造函数中调用
// 3.文件存在并记录数据
int num = this->get_EmpNum();
cout << "职工人数为:" << num << endl;
this->m_EmpNum = num;
9.4 已有数据初始化方式
头文件
// 初始化员工
void init_Emp();
源文件
// 初始化员工
void WorkManager::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);
}
else if (dId == 2)
{
worker = new Manager(id, name, dId);
}
else
{
worker = new Boss(id, name, dId);
}
this->m_EmpArray[index] = worker;
index++;
}
// 关闭文件
ifs.close();
}
初始化
// 3.文件存在并记录数据
int num = this->get_EmpNum();
cout << "职工人数为:" << num << endl;
this->m_EmpNum = num;
// 开辟空间
this->m_EmpArray = new Worker*[this->m_EmpNum];
this->init_Emp(); // 初始化
10.显示职工
函数声明
// 显示职工信息
void show_Emp();
函数实现
// 显示职工信息
void WorkManager::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");
}
函数调用
case 2: // 显示职工
wm.show_Emp();
11.删除职工
函数声明。删除前首先判断是否存在
// 判断职工是否存在,若存在返回职工所在位置,否则返回-1
int IsExist(int id);
// 删除职工
void delete_Emp();
函数实现
// 判断职工是否存在,若存在返回职工所在位置,否则返回-1
int WorkManager::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 WorkManager::delete_Emp()
{
if (this->m_FileIsEmpty)
{
cout << "文件不存在" << endl;
}
else
{
cout << "输入删除职工编号:" << endl;
int id = 0;
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--; // 更新职工总数
// 在文件中更新
this->save();
cout << "删除成功" << endl;
}
else
{
cout << "职工不存在" << endl;
}
}
// 清屏
system("pause");
system("cls");
在主程序中调用函数
case 3: // 删除职工
wm.delete_Emp();
break;
12.修改职工
函数声明
// 修改职工
void mod_Emp();
函数实现
// 修改职工
void WorkManager::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 newdId = 0;
cout << "查找到:" << id << "号员工,请输入新职工号:" << endl;
cin >> newId;
cout << "请输入新姓名:" << endl;
cin >> newName;
cout << "请输入新岗位:" << endl;
cout << "1.普通员工" << endl;
cout << "2.经理" << endl;
cout << "3.老板" << endl;
cin >> newdId;
// 根据选择创建对象
Worker * worker = NULL;
switch (newdId)
{
case 1:
worker = new Employee(newId, newName, newdId); // 在堆区创建对象
break;
case 2:
worker = new Manager(newId, newName, newdId);
break;
case 3:
worker = new Boss(newId, newName, newdId);
break;
default:
break;
}
// 更新数据到数组中
this->m_EmpArray[ret] = worker;
cout << "修改成功!" << endl;
// 保存到文件中
this->save();
}
else
{
cout << "员工不存在" << endl;
}
}
// 清屏
system("pause");
system("cls");
}
在主程序中调用函数
case 4: // 修改职工
wm.mod_Emp();
break;
13.查找职工
函数声明
// 查找职工
void find_Emp();
函数实现
// 查找职工
void WorkManager::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 < this->m_EmpNum; i++)
{
if (m_EmpArray[i]->m_name == name)
{
cout << "查找成功,信息如下:" << endl;
flag = true;
this->m_EmpArray[i]->showInfo();
}
}
if (flag == false)
{
cout << "查无此人" << endl;
}
}
else
{
cout << "输入有误" << endl;
}
}
system("pause");
system("cls");
}
14.排序
声明
// 员工排序
void sort_Emp();
实现
// 员工排序
void WorkManager::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 < this->get_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];
this->m_EmpArray[i] = this->m_EmpArray[minOrmax];
this->m_EmpArray[minOrmax] = temp;
}
}
}
}
cout << "排序成功" << endl;
this->save();
this->show_Emp();
}
15.清空文件
声明
// 清空文件
void clean_File();
实现
// 清空文件
void WorkManager::clean_File()
{
cout << "确认清空?" << endl;
cout << "1.确认" << endl;
cout << "2.返回" << endl;
int select = 0;
cin >> select;
if (select == 1)
{
ofstream ofs(FILENAME, ios::trunc); // 删除文件后重新创建
ofs.close();
if (this->m_EmpArray != NULL)
{
// 删除堆区每个对象
for (int i = 0; i < this->m_EmpNum; i++)
{
delete this->m_EmpArray[i];
}
// 删除堆区数组指针
delete[]this->m_EmpArray;
this->m_EmpArray = NULL;
this->m_EmpNum = 0;
this->m_FileIsEmpty = true;
}
cout << "清空成功" << endl;
}
system("pause");
system("cls");
}