C++学习笔记(Ⅳ):职工管理系统

目录

1.管理系统需求

2.创建项目

3.创建管理类

3.1 头文件实现

3.2 源文件实现

4.菜单功能

4.1 添加成员函数

4.2 菜单功能实现

4.3 测试菜单功能

5.退出功能

5.1 提供功能接口

5.2 实现退出功能

5.3 测试功能

6.创建职工类

6.1 创建职工抽象类

6.2 创建员工类

7.添加职工

8.写文件

9.读文件

9.1 文件未创建

9.2 文件存在且数据为空

9.3 文件存在且保存职工数据

9.4 已有数据初始化方式

10.显示职工

11.删除职工

12.修改职工

13.查找职工

14.排序

15.清空文件


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值