C++职工管理系统 VS C职工管理系统

职工管理系统

这两天在B站上看c++,看到老师写了一个职工管理系统,整体框架都在,结果写了一个c风格的职工管理系统,然后就又看着老师的管理系统来了一遍

写职工管理系统的时候C++的优势一下就体现出来了

  • c++ 代码可以解决升级指针调用麻烦的问题,一个类中加入指针,可以在类函数中解决掉升级指针的问题,变量也可以在不同的函数中共享,在c语言中就必须去升级指针去在不同的函数中调用,对于普通变量如果不去加入指针就要去使用全局变量。
  • 由于有了父类,就可以在父类中去写不同职工之间相同的内容(姓名,编号,职位),提供了一个整体的模板,只需要再去子类中写不同的东西就可以了
  • 在去打印职工信息的时候,纯虚函数方便的多,要的内容有差异,但是只需要调用同一个函数,就可以去做不同的事情,属实很香,c就得去一个个的区分 ,代码量会大很多
  • 不需要去定义全局变量,比如很多函数会判断文件是否为空,不使用全局变量的话,就需要一次次的调用函数,效率自然会降低,C++就可以在父类中定义一个变量,增加了函数的封装性,可移植性也增强

分文件去写,也不用在一个文件中不断的去找东西,不同类型的东西放在不同的柜子里总归是好

分文件去写,也不用在一个文件中不断的去找东西,不同类型的东西放在不同的柜子里总归是好找的多。

说几个这个管理系统的缺点吧

  • 用的是指针数组存储的每个人信息,没有用链表,每次加入 / 删除新职员的时候就需要去创建一个新的指针数组去重新存储,再释放掉原本开辟的内存,让维护的指针重新改变指向
  • 用指针数组会在对编号进行排序的时候产生问题,如果职工足够的多,还能不能满足的了需求就难说了
  • 删除掉一个人的信息时,开辟、释放内存之后,修改指针指向,对文件操作时,又将文件原有的内容全部删除,再去重新按照这个指针数组去写入内容,实在是太垮了,后面自己得改改这个东西,属实写的有的臭了

虽然这个管理系统效率上有很大的缺点,但是学习价值还是可以的,可以理解一些c++的内容

成果展示

    1. 添加新职工
      在这里插入图片描述
  • 2.显示所有职工信息
    在这里插入图片描述

  • 3.修改职工信息
    在这里插入图片描述

  • 4.查找职工具体信息
    在这里插入图片描述

  • 5.按照职工编号进行排序
    在这里插入图片描述
    这个管理系统分文件进行写,这样让不同功能的代码进行分区,更容易进行多人开发,自己找也比一个文件方便的多

代码展示

菜单类

该职工管理系统使用了四个类,
第一个类workerManager,这是对整个系统进行维护,并且去创建一些需要在菜单界面需要调用的函数
对系统进行一个整体的包裹

class WorkerManager
{
    public :

    //记录员工数
    int m_EmpNum;
    //二级指针维护创建的数组
    Worker ** m_EmpArray;
    //判断文件是否为空
    bool m_FileIsEmpty = false;
    WorkerManager();
    void Add_Emp();
    //菜单
    void Show_Menu();
    //退出
    void Exit_System();
    //保存数据到文件
    void save();

    //得到员工数量
    int get_EmpNum();

    //读取职工信息到指针
    void Init_Emp();

    //显示职工信息
    void Display();

    //删除职工时,判断职工是否存在
    int IsExist(string name);
    //删除离职职工
    void Del_Emp();


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

    //查找职工信息
    void Find_Emp();

    //对职工编号进行排序
    void Sort();

    //清空文档
    void Truc_File();
    ~WorkerManager();
};

对workerManager类构造函数的实现
目的就是统计职工总人数,并且将文件的内容读取到指针中
还有个重要的细节
m_FileIsEmpty 用来判断文件是否为空,要注意这个标志什么时候需要改,如果不及时改会读取不出内容


WorkerManager :: WorkerManager()
{
    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_FileIsEmpty = true;
        this -> m_EmpArray = NULL;
        ifs.close();
        return ;
    }
    int num = this -> get_EmpNum();
    cout << "职工个数为 : " << num << endl;
    this -> m_EmpNum = num;
    this -> Init_Emp();

    
}

首先要判断文件内容是否为空,如果不为空,去统计出职工个数,并且去添加维护指针的内容,方便调用

职工类

第二个类是对职工类进行一个包裹,提供一个模板,就好比大家常用的ppt模板,提供一个框架,用户往里面去填充内容

worker纯虚函数,提供一个函数空框架,让不同类对同一个函数有不同的改变
三个变量创建在worker 是因为老板类,职工类,经理类都有这几个变量,可以直接调用

class Worker
{
    public :

        //显示个人信息
        virtual void showInfo() = 0;
        //获取岗位名称
        virtual string getDeptName() = 0;

        int Mid; // 编号
        string Name;    //姓名
        int Did;   //职工所在部门编号
};

老板类:

class Boss : public Worker
{
    public :
        Boss(int mid,string name,int did);
        virtual void showInfo();
        virtual string getDeptName();
};

老板类的具体实现:

Boss :: Boss(int mid,string name,int did)
{
    Mid = mid;
    Name = name;
    Did = did;
}

void Boss :: showInfo()
{
    cout << " " << Mid
        << "\t\t" << Name
        << "\t\t" << this -> getDeptName()
        << "\t\t" << "管理公司所有事务 " << endl;
}

string Boss :: getDeptName()
{
    return "总裁";
}

其他两个类实现和老板类基本差不多,就不贴代码了

重要功能代码

只要会了添加职工,就基本已经完成了一大半了

void WorkerManager :: Add_Emp()
{
   
    cout << "请输入增加员工的数量:";
    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];
            }
        }
        int k = addNum;
        //继续添加职工信息
        for(int i = 0 ; i < addNum ; ++ i)
        {
            int id ;
            string name;
            int did;
            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 >> did;
            Worker * worker = NULL;
            switch(did)
            {
                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 : 
                    cout << "输入职工类有误" << endl;
                    k -- ;
                    continue;
                    break;
            }
            newSpace[this -> m_EmpNum + i] = worker;
        } 
        //释放掉指针原来指向的内存
        delete[] this -> m_EmpArray;
        //修改指向为刚刚创建的新内存
        this -> m_EmpArray = newSpace;
        //修改职工人数大小
        this -> m_EmpNum = newSize;

        cout << "成功添加 " << k << " 名新职工!" << endl;
        //保存内容到文件
        this -> save();
        //如果不修改这个值,在文件为空的情况下去添加职工后,进行读取的时候
        //不能读取到内容,因为显示函数会首先判断文件是否为空,为空直接退出函数
        this -> m_FileIsEmpty = false;

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

再学习对文件进行操作,把握住其他部分,职工管理系统就算完成了

void WorkerManager :: save()
{
    ofstream ofs;
    ofs.open(FILENAME,ios :: out);
    if(!ofs.is_open())
    {
        cout << "打开失败" << endl;

    }
    
    for(int i = 0 ; i < this -> m_EmpNum ; ++ i)
    {
    	//存储时用空格分隔开
        ofs << this -> m_EmpArray[i] -> Mid << " "
            << this -> m_EmpArray[i] -> Name << " "
            << this -> m_EmpArray[i] -> Did << endl;
    }
    ofs.close();
}

我就不贴出自己写的纯c的c++职工管理系统了,太拉垮了

完整代码链接

职工管理系统

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值