c++之 职工管理系统

基本情况说明:
公司的职工分为三类:普通职工,经理,老板,显示信息时需要显示职工的编号、姓名、岗位、以及职责。
普通员工:完成经理下发的任务
经理:完成老板下发的任务,并且分发任务给员工
老板:完成公司大大小小的所有任务
管理系统中需要实现的功能如下:

  • 退出管理系统
  • 增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工的信息为:职工编号,职工姓名,部门编号
  • 显示职工信息:显示公司所有职工的信息
  • 删除离职职工:按照编号删除指定的职工
  • 修改职工信息:按照编号修改职工的信息
  • 查找职工信息:按照职工的编号或者职工的姓名查找职工的信息
  • 按照编号排序:按照职工的编号,进行排序,排序规则由用户指定
  • 清空所有文档:清空文件中所有的职工信息,清空前需要确认

1、创建项目

点击VS图标—>创建新项目—>空项目—>输入项目名称—>右击源文件点添加—>点击新建项—>修改名称(博主这里修改为main.cpp),是为了与其他的cpp文件分开—>输入文件编写模板
模板:

#include<iostream>
using namespace std;
int main()
{
	system("pause");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、创建管理类

添加和workerManager.cpp文件,并添加workerManager类,并且给一个构造函数和析构函数的空实现
头文件创建过程:右击头文件—>添加—>新建项—>选中.h文件修改名称为workerManager.h—>添加
源文件同理
workerManager.h

#pragma once
#include<iostream>
using namespace std;
class workerManager
{
	workerManager();
	~workerManager();
	
};

workerManager.cpp

#include"workerManager.h"
workerManager::workerManager()
{

}
workerManager::~workerManager()
{

}

3、菜单功能

  • 在管理类workerManager.h中添加成员函数 void showMenu();
void showMenu();
  • 在管理类workerManager.cpp中实现 showMenu()函数
void workerManager::showMenu()
{
	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;

}
  • 在职工管理系统.cpp中测试菜单功能
    在这里插入图片描述

4、退出功能

1、在main函数中提供分支选择,提供每个功能接口

#include"workerManager.h"
#include<iostream>
using namespace std;
int main()
{
	workerManager wm;
	while (true)
	{
		wm.showMenu();
		int select = 0;
		cout << "请输入您的选择:" << endl;
		cin >> select;
		switch (select)
		{
		case 0:
			wm.exitSystem();
			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;
		}
	}
	
	
	system("pause");
	return 0;
}

2、实现退出功能

  • 在workerManager.h中提供相应的退出系统的成员函数 void exitSystem();
	void exitSystem();
  • 在workerManager.cpp文件具体实现
void workerManager::exitSystem()
{
	cout << "欢迎下次使用职工管理系统!" << endl;
	system("pause");
	exit(0);
}

5、创建职工类

1、创建职工抽象类
  • 创建文件worker.h文件
  • 在.h文件中添加三个成员属性—职工编号,职工姓名,职工所在部门编号
  • 添加三个纯虚函数—显示个人信息,获得岗位名称—获取各个岗位的职责
#pragma once
#include<iostream>
using namespace std;
class Worker
{
public:
	//1、显示个人信息,
	virtual void show_Person_Information() = 0;

	//2、获得岗位名称
	virtual string obtain_Post_Name() = 0;
	//3、获取各个岗位的职责
	virtual string obtain_Post_Duty() = 0;
	int staff_Id;
	string staff_Name;
	int staff_Department_Id;
};

2、创建普通员工类
  • 继承抽象职工类,重写父类中的纯虚函数
  • 在源文件和头文件中创建employee.cpp和employee.h文件
  • 给出构造函数初始化成员属性
#pragma once
#include"worker.h"
class Employee:public Worker
{
public:
   Employee(int id,string name,int pId);
    void show_Person_Information();
    string obtain_Post_Name();
   string obtain_Post_Duty();
};
#include"employee.h"
Employee::Employee(int Id, string name, int pId)
{
	this->staff_Id = Id;
	this->staff_Name = name;
	this->staff_Department_Id = pId;
}
 void Employee::show_Person_Information()
{
	 cout << "职工编号:" << this->staff_Id
		 << "\t职工姓名:" << this->staff_Name
		 << "\t职工岗位:" << this->obtain_Post_Name()
		 << "\t岗位职责:" << this->obtain_Post_Duty() << endl;
}
 string Employee::obtain_Post_Name()
 {
	 return "普通员工";
 }
 string Employee::obtain_Post_Duty()
 {
	 return "完成经理交给的任务";
 }
3、创建经理类
  • 继承抽象职工类,重写父类中的纯虚函数
  • 在源文件和头文件中创建manager.cpp和manager.h文件
#pragma once
#include"worker.h"
class Manager :public Worker
{
public:
	Manager(int id, string name, int pId);
	void show_Person_Information();
	string obtain_Post_Name();
	string obtain_Post_Duty();
};

#include"manager.h"
Manager::Manager(int Id, string name, int pId)
{
	this->staff_Id = Id;
	this->staff_Name = name;
	this->staff_Department_Id = pId;
}
void Manager::show_Person_Information()
{
	cout << "职工编号:" << this->staff_Id
		<< "\t职工姓名:" << this->staff_Name
		<< "\t职工岗位:" << this->obtain_Post_Name()
		<< "\t岗位职责:" << this->obtain_Post_Duty() << endl;
}
string Manager::obtain_Post_Name()
{
	return "经理";
}
string Manager::obtain_Post_Duty()
{
	return "完成老板交给的任务,并把任务下发给员工";
}
4、创建老板类
  • 继承抽象职工类,重写父类中的纯虚函数
  • 在源文件和头文件中创建boss.cpp和boss.h文件
#pragma once
#include"worker.h"
class Boss :public Worker
{
public:
	Boss(int id, string name, int pId);
	void show_Person_Information();
	string obtain_Post_Name();
	string obtain_Post_Duty();
};

#include"boss.h"
Boss::Boss(int Id, string name, int pId)
{
	this->staff_Id = Id;
	this->staff_Name = name;
	this->staff_Department_Id = pId;
}
void Boss::show_Person_Information()
{
	cout << "职工编号:" << this->staff_Id
		<< "\t职工姓名:" << this->staff_Name
		<< "\t职工岗位:" << this->obtain_Post_Name()
		<< "\t岗位职责:" << this->obtain_Post_Duty() << endl;
}
string Boss::obtain_Post_Name()
{
	return "老板";
}
string Boss::obtain_Post_Duty()
{
	return "完成公司大大小小的所有任务";
}
5、测试是否能够产生多态
  • 在main函数添加测试文件
//测试代码
	Worker* worker = NULL;//父类的指针
	worker = new Employee(1, "张三", 1);//子类的对象
	worker->show_Person_Information();
	delete worker;
	worker = new Manager(2, "李四", 2);
	worker->show_Person_Information();
	delete worker;
	worker = new Boss(3, "王五", 3);
	worker->show_Person_Information();
	delete worker;
  • 运行效果如下:

在这里插入图片描述

6、添加职工

功能描述:批量添加职工,并且保存在文件中

1、功能分析

用户在批量创建时,可能会创建不同种类的员工,我们需要将信息存放在一个数组中,但是数组中必须保存相同的数据类型。所有我们需要将父类的指针worker*保存在数值中,通过多态指向子类的对象。并且将指针开辟到堆区,通过worker**维护这个指针。

2、功能实现
  • 在workerManager.h的头文件中添加成员属性
    1、记录文件中人数个数
    2、员工数组的指针
void addWorkerInformation();
//记录文件中人数个数
int file_Person_Number;
//员工数组的指针
Worker** worker_Array_Pointer;
  • 在workerManager的构造函数中初始化属性
  • 在workerManager.h中添加成员函数 增加职工
  • 在workerManager.cpp文件中实现这个函数

步骤:

1、输入增加职工的数量
2、计算新的空间大小
3、开辟新的空间
4、将原先空间的内容存放到现有空间下
5、输入新的数据
6、释放原有的空间
7、更改空间的指向
8、更新新空间的个数
9、提示信息

void workerManager::addWorkerInformation()
{
	cout << "请输入需要添加职工的人数:" << endl;
	int add_Worker_Number=0;
	cin >> add_Worker_Number;
	if (add_Worker_Number > 0)
	{
		int new_Space_Size = this->file_Person_Number + add_Worker_Number;
		Worker **new_Space =new Worker*[new_Space_Size];
		if (this->worker_Array_Pointer != NULL)
		{
			for (int i = 0; i < this->file_Person_Number; i++)
			{
				new_Space[i] = this->worker_Array_Pointer[i];
			}
		}
		for (int i = 0; i < add_Worker_Number; i++)
		{
			int Id;
			string name;
			int department_Select;
			cout << "请输入第:" << i + 1 << "个新职工的编号:" << endl;
			cin >> Id;
			cout << "请输入第:" << i + 1 << "个新职工的姓名:" << endl;
			cin >> name;
			cout << "请输入该职工的岗位:" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			cin >> department_Select;
			Worker* worker = NULL;
			switch (department_Select)
			{
			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:
				break;
			}
			new_Space[this->file_Person_Number + i] = worker;
		}
		delete[]this->worker_Array_Pointer;
		this->worker_Array_Pointer = new_Space;
		this->file_Person_Number = new_Space_Size;
		cout << "成功添加" << add_Worker_Number << "名新的职工" << endl;
		
	}
	else
	{
		cout << "您输入的人数有误!" << endl;
		system("pause");
		
	}
	system("pause");
	system("cls");
}
  • 释放堆区的空间
workerManager::~workerManager()
{
	if (this->worker_Array_Pointer != NULL)
	{
		delete this->worker_Array_Pointer;
		this->worker_Array_Pointer = NULL;
	}
}

7、文件交互-写文件

功能描述:对文件进行读写

1、设置文件路径

在workerManager.h中添加宏常量,并且包含头文件fstream

2、成员函数声明

在workerManager.h中添加成员函数 void save*()

void saveFile();
3、成员函数具体实现

1、创建流对象
2、用输出的方式打开文件—写文件
3、将每个人数据写道文件中
4、关闭文件

void workerManager::saveFile()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);
	for (int i = 0; i < this->file_Person_Number; i++)
	{
		ofs << this->worker_Array_Pointer[i]->staff_Id << " "
			<< this->worker_Array_Pointer[i]->staff_Name << " "
			<< this->worker_Array_Pointer[i]->staff_Department_Id << " "
			<< endl;
	}
	ofs.close();
}

