闲来无事,写了个简单的职工管理系统可以实现显示职工信息、增加、删除职工、排序的操作

这是主函数
guanglixitong.cpp

//guanglixitong.cpp
#include <iostream>
#include"boss.h"
#include"manager.h"
#include"worker.h"
#include"employee.h"
#include"workermanager.h"
using namespace std;

void test02()
{
    //实例化管理者对象
    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.Change_Emp();
             break;
         case 5:    //查找职工
             wm.Find_Emp();
             break;
         case 6:    //排序职工
             wm.Sort_Emp();
             break;
         case 7:    //清空文档
             wm.Clear_File();
             break;
         default:
             system("cls");//清屏操作
             break;
         }
    }

    system("pause");
}
void test03()
{
    Worker *worker1=NULL;
    worker1=new Employee(1,"张三",1);
    worker1->showInfo();
    delete worker1;


    worker1=new Boss(2,"李四",2);
    worker1->showInfo();
    delete worker1;

    worker1=new Manager(3,"王五",3);
    worker1->showInfo();
    delete worker1;
}

int main()
{
    test02();
    return 0;
}

这是老板类,继承于 Worker类

boss.h

#ifndef BOSS_H
#define BOSS_H

#include"worker.h"
#include<iostream>
using namespace std;
class Boss:public Worker
{
public:
    Boss(int id,string name, int  did);
    //显示函数
    virtual void showInfo();
    //获取名字
    virtual string getDeptName();
};

#endif // BOSS_H

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

这是普通员工类,继承于 Worker类
employee.h

#ifndef EMPIOYEE_H
#define EMPIOYEE_H
#include"worker.h"
#include<iostream>
using namespace std;
class Employee:public Worker
{
public:
    Employee(int id,string name, int  did);
    //显示函数
    virtual void showInfo();
    //获取名字
    virtual string getDeptName();
};

#endif // EMPIOYEE_H

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

这是经理类,继承于 Worker类
manager.h

#ifndef MANAGER_H
#define MANAGER_H
#include"worker.h"
#include<iostream>
using namespace std;
class Manager:public Worker
{
public:
    Manager(int id,string name, int  did);
    //显示函数
    virtual void showInfo();
    //获取名字
    virtual string getDeptName();
};

#endif // MANAGER_H

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

这是Worker;派生出来三个子类
功能有显示员工信息,传递部门名字
自身不提供函数的实现,由子类实现
worker.h

#ifndef WORKER_H
#define WORKER_H


#include<iostream>
#include<string>
using namespace std;
class Worker
{
public:
    virtual void showInfo()=0;
    virtual string getDeptName()=0;
public:
    //职工编号
    int m_Id;
    //职工名字
    string m_Name;
    //部门编号
    int m_DeptId;
};
#endif // WORKER_H

这是管理者类,实现各种功能
workermanager.h

#ifndef WORKERMANAGER_H
#define WORKERMANAGER_H

#include"worker.h"
#include<iostream>
using namespace std;
class WorkerManager
{
public:
    WorkerManager();

    //展示菜单
    void Show_Menu();

    //退出函数
    void ExitSystem();

    //保存文件
    void Save();

    ~WorkerManager();

    //显示员工
    void Show_Emp();

    //添加职工
    void add_Emp();

    //统计文件中人数
    int get_EmpNum();


    void init_Emp();
    //删除职工
    void Del_Emp();

    //判断职工是否存在
    int IsExist(int id );
   // int IsExist(string name);

    //修改员工信息
    void Change_Emp();

    void func(int index);

    //查找职工
    void Find_Emp();

    //排序职工(按编号)
    void Sort_Emp();

    //清空文件
    void Clear_File();


public:
    //记录职工人数
    int m_EmpNum;

    //职工数组指针
    Worker ** m_EmpArray;

    //
    bool m_FileIsEmpty;


};
#endif // WORKERMANAGER_H

workermanager.cpp

