职工管理系统
一、功能介绍
该职工管理系统8个功能,管理的职工有三大类:
- 八大功能介绍
- 退出功能:选择0时程序停止运行退出
- 增加职工信息功能:完成各类职工的添加,并将其写入文件中
- 显示职工信息功能:从文件中读出数据,将其展示在屏幕中
- 删除离职职工功能:按照职工编号将该职工信息从文件中删除
- 修改职工信息功能:按照职工编号对职工的信息进行修改
- 查找职工信息功能:提供按职工编号和职工姓名进行查找
- 排序职工信息功能:将职工的信息按照编号进行排序,可升序也可降序,并且排序后的数据将同步到文件中
- 清空所有数据功能:将文件中所有的数据全部清空
- 三类职工
- 普通员工类
- 经理类
- 老板类
类的设计如下:
该项目采用标准的设计,即类的定义和实现分开实现
二、功能详细介绍
1、各类的实现
- Worker类:定义两个纯虚函数和三个属性,由其子类实现并继承,该文件为头文件,不实现具体功能
//worker.h
class Worker {
public:
//显示个人信息
virtual void showInfo() = 0;
//获取岗位名称
virtual string getDeptName() = 0;
//职工编号
int m_Id;
//职工姓名
string m_Name;
//部门编号
int m_DeptId;
};
- Employee类:普通员工,继承Worker类
//employee.h
#pragma once //确保头文件只出现一次,防止头文件重复
#include<iostream>
#include "worker.h"
using namespace std;
class Employee : public Worker {
public:
Employee(int id,string name,int dId);//构造函数
//显示个人信息
virtual void showInfo() ;
//获取岗位名称
virtual string getDeptName() ;
};
//employee.cpp 实现功能
#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\t"<<"职工姓名:"<<this->m_Name
<<"\t\t"<<"职工岗位:"<<this->getDeptName()<<endl;
}
//获取岗位名称
string Employee::getDeptName() {
return string("员工");
}
- Manger类:经理,继承父类Worker
//manger.h
#pragma once
#include<iostream>
#include "worker.h"
using namespace std;
class Manger : public Worker {
public:
Manger(int id,string name,int dId);
virtual void showInfo();
virtual string getDeptName();
};
//manger.cpp
#include "manger.h"
Manger::Manger(int id, string name, int dId) {
this->m_Id=id;
this->m_Name=name;
this->m_DeptId=dId;
}
void Manger::showInfo() {
cout << "职工编号:" << this->m_Id
<< "\t\t" << "职工姓名:" << this->m_Name
<< "\t\t" << "职工岗位:" << this->getDeptName() << endl;
}
string Manger::getDeptName() {
return string("经理");
}
- Boss类:老板,继承父类Worker
//boss.h
#pragma once
#include<iostream>
#include "worker.h"
using namespace std;
class Boss : public Worker {
public:
Boss(int id, string name, int dId);
virtual void showInfo();
virtual string getDeptName();
};
//boss.cpp
#include "boss.h"
Boss::Boss(int id, string name, int dId) {
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = dId;
}
void Boss::showInfo() {
cout << "职工编号:" << this->m_Id
<< "\t\t" << "职工姓名:" << this->m_Name
<< "\t\t" << "职工岗位:" << this->getDeptName() << endl;
}
string Boss::getDeptName() {
return string("老板");
}
- WorkerManger类:由于该系统功能的封装类,将该系统所需要实现的各个功能函数封装到该类中,其功能定义如下:
//workerManger.h
#pragma once //防止头文件重复包含
#include<iostream>
#include "worker.h"
using namespace std;
class WorkerManger {
public:
//构造函数
WorkerManger();
//展示菜单
void showMenu();
//退出系统
void exitSystem();
//添加职工
void addEmp();
//保存文件
void save();
//统计文件中的人数
int get_EmpNum();
//初始化员工
void init_Emp();
//显示员工
void show_Emp();
//删除职工
void del_Emp();
//根据id判断职工是否存在,存在返回在数组中的位置,不存在返回-1
int isExist(int id);
//修改职工
void update_Emp();
//判断文件是否为空
bool m_FileIsEmpty;
//查找职工
void query_Emp();
//排序职工
void sort_Emp();
//清空文件
void clear_File();
//记录职工人数
int m_EmpNum;
//职工数组指针
Worker ** m_EmpArray;
//析构函数
~WorkerManger();
};
2、功能介绍
2.1 退出功能
通过函数exit(0)实现程序的停止
//退出系统
void WorkerManger::exitSystem() {
cout<<"欢迎下次使用"<<endl;
system("pause");
exit(0);
}
2.2 添加职工功能
原理:先确定要添加的职工人数,将该人数与与原数组中的人数相加,开辟一个新的如此大小空间,将所有数据存入新的数组空间,并将该数组中的数据写入文件中
//添加职工
void WorkerManger::addEmp() {
int addNum = 0;
cout<<"请输入你要添加的职工人数:"<<endl;
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 Manger(id, name, 2);
break;
case 3:
worker = new Boss(id, name, 3);
break;
default:
break;
}
//将创建的职工数据保存到数组中
newSpace[this->m_EmpNum+i]=worker;
}
//释放原有空间
delete[] this->m_EmpArray;
//更改新空间的指向
this->m_EmpArray=newSpace;
//更新职工人数
this->m_EmpNum=newSize;
//更新职工不为空标志
this->m_FileIsEmpty=false;
//将添加的数据写入文件中
this->save();//save()函数用于实现将该类中数组中的数据写入文件
cout<<"成功添加"<<addNum<<"名新职工"<<endl;
}
else {
cout<<"输入有误"<<endl;
}
system("pause");
system("cls");
}
2.3 展示职工功能
原理:将数组中的元素依次读出并展示在屏幕上
//显示员工
void WorkerManger::show_Emp() {
//判断文件是否为空
if (this->m_FileIsEmpty) {
cout<<"文件不存在或记录为空!"<<endl;
}
else {
for (int i = 0; i < this->m_EmpNum; i++) {
this->m_EmpArray[i]->showInfo();
}
}
system("pause");
system("cls");
}
2.4 删除职工功能
原理:确定要删除职工的编号,通过函数isExist()判断该编号是否存在,存在则返回该职工在数组中的下标,不存在则返回-1,如存在,则将其后面元素依次往前移,将要删除的元素进行覆盖以达到删除,再将该数组数据重新写入文件中
//删除职工
void WorkerManger::del_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");
}
2.5 修改职工功能
原理:输入要修改职工的编号,确定该员工是否存在,如存在返回该职工在数组中的下标,先将该位置中的指针进行释放,将修改后的新数据重新存放于此
//修改职工
void WorkerManger::update_Emp() {
if (this->m_FileIsEmpty) {
cout<<"文件不存在或记录为空!"<<endl;
}
cout<<"请输入要修改职工的编号:"<<endl;
int id;
cin>>id;
int index = this->isExist(id);
if (index != -1) {
//查找到该编号的职工
delete this->m_EmpArray[index];
int newId=0;
string newName="";
int dSelect=0;
cout<<"查找到编号为"<<id<<"的员工"<<endl;
cout<<"请输入该员工新的编号:"<<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)
{
case 1:
worker = new Employee(newId,newName,dSelect);
break;
case 2:
worker = new Manger(newId, newName, dSelect);
break;
case 3:
worker = new Boss(newId, newName, dSelect);
break;
default:
break;
}
//更新数据
this->m_EmpArray[index] = worker;
this->save();
cout<<"修改成功!"<<endl;
}
else {
cout<<"该职工不存在!"<<endl;
}
system("pause");
system("cls");
}
2.6 查找职工功能
原理:按职工编号或姓名依次遍历数组进行查找
//查找职工
void WorkerManger::query_Emp() {
if (this->m_FileIsEmpty) {
cout<<"文件不存在或者记录为空"<<endl;
}
cout<<"请输入查找的方式:"<<endl;
cout<<"1-按职工编号查找"<<endl;
cout<<"2-按职工姓名查找"<<endl;
int select;
cin>>select;
if (select == 1) {
//按编号查
int id;
cout<<"请输入要查找的职工编号:"<<endl;
cin>>id;
int index = this->isExist(id);
if (index != -1) {
//找到职工
cout<<"查找成功!该职工信息如下:"<<endl;
this->m_EmpArray[index]->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 (this->m_EmpArray[i]->m_Name == name) {
cout<<"查找成功!职工编号为"<<this->m_EmpArray[i]->m_Id<<"号职工信息如下"<<endl;
this->m_EmpArray[i]->showInfo();
flag = true;
}
}
if (!flag) {
cout<<"查找失败,该职工不存在"<<endl;
}
}
else {
cout<<"输入选项有误"<<endl;
}
system("pause");
system("cls");
}
2.7 职工排序功能
原理:采用选择排序对职工编号进行升序或降序排序,并将排序后的元素写入文件中
//排序职工
void WorkerManger::sort_Emp() {
if (this->m_FileIsEmpty) {
cout<<"文件不存在或记录为空"<<endl;
}
cout<<"请选择排序方式:"<<endl;
cout<<"1-按职工编号升序排序"<<endl;
cout<<"2-按职工编号降序排序"<<endl;
int select;
cin>>select;
for (int i = 0; i < this->m_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 (select == 2) {
//降序
if (this->m_EmpArray[minOrMax]->m_Id < this->m_EmpArray[j]->m_Id) {
minOrMax = j;
}
}
}
if (1 != minOrMax) {
Worker * temp = this->m_EmpArray[i];
this->m_EmpArray[i] = this->m_EmpArray[minOrMax];
this->m_EmpArray[minOrMax] = temp;
}
}
if (select == 1 || select == 2) {
cout << "排序成功" << endl;
this->save();
}
else {
cout<<"选项输入有误"<<endl;
}
system("pause");
system("cls");
}
2.8 清空文件功能
原理:将文件删除后重新创建,重新变成一个没有数据的文件,同时将数组大小置0,删除堆区数组指针并置空
//清空文件
void WorkerManger::clear_File() {
cout<<"确定清空文件吗?"<<endl;
cout<<"1-确定"<<endl;
cout<<"2-返回"<<endl;
int select;
cin>>select;
if (select == 1) {
//清空文件
ofstream ofs;
ofs.open(FILENAME,ios::trunc);//删除文件后重新创建
ofs.close();
if (this->m_EmpArray != NULL) {
//删除堆区的每个职工对象
for (int i = 0; i < this->m_EmpNum; i++) {
delete this->m_EmpArray[i];
this->m_EmpArray[i]=NULL;
}
//删除堆区数组指针
delete[] this->m_EmpArray;
this->m_EmpArray = NULL;
this->m_EmpNum = 0;
this->m_FileIsEmpty = true;
}
cout<<"清空成功!"<<endl;
}
system("pause");
system("cls");
}
2.9 其他函数功能实现
- 构造函数实现各类数据的初始化
//构造函数用来根据不同情况来初始化各类数据
//构造函数
WorkerManger::WorkerManger() {
//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;
}
//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;
}
//3.文件存在,并且存在数据
int num=this->get_EmpNum();
//cout<<"职工人数为:"<<num<<endl;
this->m_EmpNum=num;
//开辟空间
this->m_EmpArray=new Worker*[this->m_EmpNum];
//将文件中的数据存到数组中
this->init_Emp();
//for (int i = 0; i < this->m_EmpNum; i++) {
// cout<<this->m_EmpArray[i]->m_Id<<" "
// <<this->m_EmpArray[i]->m_Name<<" "
// <<this->m_EmpArray[i]->m_DeptId<<endl;
//}
}
- 完成将数组中的数据写入到文件中
//保存文件
void WorkerManger::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();
}
- 统计函数:用于实现统计文件中职工人数
//统计文件中的人数
int WorkerManger::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;
}
- 将文件中的数据读出,并根据部门编号不同初始化不同的类,然后将其存储到数组中,用于数据的初始化操作
//初始化员工
void WorkerManger::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 Manger(id,name,dId);
}
else {
worker = new Boss(id,name,dId);
}
this->m_EmpArray[index]=worker;
index++;
}
ifs.close();
}
- 根据id判断职工是否存在
//根据id判断职工是否存在,存在返回在数组中的位置,不存在返回-1
int WorkerManger::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;
}
- 用于程序执行完后释放堆区指针
//析构函数
WorkerManger::~WorkerManger() {
if (this->m_EmpArray != NULL) {
delete[] this->m_EmpArray;
this->m_EmpArray = NULL;
}
}
三、功能展示
1、添加职工
2、显示职工
3、删除职工
4、修改职工
5、查找职工
6、职工排序
7、清空文件
四、总结
通过完成该项目,我对C++有了更深刻的了解,这很好的锻炼了我的逻辑思维能力以及代码的编写能力
本项目展示略有不够详细和完整,如对该项目有需要,可以联系本人免费获取,不懂之处也可以进行咨询:qq:3413606624