8、文件交换-读文件

目的:每次程序开始时,将程序中的数据读到程序中
构造函数初始化:

  • 第一次使用,文件未初始化
    1、在workerManager.h中添加新的成员属性 判断文件是否为空
bool file_Is_Empty;

2、修改workerManager.cpp文件中的构造函数代码

  • 文件存在,但是数据被用户清空
  • 文件存在,并且保存了职工的所有数据

初始化数组:
根据职工的数据,初始化Worker** worker_Array_Pointer指针

  • 在workerManager.h中添加成员函数 void init()函数
void initial_Worker();
  • workerManager.cpp具体实现
void workerManager::initial_Worker()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	int id;
	string name;
	int departmentId;
	int index=0;
	while (ifs >> id && ifs >> name && ifs >> departmentId)
	{
		Worker* worker = NULL;
		if (departmentId == 1)
		{
			worker = new Employee(id, name, departmentId);
		}
		else if (departmentId == 2)
		{
			worker = new Manager(id, name, departmentId);
		}
		else if (departmentId == 3)
		{
			worker = new Boss(id, name, departmentId);
		}
		this->worker_Array_Pointer[index] = worker;
		index++;
	}
	ifs.close();
}

9、显示职工

显示功能:显示当前职工信息
1、显示职工函数声明
在workerManager.h中添加成员函数 void show()

