你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

职工管理系统(C++版)

2021-11-21 15:56:51

实现功能

职工分为三类:1.普通员工;2.经理;3.老板

  • 添加职工

  • 显示职工

  • 删除职工

  • 修改职工

  • 查找职工

  • 排序职工

  • 清空文件

具体实现

主函数

职工管理系统.cpp

#include <iostream>
using namespace std;
#include"workerManager.h"

int main (){
    //实例化管理者对象
    workerManager wm;
    int choice = 0;
    while(true){
        wm.Show_Menu();
        cout << "请输入您的选择:"<<endl;
        cin>>choice;

        switch (choice)
        {
            case 0://退出系统
                wm.exitSystem();
                break;
            case 1://添加员工
                wm.Add_Emp();

                break;
            case 2://显示员工
                wm.show_Emp();
                break;
            case 3://删除员工
                wm.Del_Emp();
                break;
            case 4://修改员工
                wm.Mod_Emp();
                break;
            case 5://查找员工
                wm.Find_Emp();
                break;
            case 6://排序员工
                wm.Sort_Emp();
                break;
            case 7://清空文件
                wm.Clean_File();
                break; 
            default:
                system("cls");
                break;
        }
    }
    system("pause");
    return 0;
}

worker函数,定义一些职工属性(职工抽象基类)

  • worker.h头文件
#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;//职工所在部门名称编号

};

员工类

  • employee.h头文件
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

//员工类
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职工姓名:"<<this ->m_Name
        <<"\t岗位:"<<this ->getDeptName()
        <<"\t岗位职责:完成经理交给任务"<<endl;
 }

 string Employee::getDeptName(){
     return string ("员工");
 }

经理类

  • manager.h头文件
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

//经理类
class Manager :public worker{
    public:

        //构造函数
        Manager(int id,string name,int dId);

        //显示个人信息
        virtual void showInfo();

        //获取职工岗位名称
        virtual string getDeptName();
};
  • manager.cpp
 #include "manager.h"
 Manager::Manager(int id,string name,int dId){
     this -> m_Id = id;
     this -> m_Name = name;
     this ->m_DeptId = dId;
 }

 void Manager::showInfo(){
     cout <<"职工编号:"<<this ->m_Id
        <<"\t职工姓名:"<<this ->m_Name
        <<"\t岗位:"<<this ->getDeptName()
        <<"\t岗位职责:完成老板交给的任务,并下发给员工"<<endl;
 }

 string Manager::getDeptName(){
     return string ("经理");
 }

老板类

  • boss.h头文件
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

//经理类
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职工姓名:"<<this ->m_Name
        <<"\t岗位:"<<this ->getDeptName()
        <<"\t岗位职责:管理公司所有事务"<<endl;
 }

 string Boss::getDeptName(){
     return string ("老板");
 }

workerManager函数的具体实现

  • workerManager.h    对各种功能函数进行声明
#pragma once
#include <iostream>
#include "worker.h"
#include<fstream>
#define FILENAME "empFile.txt"
using namespace std ;

class workerManager{
    public:
        //构造函数
        workerManager();
        //展示菜单
        void Show_Menu();
        //退出系统
        void exitSystem();

        //增加职工
        void Add_Emp();
        //记录文件中的人数
        int m_EmpNum;
        //员工数组的指针
        worker ** m_EmpArry;
        //保存文件
        void save();
        //标记文件是否为空
        bool m_FileIsEmpty;
        //统计人数
        int get_EmpNum();
        //初始化员工
        void init_Emp();
        //显示职工
        void show_Emp();
        //删除员工
        void Del_Emp();
        //判断职工是否存在
        int IsExist(int id);
        //修改职工
        void Mod_Emp();
        //查找职工
        void Find_Emp();
        //排序职工
        void Sort_Emp();
        //清空文件
        void Clean_File();

};
  • workerManager.cpp      对workerManager.h中声明的各函数进行具体实现

