欢迎来到天天like的博客

博主正在学习c++,网页设计,java,不定时记录自己的学习过程,分享自己的学习心得,让我们一起体验编程的快乐吧

C++实现职工管理系统(中)

C++实现职工管理系统(中)

大家好,今天是在博客园的第九天,博主今天给大家带来的是职工管理系统(C++)(中)

这次的随笔记录是实现(上)结语处说的几个功能

此次要实现的功能

  • 退出管理程序:退出当前管理系统
  • 增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门编号
  • 显示职工信息:显示公司内部所有职工的信息
  • 删除离职职工:按照编号删除指定的职工

1.先创建一个函数的类

为了方便管理相关功能的函数,创建一个WorkerInformation的类

class WorkerInformation
{

public:

	WorkerInformation()  //利用构造函数进行相关的初始化操作
	{
		//文件不存在的情况
		ifstream ifs1;
		ifs1.open(FILENAME, ios::in);

		if (!ifs1.is_open())
		{
			//cout << "文件不存在" << endl;
			this->PersonNum = 0;
			this->m_PersonArr = NULL;
		    this->m_FileIsEmpty = true;
			ifs1.close();
			return;
		}

		ifs1.close();

		//文件存在,要检查下里面有无数据,可用下方已经注释的代码进行验证
		ifstream ifs2;
		ifs2.open(FILENAME, ios::in);
		char ch;
		ifs2 >> ch;

		if (ifs2.eof())
		{
			//cout << "文件存在且文件内无数据" << endl;
			this->PersonNum = 0;
			this->m_PersonArr = NULL;
			this->m_FileIsEmpty = true;
			ifs2.close();
			return;
		}
		ifs2.close();

		//文件存在了,并且里面有数据,我们需要知道里面的有多少人,可用下方已经注释的代码进行验证
		ifstream ifs3;
		ifs3.open(FILENAME, ios::in);
		int num = this->get_Num();
		//cout << "文件里有" << num << "名职工" << endl;
		this->PersonNum = num;
		ifs3.close();

		//根据人数创建一个数组
		this->m_PersonArr = new Worker * [this->PersonNum];
		//初始化数组
		init_PArr();

	}

	~WorkerInformation()  //释放内存
	{
		if (this->m_PersonArr != NULL)
		{
			delete[] this->m_PersonArr;
			this->m_PersonArr = NULL;
		}
	}

	void menu();        //菜单

	void ExitSystem();  //退出
	
	void AddPerson();   //添加职工

	void save();        //保存数据进文件

	int PersonNum;      //需要添加的职工人数

	Worker** m_PersonArr;  //指向数组的指针 创建进堆区进行相关的存储操作

	bool m_FileIsEmpty;    //检测文件是否为空

	int get_Num();         //用来获取文件内的人数

	void init_PArr();      //初始化数组

	void show_Person();    //显示职工

	int IsExist(int id);   //通过编号判断职工是否存在

	void Del_Person();     //删除员工的操作
}

2.菜单的建立

做一个美化的菜单,可以学习下EaxyX进行美化 (目前博主还在学)

void WorkerInformation::menu()
{
	cout << "\t**********************************" << endl
	     << "\t*       欢迎来到职工管理系统        *" << endl
	     << "\t**********************************" << endl
		 << "\t****      1.增加职工信息        ****" << endl
		 << "\t****      2.显示职工信息        ****" << endl
		 << "\t****      3.删除职工信息        ****" << endl
		 << "\t****          0.退出           ****" << endl
	     << "\t**********************************" << endl << endl;
}

3.实现退出功能

void WorkerInformation::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	exit(0);
}

3.实现增加功能

首先将写出增加的函数

void WorkerInformation::AddPerson()
{
	cout << "请输入需要添加的人数:" << endl;
	int AddNum = 0;
	cin >> AddNum;

	if (AddNum > 0)
	{
		int newsize = this->PersonNum + AddNum;

		Worker** newspace = new Worker * [newsize];

		if (this->m_PersonArr != NULL)
		{
			for (int i = 0; i < this->PersonNum; i++)
			{
				newspace[i] = this->m_PersonArr[i];
			}
		}

		for (int i = 0; i < AddNum; i++)
		{
			int id;
			string name;
			int did;

			cout << "请输入第" << i + 1 << "个新职工的编号:";
			cin >> id;

			cout << "请输入第" << i + 1 << "个新职工的名字:";
			cin >> name;


			cout << "请选择该职工的岗位:" << endl;
			cout << "1、普通员工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			cin >> did;

			Worker* worker = NULL;
			switch (did)
			{
			case 1:
				worker = new GeneralWorker(id, name, did);
				break;
			case 2:
				worker = new Manage(id, name, did);
				break;
			case 3:
				worker = new Boss(id, name, did);
				break;
			default:
				break;
			}

			newspace[this->PersonNum + i] = worker;
		}

		delete[] this->m_PersonArr;

		this->m_PersonArr = newspace;

		this->PersonNum = newsize;

		cout << "成功添加" << AddNum << "名新职工!" << endl;

	}
	else
	{
		cout << "输入有误" << endl;
	}
	save();

	cout << endl;
	cout << "添加成功,稍等请按任意键进行清屏操作!" << endl;
	system("pause");
	system("cls");
}