void show_Worker_Information();

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

void workerManager::show_Worker_Information()
{
	if (this->file_Is_Empty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		for (int i = 0; i < this->file_Person_Number; i++)
		{
			//利用多态调用接口
			this->worker_Array_Pointer[i]->show_Person_Information();
		}
	}
	system("pause");
	system("cls");
}

10、删除职工

1、在workerManager.h中添加成员函数 void delete_worker()
2、先定义一个函数确定职工是否存在,在workerManager.h中添加成员函数isExist;
3、isExist函数的实现

int workerManager::worker_isExist(int id)
{
	int index = -1;
	for (int i = 0; i < this->file_Person_Number; i++)
	{
		if (this->worker_Array_Pointer[i]->staff_Id == id)
		{
			index = i;
			break;
		}
	}
	return index;
}

4、在workerManager.cpp实现 void delete_worker()

void workerManager::delete_Worker_Information()
{
	if (this->file_Is_Empty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		cout << "请输入删除员工的编号" << endl;
		int id=0;
		cin >> id;
		int idResult = this->worker_isExist(id);
		if (idResult != -1)
		{
			for (int i = idResult; i < this->file_Person_Number-1; i++)//数组中最后一个元素的位置

			{
				this->worker_Array_Pointer[i] = this->worker_Array_Pointer[i + 1];
			}
			this->file_Person_Number--;
			this->saveFile();
			cout << "删除成功!" << endl;
		}
		else
		{
			cout << "职工的编号不存在,删除失败!" << endl;
		}
	}
	system("pause");
	system("cls");
}

