欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-06 20:36:12
...

职工管理系统

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

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

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

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

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

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

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

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

成果展示

    1. 添加新职工
      C++职工管理系统 VS C职工管理系统
  • 2.显示所有职工信息
    C++职工管理系统 VS C职工管理系统

  • 3.修改职工信息
    C++职工管理系统 VS C职工管理系统

  • 4.查找职工具体信息
    C++职工管理系统 VS C职工管理系统

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

代码展示

菜单类

该职工管理系统使用了四个类,
第一个类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++职工管理系统了,太拉垮了

完整代码链接

职工管理系统

相关标签: c++ 数据结构