C++ 基于多态的职工管理系统——显示职工、删除职工、修改职工、查找职工、排序

219 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

目录

10、显示职工

10.1 显示职工函数声明

10.2 显示职工函数实现

11、删除职工

11.1 删除职工函数声明

11.2 职工是否存在函数声明

11.3 职工是否存在函数实现

11.4 删除职工函数实现

12、修改职工

12.1 修改职工函数声明

12.2 修改职工函数实现

13、查找职工

13.1 查找职工函数声明

13.2 查找职工函数实现

14、

14.1 排序函数声明

14.2 排序函数实现

15、清空文件

15.1 清空函数声明

15.2 清空函数实现


*

10、显示职工

功能描述:显示当前所有职工信息

10.1 显示职工函数声明

在workerManager.h中添加成员函数 void Show_Emp();

    //显示职工
    void Show_Emp();

10.2 显示职工函数实现

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

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

11、删除职工

功能描述:按照职工的编号进行删除职工操作

11.1 删除职工函数声明

在workerManager.h中添加成员函数 void Del_Emp();

    //删除职工
    void Del_Emp();

11.2 职工是否存在函数声明

很多功能都需要用到根据职工是否存在来进行操作如:删除职工、修改职工、查找职工

因此添加该公告函数,以便后续调用

在workerManager.h中添加成员函数 int IsExist(int id);

    //按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1
    int IsExist(int id);

11.3 职工是否存在函数实现

在workerManager.cpp中实现成员函数 int IsExist(int id);

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

11.4 删除职工函数实现

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

//删除职工
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)  //说明index上位置数据需要删除
        {
            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");
}

12、修改职工

功能描述:能够按照职工的编号对职工信息进行修改并保存

12.1 修改职工函数声明

在workerManager.h中添加成员函数 void Mod_Emp();

    //修改职工
    void Mod_Emp();

12.2 修改职工函数实现

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

//修改职工
void WorkerManager::Mod_Emp()
{
    if (this->m_FileIsEmpty)
    {
        cout << "文件不存在或记录为空!" << endl;
    }
    else
    {
        cout << "请输入修改职工的编号:" << endl;
        int id;
        cin >> id;
​
        int ret = this->IsExist(id);
        if (ret != -1)
        { 
            //查找到编号的职工
​
            delete this->m_EmpArray[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)
            {
            case1:
                worker = new Employee(newId, newName, dSelect);
                break;
            case2:
                worker = new Manager(newId, newName, dSelect);
                break;
            case 3:
                worker = new Boss(newId, newName, dSelect);
                break;
            default:
                break;
            }
​
            //更改数据 到数组中
            this->m_EmpArray[ret]= worker;
            
            cout << "修改成功!" << endl;
​
            //保存到文件中
            this->save();
        }
        else
        {
            cout << "修改失败,查无此人" << endl;
        }
    }
​
    //按任意键 清屏
    system("pause");
    system("cls");
}
​

13、查找职工

功能描述:提供两种查找职工方式,一种按照职工编号,一种按照职工姓名

13.1 查找职工函数声明

在workerManager.h中添加成员函数 void Find_Emp();

    //查找职工
    void Find_Emp();

13.2 查找职工函数实现

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

//查找职工
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_EmpArray[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_EmpArray[i]->m_Name == name)
                {
                    cout << "查找成功,职工编号为:"
                           << m_EmpArray[i]->m_Id
                           << " 号的信息如下:" << endl;
                    
                    flag = true;
​
                    this->m_EmpArray[i]->showInfo();
                }
            }
            if (flag == false)
            {
                //查无此人
                cout << "查找失败,查无此人" << endl;
            }
        }
        else
        {
            cout << "输入选项有误" << endl;
        }
    }
​
​
    system("pause");
    system("cls");
}

14、排序

功能描述:按照职工编号进行排序,排序的顺序由用户指定

14.1 排序函数声明

在workerManager.h中添加成员函数 void Sort_Emp();

    //排序职工
    void Sort_Emp();

14.2 排序函数实现

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

//排序职工
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_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 * temp = m_EmpArray[i];
                m_EmpArray[i] = m_EmpArray[minOrMax];
                m_EmpArray[minOrMax] = temp;
            }
​
        }
​
        cout << "排序成功,排序后结果为:" << endl;
        this->save();
        this->Show_Emp();
    }
​
}

15、清空文件

功能描述:将文件中记录数据清空

15.1 清空函数声明

在workerManager.h中添加成员函数 void Clean_File();

    //清空文件
    void Clean_File();

15.2 清空函数实现

在workerManager.cpp中实现员函数 void Clean_File();

//清空文件
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_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");
}