11、修改职工

1、在workerManager.h中添加修改职工声明 void modify_()
2、在workerManager.cpp中实现这个函数

void workerManager::modify_Worker_Information()
{
	if (this->file_Is_Empty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		cout<< "请输入修改员工的编号" << endl;
		int id = 0;
		cin >> id;
		int idResult = this->worker_isExist(id);
		if (idResult != -1)
		{
			delete this->worker_Array_Pointer[idResult];
			int newId=0;
			string newName=" ";
			int newDepartmentId=0;
			cout << "查到: " << id << "号职工,请输入新职工工号:" << endl;
			cin >> newId;
			cout << "请输入新姓名:" << endl;
			cin >> newName;
			cout << "请输入新的岗位:" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			cin >> newDepartmentId;
			Worker* worker = NULL;
			switch (newDepartmentId)
			{
			case 1:
				worker = new Employee(newId, newName, newDepartmentId);
				break;
			case 2:
				worker = new Manager(newId, newName, newDepartmentId);
				break;
			case 3:
				worker = new Boss(newId, newName, newDepartmentId);
				break;
			default:
				break;
			}
			//关系到数组中
			this->worker_Array_Pointer[idResult] = worker;
			cout << "修改成功!" << endl;
			//保存到文件中
			this->saveFile();
		}
		else
		{
			cout << "查找失败,不存在这个员工!" << endl;
		}
		

	}
	system("pause");
	system("cls");
}

12、查找职工

1、在workerManager.h中添加查找职工声明 void find_()
2、在workerManager.cpp中实现这个函数

void  workerManager::find_Worker_information()
{
	if (this->file_Is_Empty)
	{
		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 idResult = this->worker_isExist(id);
			if (idResult != -1)
			{
				cout << "查找成功!该职工的信息如下:" << endl;
				this->worker_Array_Pointer[idResult]->show_Person_Information();
			}
			else
			{
				cout << "查找失败,查无此人!" << endl;
			}
		}
		else if (select == 2)
		{
			string name;
			cout << "请输入查找的职工姓名:" << endl;
			cin >> name;
			bool flag = false;//查到的标志
			for (int i = 0; i < this->file_Person_Number; i++)
			{
				if (this->worker_Array_Pointer[i]->staff_Name == name)
				{
					cout << "查找成功!该职工的编号为:" << this->worker_Array_Pointer[i]->staff_Id << endl;
					cout << "该职工的信息如下:" << endl;
					flag = true;
					this->worker_Array_Pointer[i]->show_Person_Information();
				}
			}
			
			if(flag==false)
			{
				cout << "查找失败,查无此人!" << endl;
			}
		}
		else
		{
			cout << "输入有误!" << endl;
		}
	}
	//system("pause");
}

