C++学习笔记-day14

职工管理系统

h文件放在头文件文件夹下,cpp文件放在源文件文件夹下

1、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();
};

 

2、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();
};

 

3、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();
};

 

4、worker.h

#pragma once   //防止头文件重复包含
#include<iostream>  //包含输入输出
using namespace std; //使用标准的命名空间

//职工抽象类

class Worker
{
public:
    //显示个人信息
    virtual void showInfo() = 0;
    //获取部门名称
    virtual string getDeptName() = 0;

    //职工编号

    int m_Id;

    //职工姓名
    string m_Name;
    //部门编号
    int m_DeptId;

};

 

5、workManager.h

#pragma once   //防止头文件重复包含
#include<iostream>  //包含输入输出
using namespace std; //使用标准的命名空间
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"

#include<fstream>
#define FILENAME "empFile.txt"


class WorkManager
{
public:
    WorkManager(); //构造函数

    void Show_Menu(); //展示菜单

    void ExitSystem();//退出系统

    ~WorkManager(); //析构函数

    void Add_Emp();  //添加职工

    void sava();  //保存文件

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

    void init_Emp(); //初始化员工

    void Show_Emp();  //显示员工

    void Del_Emp();    //删除职工

    void Mod_Emp();     //修改员工 

    void Find_Emp();     //修改员工 

    void Sort_Emp();   //排序员工

    void Clean_File(); //清空文件

    int IsExist(int id);   //判断职工是否存在,如果存在返回所在数组的位置,不存返回-1

    //记录职工人数

    int m_EmpNum;
    Worker** m_EmpArray;
    bool m_FileIsEmpty; //判断文件是否为空
    //职工数组指针
};

 

6、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)"老板";

}

 

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

}

 

8、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)"老板";

}

 

9、workManager.cpp

#include "workManager.h"
WorkManager::WorkManager()
{

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

    }
    //文件存在但为空
    char ch;
    ifs >> ch;
    if (ifs.eof())
    {
        /*cout << "文件为空!" << endl;*/

        //初始化记录人数、指针、文件是否为空
        this->m_EmpNum = 0;
        this->m_EmpArray = NULL;
        this->m_FileIsEmpty = true;
        ifs.close();
        return;
    }
    //当文件存在也记录着数据
    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 WorkManager::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 WorkManager::ExitSystem()
{
    cout << "欢迎下次使用" << endl;
    system("pause");
    exit(0);//退出程序
}
//添加职工
void WorkManager::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;

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

        //更改新空间的指向
        this->m_EmpArray = newSpace;

        //更新新职工的人数
        this->m_EmpNum = newSize;


        this->m_FileIsEmpty = false; //更新职工不为空的标志 
        //提示添加工程
        
        cout << "成功添加" << addNum << "名新职工!" << endl;

        //保存数据到文件中
        this->sava();

        //成功添加后,保存到文件中

        //按任意键后清屏回到上机目录

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



    }
    else
    {
        cout << "输入数据有误" << endl;
    }
 
}

void WorkManager::sava()
{
    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 WorkManager::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 WorkManager::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;
        index++;
    }

    //关闭文件

    ifs.close();

}

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

int WorkManager::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;
}
void WorkManager::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->sava();
            cout << "删除成功!" << endl;

        }
        else {
            cout << "未找到此员工" << endl;
        }

        
    }
    system("pause");
    system("cls");
}
void WorkManager:: 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_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)
            {
            case 1:
                worker = new Employee(newId, newName,dSelect);
                break;
            case 2:
                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;

            //保存到文件中


        }
        else {
            cout << "修改失败,未找到此员工" << endl;
        }
    }
    system("pause");
    system("cls");

}

void WorkManager::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<this->m_EmpNum;i++)
            {
                if (this->m_EmpArray[i]->m_Name == name)
                {
                    cout << "查找成功,职工编号为:" << this->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");

}
void WorkManager::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 < this->m_EmpNum; i++)
        {
            int index = i;//最小值或最大值下标
            if (select == 1)
            {
                for (int j = i + 1; j < this->m_EmpNum; j++)
                {
                    if (this->m_EmpArray[index]->m_Id > this->m_EmpArray[j]->m_Id)
                    {
                        index = j;
                    }
                }
            }
            else if (select == 2)
            {
                for (int j = i + 1; j < this->m_EmpNum; j++)
                {
                    if (this->m_EmpArray[index]->m_Id < this->m_EmpArray[j]->m_Id)
                    {
                        index = j;
                    }
                }
            }
            if (i != index)
            {
                Worker* temp = this->m_EmpArray[i];
                this->m_EmpArray[i] = this->m_EmpArray[index];
                this->m_EmpArray[index] = temp;
            }
            
        }
        cout << "排序成功,排序后的结果: " << endl;
        this->sava();
        this->Show_Emp();
        
    
        

    }




}

void WorkManager::Clean_File()
{

    cout << "确认清空吗?" << endl;
    cout << "1、确定 " << endl;
    cout << "2、返回" << endl;

    int select = 0;

    cin >> select;

    if (select == 1)
    {
        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_EmpArray[i] = NULL;
                }


            }
            delete[] this->m_EmpArray; //删除堆区数组指针
            this->m_EmpArray = NULL;
            this->m_EmpNum = 0;
            this->m_FileIsEmpty = true;
        }
        cout << "清空成功" << endl;


    }
    else if (select == 2)
    {

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

}


WorkManager::~WorkManager()
{
    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_EmpArray[i] = NULL;
            }


        }
        delete[] this->m_EmpArray;
        this->m_EmpArray = NULL;
    }
}

 

 

10、职工关系系统.cpp

#include<iostream>  //包含输入输出
using namespace std; //使用标准的命名空间
#include"workManager.h"
#include"worker.h"
#include"employee.h"

int main()
{

    //实例化管理者对象

    WorkManager 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();
        /*    int ret = wm.IsExist(1);
            if (ret != -1)
            {
                cout << "职工存在" << endl;
            }
            else
            {
                cout << "职工不存在" << endl;
            }*/
            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;
}

 

posted @ 2022-09-11 16:54  秦0710  阅读(23)  评论(0编辑  收藏  举报