#include"workermanager.h"
#include"boss.h"
#include"manager.h"
#include"employee.h"
#include<fstream>
#define FILENAME "empFile.txt"
WorkerManager::WorkerManager()
{
    //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())
    {
        //w文件为空
      //  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();
    this->m_FileIsEmpty=false;

}

WorkerManager::~WorkerManager()
{
    if(this->m_EmpArray!=NULL)
    {
        for(int i=0;i<this->m_EmpNum;i++)
        {
            if(this->m_EmpArray[i]!=NULL)
            {
                delete this->m_EmpArray[i];
            }
        }
        delete[] this->m_EmpArray;
        this->m_EmpArray=NULL;
    }

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

void WorkerManager::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();
}

void WorkerManager::ExitSystem()
{
    cout<<"欢迎下次使用"<<endl;
    system("pause");
    exit(0);
}
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;
        if(did==1)  //普通员工
        {
            worker=new Employee(id,name,did);
        }
        else  if(did==2)  //经理
        {
            worker=new Manager(id,name,did);
        }
        else if(did==3)  //老板
        {
            worker=new Boss(id,name,did);
        }
        this->m_EmpArray[index++]=worker;
     }
    ifs.close();
}
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;

}
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++;
    }
    return num;
}

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_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;

           //判断是否存在该编号职工
           for(;IsExist(id )!=-1;)
           {
               cout<<"存在编号为"<<id<<"的职工"<<endl;
               cout<<"请重新输入第"<<i+1<<"个新职工编号"<<endl;
               cin>>id;
           }

           cout<<"请输入第"<<i+1<<"个新职工姓名"<<endl;
           cin>>name;

           cout<<"请输入第"<<i+1<<"个新职工部门编号"<<endl;
           cout<<"1、普通职工"<<endl;
           cout<<"2、经理"<<endl;
           cout<<"3、老板"<<endl;
           cin>>dSelect;

           Worker * worker=NULL;
           switch (dSelect) {
           case 1:
                worker=new Employee(id,name,dSelect);
               break;
           case 2:
                worker=new Manager(id,name,dSelect);
               break;
           case 3:
                worker=new Boss(id,name,dSelect);
               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;

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

       //保存数据到问件中
       this->Save();
    }
    else
    {
        cout<<"输入有误!"<<endl;
    }


    //按任意键后 清屏回到上级目录
    system("pause");
    system("cls");
}

//删除职工
void WorkerManager::Del_Emp()
{
    if(this->m_FileIsEmpty)
        cout<<"文件不存在或记录为空"<<endl;
    else{
         int id;
         cout<<"请输入要删除的职工编号"<<endl;
         cin>>id;
         int index=this->IsExist(id);
         if(index!=-1)
         {
             //删除员工
             for(int i=index;i<this->m_EmpNum;i++)
             {
                 this->m_EmpArray[i]=this->m_EmpArray[i+1];

             }
             this->m_EmpNum--;
             //数据更新到文件中
             this->Save();
           cout<<"成功删除!"<<endl;
         }
         else
         {
             cout<<"不存在该员工"<<endl;
         }
    }
    system("pause");
    system("cls");
}

//判断职工是否存在
int WorkerManager::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;

}
/*
int WorkerManager::IsExist(string name)
{
    int index=-1;
    for(int i=0;i<this->m_EmpNum;i++)
    {
        if(this->m_EmpArray[i]->m_Name==name)
        {
            index=i;
            break;
        }
    }
    return index;

}
*/

void WorkerManager::Change_Emp()
{
    if(this->m_FileIsEmpty)
        cout<<"文件不存在或记录为空"<<endl;
    else
    {
        cout<<"请输入需要修改的员工编号"<<endl;
        int id;
        cin>>id;
        int index=this->IsExist(id);

        if(index!=-1)
        {
            //修改员工信息
            cout<<"请输入需要修改该员工的哪项属性"<<endl;
            cout<<"1、编号"<<endl;
            cout<<"2、姓名"<<endl;
            cout<<"3、职位"<<endl;
            int Se;
            cin>>Se;

            switch (Se) {
            case 1:
               {
                cout<<"请输入新的编号:"<<endl;
                int id;
                cin>>id;
                this->m_EmpArray[index]->m_Id=id;
                break;
                }
            case 2:
               {
                cout<<"请输入新的姓名:"<<endl;
                string name ;
                cin>>name;
                this->m_EmpArray[index]->m_Name=name;
                break;
                }
            case 3:
                func(index);
                break;

            default:
                break;
            }

            //数据更新到文件中
            this->Save();
            cout<<"成功修改!"<<endl;
        }
        else
        {
            cout<<"不存在该员工,修改失败!"<<endl;
        }
    }
    system("pause");
    system("cls");

 }