13、排序

1、在workerManager.h中添加查找职工声明 void sort_()
2、在workerManager.cpp中实现这个函数

void  workerManager::sort_Worker_Information()
{
	if (this->file_Is_Empty)
	{
		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->file_Person_Number; i++)
		{
			int min_Or_Max = i;//声明最小值或者最大值下标
			for (int j = i + 1; j < this->file_Person_Number; j++)
			{
				if (select == 1)//升序排列
				{
					if (this->worker_Array_Pointer[min_Or_Max]->staff_Id>this->worker_Array_Pointer[j]->staff_Id)
					{
						min_Or_Max = j;
					}
					
				}
				else//降序排列
				{
					if (this->worker_Array_Pointer[min_Or_Max]->staff_Id < this->worker_Array_Pointer[j]->staff_Id)
					{
						min_Or_Max = j;
					}
				}
					
			}
			if (i != min_Or_Max)
			{
				Worker* temporary_Number = this->worker_Array_Pointer[i];
				this->worker_Array_Pointer[i]=this->worker_Array_Pointer[min_Or_Max];
				this->worker_Array_Pointer[min_Or_Max] = temporary_Number;
			}
		}
		cout << "排序成功!排序后的结果为:" << endl;
		this->saveFile();
		this->show_Worker_Information();
	}
}

14、清空文件

1、在workerManager.h中添加查找职工声明 void clear_()
2、在workerManager.cpp中实现这个函数

void workerManager::clear_Worker_File_Information()
{
	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->worker_Array_Pointer != NULL)
		{
			for (int i = 0; i < this->file_Person_Number; i++)
			{
				if (this->worker_Array_Pointer[i] != NULL)
				{
					delete this->worker_Array_Pointer[i];
				}
			}
			this->file_Person_Number = 0;
			delete[] this->worker_Array_Pointer;
			this->worker_Array_Pointer = NULL;
			this->file_Is_Empty = true;
		}
		cout << "清空成功!" << endl;
	}
}
【员工管理系统】 问题描述:每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。 基本要求:排序:按不同关键字,对所有员工的信息进行排序;查询:按特定条件查找员工;更新,按编号对某个员工的某项信息进行修改;插入,加入新员工的信息;删除,按编号删除已离职的员工的信息。 选作内容:实现图形用户界面。 通过链表实现 数据结构: #include #include #include #include #include using namespace std; typedef struct workers{ char name[15];//姓名 char department[18];//单位 char gender;//性别 unsigned int age;//年龄 unsigned long long telephone;//电话 unsigned long wage;//工资 unsigned long num;//职工号 struct workers *next; }*Linklist,Lnode; void frist_print() { printf("\t\t⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ \n\n"); printf("\t\t\t欢迎进入员工管理系统\n"); } void menu() { printf("\n\t\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf("\t\t \t ◎1.创建员工信息\t \n"); printf("\t\t \t ◎2.插入员工信息\t \n"); printf("\t\t \t ◎3.修改员工信息\t \n"); printf("\t\t \t ◎4.删除员工信息\t \n"); printf("\t\t \t ◎5.查询员工信息\t \n"); printf("\t\t \t ◎6.员工信息排序\t \n"); printf("\t\t \t ◎7.显示员工信息\t \n"); printf("\t\t \t ◎8.员工工资情况\t \n"); printf("\n\t\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf("注意:输入均以回车作为结束\n"); printf("please choise 1--8:\t "); //putchar(12); } void Inset(Linklist Head){ Linklist s,L; unsigned int agee; unsigned long wagee,numm;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值