(其中代码注释很详细,具体哪一块代码实现什么功能描述很清楚,这里不进行过多解释)

#include "workerManager.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"
#include<fstream>

workerManager::workerManager()
{//初始化属性
    //1.文件不存在情况
    ifstream ifs;
    ifs.open(FILENAME,ios::in);//读文件
    if(!ifs.is_open()){
        //cout<<"文件不存在"<<endl;
        this->m_EmpNum=0;//初始化人数
        this->m_FileIsEmpty=true;//初始化空文件标记
        this->m_EmpArry=NULL;//初始化数组
        ifs.close();//关闭文件
        return;
    }
    //2.文件存在,但为空
    char ch;
    ifs>>ch;//读文件一个字符
    if(ifs.eof()){//若为EOF则表示文件为空(空文件只有eof标志)
        //cout<<"文件为空!"<<endl;
        this->m_EmpNum=0;
        this->m_FileIsEmpty=true;
        this->m_EmpArry=NULL;
        ifs.close();
        return;
    }
    //3.文件存在,且记录数据
    int num = this->get_EmpNum();
    //cout << "职工人数为:" << num <<endl;
    this->m_EmpNum=num;
    //根据员工数创建数组
    this->m_EmpArry=new worker *[this->m_EmpNum];
    //初始化职工,将文件中的数据从到数组中
    this->init_Emp();
}

//展示菜单
void workerManager::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;
}
void workerManager::exitSystem(){
    cout<<"欢迎下次使用"<<endl;
    system("pause");
    exit(0);//退出程序
}
//增加职工
void workerManager::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_EmpArry!=NULL){
            for(int i =0;i<this->m_EmpNum;i++){
                newSpace[i] = this->m_EmpArry[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);
                break;
            case 3:
                worker = new Boss(id,name,3);
                break;
            default:
                break;
            }

            newSpace[this->m_EmpNum+i]=worker;

        }

        //释放原有空间
        delete[]this->m_EmpArry;

        //更改新空间指针
        this->m_EmpArry = newSpace;
        //更新新的个数
        this->m_EmpNum = newSize;
        //提示信息
        cout <<"成功添加"<<addNum<<"名新员工!"<<endl;
        //职工文件不为空
        this->m_FileIsEmpty = false;
        //保存到文件中
        this->save();
    }
    else{
        cout <<"输入有误"<<endl;
    }
    system("pause");
    system("cls");
}
//保存文件
void workerManager::save(){
    ofstream ofs;
    ofs.open(FILENAME,ios::out);

    for (int i = 0;i<this->m_EmpNum;i++){
        ofs <<this->m_EmpArry[i]->m_Id<<" "
            <<this->m_EmpArry[i]->m_Name<<" "
            <<this->m_EmpArry[i]->m_DeptId<<endl;
    }
    ofs.close();
}

//统计职工人数
int workerManager::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++;

    }
    ifs.close();
    return num;
}
//初始化员工数组
void workerManager::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;
        //根据不同的部门Id创建不同对象
        if (dId == 1){//普通员工
            worker = new Employee(id,name,dId);
        }
        else if (dId == 2){//经理
            worker = new Manager(id,name,dId);
        }
        else{//BOSS
            worker = new Boss(id,name,dId);
        } 
        //存放在数组
        this->m_EmpArry[index] = worker;
        index++;
    }
    ifs.close();

}
//显示职工操作
void workerManager::show_Emp(){
    if (this->m_FileIsEmpty){
        cout<<"文件不存在或记录为空"<<endl;
    }
    else{
        for (int i = 0;i<m_EmpNum;i++){
            //利用多态调用接口
            this->m_EmpArry[i]->showInfo();
        }
    }
    system("pause");
    system("cls");
}

//按照职工编号判断职工是否存在,若存在返回职工在数组中的位置,不从在返回-1
int workerManager::IsExist(int id){
    int index = -1;
    for (int i =0;i < this->m_EmpNum;i++){
        if (this->m_EmpArry[i]->m_Id == id){
            index = i;
            break;
        }
    }
    return index;
}