//修改员工的部门
void WorkerManager::func(int index)
{
    cout<<"请输入新的部门编号:"<<endl;
    cout<<"1、普通员工!"<<endl;
    cout<<"2、经理!"<<endl;
    cout<<"3、老板!"<<endl;
    int did;
    cin>>did;
    Worker * worker=NULL;
    switch(did)
    {
    case 1:
        worker=new Employee(this->m_EmpArray[index]->m_Id,this->m_EmpArray[index]->m_Name,did);
        break;
    case 2:
        worker=new Manager(this->m_EmpArray[index]->m_Id,this->m_EmpArray[index]->m_Name,did);
        break;
    case 3:
        worker=new Boss(this->m_EmpArray[index]->m_Id,this->m_EmpArray[index]->m_Name,did);
        break;
    }
    this->m_EmpArray[index]=worker;
}
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)
        {
            cout<<"请输入要查找的职工编号!"<<endl;
            int id;
            cin>>id;

            if(IsExist(id)!=-1)
            {
                cout<<"查找成功,该职工信息如下:"<<endl;
                this->m_EmpArray[IsExist(id)]->showInfo();
            }
            else{
                cout<<"不存在编号为:"<<id<<"的员工"<<endl;
            }
        }else if(select==2)
        {
            string name;
            cout<<"请输入要查找的员工姓名:"<<endl;
            cin>>name;
            bool flag=false;
            for(int i=0;i<this->m_EmpNum;i++)
            {
                if(name==this->m_EmpArray[i]->m_Name)
                {
                 flag=true;
                 cout<<"查找成功,该职工信息如下:"<<endl;
                 this->m_EmpArray[i]->showInfo();
                }
            }
            if(flag==false)
            {
                cout<<"不存在该员工"<<endl;
            }
        }else
        {
            cout<<"输入有误"<<endl;
        }
    }
    system("pause");
    system("cls");
}

void WorkerManager::Sort_Emp()
{
    if(this->m_FileIsEmpty)
        cout<<"文件不存在或记录为空"<<endl;
    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_EmpArray[MinOrMax]->m_Id>m_EmpArray[j]->m_Id)
                    {
                        MinOrMax=j;
                    }
                }
                else    //降序
                {
                    if(m_EmpArray[MinOrMax]->m_Id < m_EmpArray[j]->m_Id)
                    {
                        MinOrMax = j;
                    }
                }
                //交换
                if(i!=MinOrMax)
                {
                    Worker *worker = m_EmpArray[i];
                    m_EmpArray[i] = m_EmpArray[MinOrMax];
                    m_EmpArray[MinOrMax] = worker;
                }

            }
        }
        cout<<"排序的结果为"<<endl;
        this->Save();
        this->Show_Emp();


    }
    system("pause");
    system("cls");
}
//清空文件
void WorkerManager::Clear_File()
{
    cout<<"确认清空?"<<endl;
    cout<<"1、确认"<<endl;
    cout<<"2、返回"<<endl;

    int select = 0;
    cin>>select;
    if(select==1)
    {
        //打开模式 ios::trunc 如果存在删除文件并重新创建
        ofstream ofs(FILENAME,ios::trunc);

        if(this->m_EmpArray!=NULL)
        {
            for(int i=0;i<this->m_EmpNum;i++)
            {
                if(this->m_EmpArray[i]!=NULL)
                {
                    delete this->m_EmpArray[i];
                }
            }
            this->m_EmpNum=0;
            delete[] this->m_EmpArray;
            this->m_EmpArray=NULL;
            this->m_FileIsEmpty=true;
        }
        cout<<"清空成功!"<<endl;
    }
    system("pause");
    system("cls");
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