接下来是保存到文件的函数

void WorkerInformation::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	for (int i = 0; i < this->PersonNum; i++)
	{
		ofs << this->m_PersonArr[i]->m_Id << " "
			<< this->m_PersonArr[i]->m_Name << " "
			<< this->m_PersonArr[i]->m_DeptId << " " << endl;
	}
	ofs.close();
	cout << "保存成功!" << endl;
}

4.实现显示功能

假设我们文件里面已经有人了,我们需要知道文件里面的人数,并将其放进数组里,再一一展示出来

首先查询文件里面是否为空,否则返回人数,方便下面的功能进行相关的操作,在WorkerInformation构造函数里进行确认

bool m_FileIsEmpty;  //检测文件是否为空

确定人数

int WorkerInformation::get_Num()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	int num = 0;

	int id;
	string name;
	int did;

	while (ifs >> id && ifs >> name && ifs >> did)
	{
		num++;
	}
	ifs.close();
	return num;
}

初始化数组

void WorkerInformation::init_PArr()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);

	int index = 0;
	int id;
	string name;
	int did;

	while (ifs >> id && ifs >> name && ifs >> did)
	{
		Worker* worker = NULL;

		if (did == 1)
		{
			worker = new GeneralWorker(id, name, did);
		}
		else if (did == 2)
		{
			worker = new Manage(id, name, did);
		}
		else
		{
			worker = new Boss(id, name, did);
		}
		this->m_PersonArr[index] = worker;
		index++;
	}
	ifs.close();
}

显示信息

void WorkerInformation::show_Person()
{
	if (this->m_FileIsEmpty)
	{
		cout << "该文件为空或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < this->PersonNum; i++)
		{
			this->m_PersonArr[i]->Show_WI();
		}
		cout << "显示成功!" << endl;
	}

	cout << endl;
	cout << "稍等请按任意键进行清屏操作!" << endl;
	system("pause");
	system("cls");
}

5.实现删除功能

通过编号删除指定信息,先确定文件里是否存在需要删除的编号,再决定是否进行删除操作

检查文件是否有指定人

int WorkerInformation::IsExist(int id)
{
	int num = -1;
	for (int i = 0; i < this->PersonNum; i++)
	{
		if (this->m_PersonArr[i]->m_Id == id)
		{
			num = i;
			break;
		}
	}
	return num;
}

执行删除操作(找到指定位置,将后一位的信息进行前移)

void WorkerInformation::Del_Person()
{
	if (this->m_FileIsEmpty)
	{
		cout << "该文件为空或记录为空" << endl;
	}
	else
	{
		cout << "请输入想要删除员工的职工编号:";
		int a;
		cin >> a;
		int ret = this->IsExist(a);

		if (ret != -1)
		{
			for (int i = ret; i < this->PersonNum - 1; i++)
			{
				this->m_PersonArr[i] = this->m_PersonArr[i+1];
			}
			this->PersonNum--;
			this->save();
			cout << "删除成功!" << endl;
		}
		else
		{
			cout << "删除失败" << endl;
		}

	}
	cout << endl;
	cout << "稍等请按任意键进行清屏操作!" << endl;
	system("pause");
	system("cls");
}

结语

下列的功能放在下一篇的随笔进行记录

  • 查找职工信息:按照职工的编号或者职工的姓名进行查找相关的人员信息
  • 按照编号排序:按照职工编号,进行排序,排序规则由用户指定(升序与降序)
  • 清空所有文档:清空文件中记录的所有职工信息 (清空前需要再次确认,防止误删)

到访的小伙伴们有什么建议可以在评论区留言,大家一起学习一起进步,加油呀!

posted @ 2020-09-20 18:15  天天like  阅读(551)  评论(0)    收藏  举报