//删除职工 
void workerManager::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_EmpArry[i]=this->m_EmpArry[i+1];
            }
            this->m_EmpNum--;//更新数组中记录人员个数
            //同步到文件中
            this->save();
            cout<<"删除成功"<<endl;
        }
        else{
            cout<<"未找到该员工,删除失败!"<<endl;
        }
    }
    system("pause");
    system("cls");
}
//修改职工
void workerManager::Mod_Emp(){
    if(this->m_FileIsEmpty){
        cout<<"文件不存在或记录为空"<<endl;
    }
    else{
        cout<<"请输入想要修改职工的编号:"<<endl;
        int id = 0;
        cin>>id;
        int ret = this->IsExist(id);
        if(ret!=-1){
            delete this->m_EmpArry[ret];
            int newId=0;
            string newName = "";
            int dSelect = 0;
            cout<<"查到"<<id<<"号员工,请输入新职工号:"<<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,1);
                break;
            case 2:
                worker = new Manager(newId,newName,2);
                break;
            case 3:
                worker = new Boss(newId,newName,3);
                break;
            default:
                break;
            }
            //更新数据 到数组中
            this->m_EmpArry[ret]=worker;
            cout<<"修改成功!"<<this->m_EmpArry[ret]->m_DeptId<<endl;
            //保存到文件
            this->save();
        }
        else{
            cout<<"修改失败,查无此人"<<endl;
        }
    }
    //按任意键继续  清屏
    system("pause");
    system("cls");
}

//查找职工
void workerManager::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_EmpArry[ret]->showInfo();
            }
            else{
                cout<<"查找失败,查无此人"<<endl;
            }
        }
        else if(Select==2){//按姓名查找
            string name;
            cout<<"请输入员工姓名:"<<endl;
            cin>>name;
            bool flag = false;//查找到的标志
            for (int i = 0; i <m_EmpNum;i++){
                if(m_EmpArry[i]->m_Name==name){
                    cout<<"查找成功,职工编号是:"
                    <<m_EmpArry[i]->m_Id
                    <<"号的信息如下:"<<endl;
                    flag = true;
                    this->m_EmpArry[i]->showInfo();
                }
            }
            if(flag == false){
                //查无此人
                cout<<"查找失败,查无此人"<<endl;
            }
        }
        else{
            cout<<"输入选项有误"<<endl;
        }
    }
    system("pause");
    system("cls");
}

//排序职工
void workerManager::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<m_EmpNum;i++){
            int minOrMax = i;
            for(int j=i+1;j<m_EmpNum;j++){
                if(select == 1)//升序
                {
                    if(m_EmpArry[minOrMax]->m_Id>m_EmpArry[j]->m_Id){
                        minOrMax = j;
                    }
                }
                else {//降序
                    if (m_EmpArry[minOrMax]->m_Id<m_EmpArry[j]->m_Id){
                        minOrMax = j;
                    }
                }
            }
            if (i!=minOrMax){
                worker *temp = m_EmpArry[i];
                m_EmpArry[i]=m_EmpArry[minOrMax];
                m_EmpArry[minOrMax]=temp;
            }
        }
        cout<<"排序成功,排序后结果为:"<<endl;
        this->save();
        this->show_Emp();
    }
}


//清空文件
void workerManager::Clean_File(){
    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->m_EmpArry != NULL){
            for(int i = 0;i < this->m_EmpNum ; i++){
                if(this->m_EmpArry[i]!=NULL){
                    delete this->m_EmpArry[i];
                }
            }
            this->m_EmpNum=0;
            delete[] this->m_EmpArry;
            this->m_EmpArry=NULL;
            this->m_FileIsEmpty=true;
        }
        cout<<"清空成功!"<<endl;
    }
    system("pause");
    system("cls");
}

  

完结!!!

欢迎进行任何问题的交流!!