通讯录管理系统课程设计c++

通讯录管理系统课程设计c++

职工信息可保存在同文件夹下的txt文件中


1.退出管理系统
2.增加职工信息
3.显示职工信息
4.删除离职职工
5.修改职工信息
6.查找职工信息
7.按照编号排序
8.清空所有文件
该程序共五个头文件和五个cpp文件
//
该系统可把职工的信息放在同文件夹下的txt文档中。在程序中的职工信息文件中的信息会同步。

如图显示

代码如下
其中有的注释是在程序在完成一半的时候测试代码。
1.主函数

在这里插入代码片
//职工管理系统cpp   主函数在这里
#include<iostream>
using namespace std;
#include"WorkerManager.h"
#include"worker.h"
#include"employee.h"
#include"boss.h"
#include"manager.h"
int main()
{
    
    
	测试代码
	//worker *w = NULL;
	//w = new employee(1,"张三",1);
	//w->showInfo();
	//delete w;

	//w = new manager(2, "李四", 2);
	//w->showInfo();
	//delete w;

	//w = new boss(3, "王五", 3);
	//w->showInfo();
	//delete w;
	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:    //删除职工
			//测试代码
		/*{
			int ret = wm.isExist(1);
			if (ret != -1)
			{
				cout << "职工存在" << endl;
			}
			else
			{
				cout << "职工不存在" << endl;
			}
			break;
		}*/wm.del_emp();
			break;
		case 4:    //修改职工
			wm.Mod_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");
	return 0;
}
  1. WorkerManager.h 头文件
    主要完成功能函数头文件在这里
#pragma once//防止头文件重复包含利用
#include <iostream>
using namespace std;
#include"worker.h"
#include "boss.h"
#include"employee.h"
#include"manager.h"

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


class WorkerManager
{
    
    
public:
	WorkerManager();
	//菜单展示
	void show_menu();
	void  exitsystem();
	  //记录职工人数

	int m_EmpNum;

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

   //添加职工函数
	void add_Emp();

	//保存文件
	void save();

	//判断文件是否为空
	bool m_FileIsEmpty;

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

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

	//显示职工
	void show_emp();

	//删除职工按照编号
	void del_emp();

	//判断职工是否存在
	int isExist(int id);

	//修改职工
	void Mod_Emp();

	//查找职工
	void Find_Emp();

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

	//清空文件
	void clear_File();

	~WorkerManager();
};
  1. WorkerManager.cpp 源文件
    函数实现在这里
#include"WorkerManager.h"
//using namespace std;
WorkerManager::WorkerManager()
{
    
    
    //1、文件不存在
    ifstream ifs;
    ifs.open(FILENAME, ios::in);

    if (!ifs.is_open())
    {
    
    
        //cout << "文件不存在" << endl;
        // 
        //初始化数据
        m_EmpNum = 0;//人数为零
        m_EmpArray = NULL;//指针为空
        m_FileIsEmpty = true;//初始化文件是否为空
        ifs.close();
        return;
    }

    //2、文件存在 数据为空
    char ch;
    ifs >> ch;
    if (ifs.eof())
    {
    
    
        //文件为空
        //cout << "文件为空" << endl;
        // 
        //初始化数据
        m_EmpNum = 0;//人数为零
        m_EmpArray = NULL;//指针为空
        m_FileIsEmpty = true;//初始化文件是否为空
        ifs.close();
        return;
    }

    //3、文件存在,并且记录数据
    int num = get_Empnum();
    //cout << "职工人数为: " << num << endl;
    m_EmpNum = num;

    m_EmpArray = new worker * [m_EmpNum];//开辟空间

    init_emp();//将文件中的数据存到数组中

    //测试代码
    /*for (int i = 0; i < m_EmpNum; i++)
    {
        cout << "职工编号:" << m_EmpArray[i]->m_ID
            << "姓名:" << m_EmpArray[i]->m_Name
            << "部门编号:" << m_EmpArray[i]->getDeptname() << endl;
    }*/
}
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;
}

void  WorkerManager::exitsystem()
{
    
    
    cout << "欢迎再次使用" << endl;
    system("pause");
    exit(0);   //退出程序
}
void WorkerManager::add_Emp()   //添加职工
{
    
    
    cout << "请输入添加职工的数量" << endl;
    int addnum=0;   //保存用户输入的数量
    cin >> addnum;
    if (addnum > 0)
    {
    
    
        //添加代码
        //计算添加新的空间大小
        int newsize = m_EmpNum + addnum;//新空间的大小=原来记录人数+新增人数
        //开辟新空间
        worker ** newSpace=new worker *[newsize];
        //将原来空间下的数据拷贝在新空间下
        if (m_EmpArray != NULL)
        {
    
    
            for (int i = 0; i < m_EmpNum; i++)
            {
    
    
                newSpace[i] = m_EmpArray[i];
            }
        }
        //批量添加新数据

        for (int i = 0; i < addnum; i++)
        {
    
    
            int id;//职工编号
            string name; //职工姓名
            int dselsct;  //部门编号
            cout << "请输入第" << i + 1 << "个新职工的编号" << endl;
            cin >> id;

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

            cout << "请选择该职工的岗位" << endl;
            cout << "1.普通职工" << endl;
            cout << "2.经理" << endl;
            cout << "3.老板" << endl;
            cin >> dselsct;

            worker* worker = NULL;
            switch (dselsct)
            {
    
    
            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[m_EmpNum + i] = worker;
        }
        //释放原有的空间
        delete[]m_EmpArray;

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

        //更新新的职工人数
        m_EmpNum = newsize;

        //更新职工不为空的标志
        m_FileIsEmpty = false;

        //提示添加成功
        cout << "成功添加" <<addnum<<"名职工" << endl;

        //成功添加后 保存到文件中
        save();
    }
    else
    {
    
    
        cout << "输入数据有误" << endl;
    }

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


//保存文件
void WorkerManager::save()
{
    
    
    ofstream ofs;
    ofs.open(FILENAME, ios::out);//用输出的方式打开文件  --写文件

    //将每个人的数据写入文件中
    for (int i = 0; i < m_EmpNum; i++)
    {
    
    
        ofs << m_EmpArray[i]->m_ID << " "
            << m_EmpArray[i]->m_Name << " "
            << m_EmpArray[i]->m_DeptID << " " << endl;
    }
    //关闭文件
    ofs.close();
}

//统计文件人数
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::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 
        {
    
    
            worker = new boss(id, name, did);
        }
        m_EmpArray[index] = worker;
        index++;
    }
    //关闭文件
    ifs.close();
}

//显示职工
void WorkerManager::show_emp()
{
    
    
    //判断文件是否为空
    if (m_FileIsEmpty)
    {
    
    
        cout << "文件存在或记录为空!" << endl;
    }
    else
    {
    
    
        for (int i = 0; i < m_EmpNum; i++)
        {
    
    
            //利用多态调用程序接口
            m_EmpArray[i]->showInfo();
        }
    }
    //按任意键清屏
    system("pause");
    system("cls");
}

//删除职工
void WorkerManager::del_emp()
{
    
    
    if (m_FileIsEmpty)
    {
    
    
        cout << "文件不存在或记录为空" << endl;
    }
    else
    {
    
    
        //按照职工编号删除
        cout << "请输入想要删除职工的编号" << endl;
        int id = 0;
        cin >> id;
        
        int index=isExist(id);

        if (index != -1)//说明职工存在并且要删除index位置上的职工
        {
    
    
            //数据前移
            for (int i = index; i < m_EmpNum-1; i++)
            {
    
    
                m_EmpArray[i] = m_EmpArray[i + 1];
            }
            m_EmpNum--;//更新数组中记录人员的个数

            save();//数据同步到文件中

            cout << "删除成功" << endl;
        }
        else
        {
    
    
            cout << "删除失败,未找到该职工" << endl;
        }
    }
    //按任意键清屏
    system("pause");
    system("cls");
}

//判断职工是否存在
int WorkerManager::isExist(int id)
{
    
    
    int index = -1;

    for (int i = 0; i < m_EmpNum; i++)
    {
    
    
        if (m_EmpArray[i]->m_ID == id)
        {
    
    
            //找到职工
            index = i;

            break;
        }
    }
    return index;
}

//修改职工
void WorkerManager::Mod_Emp()
{
    
    
    if (m_FileIsEmpty)
    {
    
    
        cout << "文件不存在或记录为空" << endl;
    }
    else
    {
    
    
        cout << "请输入修改职工的编号" << endl;
        int id=0;
        cin >> id;

        int ret=isExist(id);
        if (ret != -1)
        {
    
    
            //查找到编号的职工
            delete m_EmpArray[ret];

            int newid = 0;
            string newName;
            int newdid = 0;

            cout << "查到:" << id << "号职工,请输入新职工" << endl;
            cin >> newid;

            cout << "请输入新的姓名:" << endl;
            cin >> newName;

            cout << "请输入新的岗位:" << endl;
            cout << "1、普通职工" << endl;
            cout << "2、经理" << endl;
            cout << "3、老板" << endl;
            cin >> newdid;

            worker* work = NULL;
            switch (newdid)
            {
    
    
            case 1:
                work = new employee(newid, newName, newdid);
                break;
            case 2:
                work = new manager(newid, newName, newdid);
                break;
            case 3:
                work = new boss(newid, newName, newdid);
                break;
            default:
                break;
            }

            //更新数据到数组中
            m_EmpArray[ret] = work;
            cout << "修改成功" << endl;

            //保存到文件中
            save();
        }
        else
        {
    
    
            cout << "修改失败,查无此人!" << endl;
        }

    }
    //按任意键清屏
    system("pause");
    system("cls");
}

//查找职工
void WorkerManager::Find_Emp()
{
    
    
    if (m_FileIsEmpty)
    {
    
    
        cout << "文件不存在或文件为空!" << endl;
    }
    else
    {
    
    
        cout << "1、按照姓名查找" << endl;
        cout << "2、按照姓名查找" << endl;

        int select = 0;
        cin >> select;

        if (select == 1)    //按职工编号查找
        {
    
    
            int id = 0;
            cout << "请输入查找的职工编号:" << endl;
            cin >> id;

            int ret = isExist(id);
            if (ret != -1)
            {
    
    
                cout << "查找成功!该职工的信息如下:" << endl;
                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;

                    m_EmpArray[i]->showInfo();
                }
            }
            if (flag == false)
            {
    
    
                //查无此人
                cout << "查找失败,查无此人!" << endl;
            }
        }
        else
        {
    
    
            cout << "输入选项有误!" << endl;
        }
    }
    //按任意键清屏
    system("pause");
    system("cls");
}

//按照职工编号排序
void WorkerManager::sort_Emp()
{
    
    
    if (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;
        save();//排序后结果保存在文件中

        show_emp();//展示所有的职工    
    }
}

//清空文件
void WorkerManager::clear_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 (m_EmpArray != NULL)
        {
    
    
            //删除堆区的每个职工对象
            for (int i = 0; i < m_EmpNum; i++)
            {
    
    
                delete m_EmpArray[i];
                m_EmpArray[i] = NULL;
            }

            // 删除堆区数组的指针
            delete m_EmpArray;
            m_EmpArray = NULL;
            m_EmpNum = 0;
            m_FileIsEmpty = true;

        }
        cout << "清空成功!" << endl;

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

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

4 . worker.h 此基类为虚基类所以不需要函数实现部分的cpp文件部分

#pragma once
#include<iostream>
#include<string>
using namespace std;

//职工抽象类
class worker {
    
    
public:
	virtual void showInfo() = 0;   //显示个人信息
	virtual string getDeptname() = 0;   //显示岗位信息
	int m_ID;//职工编号
	string m_Name;  //职工姓名
	int m_DeptID;//  岗位职工编号

};

  1. employee.h 普通员工的头文件
//普通员工文件
#pragma once
#include<iostream>
using namespace std;
#include"worker.h"
class employee :public worker
{
    
    
public:
	employee(int id, string name, int did);//构造函数
	 void showInfo();   //显示个人信息
     string getDeptname();    //显示岗位信息
};
  1. employee.cpp 普通员工的源文件
#include"employee.h"
employee::employee(int id,string name,int did)//构造函数
{
    
    
	m_ID = id;
	m_Name = name;
	m_DeptID = did;
}
void employee::showInfo()   //显示个人信息
{
    
    
	cout << "职工编号: " << m_ID
		<< "\t职工的姓名:" << m_Name
		<< "\t岗位:" << getDeptname()
		<< "\t岗位职责 :" << "完成经理交给的任务"<<endl;
}
string employee::getDeptname()    //显示岗位信息
{
    
    
	return string("员工");
 }
  1. manager.h经理的头文件
#pragma once
#include<iostream>
using namespace std;
#include"worker.h"
//经理类
class manager:public worker {
    
    
	
public:
	 manager(int id, string name, int did);
	 void showInfo() ;   //显示个人信息
	 string getDeptname() ;   //显示岗位信息

};
  1. manager.cpp经理的源文件
#include"manager.h"
manager::manager(int id, string name, int did)
{
    
    
	m_ID = id;
	m_Name = name;
	m_DeptID = did;
}
void manager::showInfo()   //显示个人信息
{
    
    
	cout << "职工编号: " << m_ID
		<< "\t职工的姓名:" << m_Name
		<< "\t岗位:" << getDeptname()
		<< "\t岗位职责 :" << "完成老板交给的任务,并下发任务给员工" << endl;
}
string manager::getDeptname()   //显示岗位信息
{
    
    
	return string("经理");
}
  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);
	void showInfo();   //显示个人信息
	string getDeptname();   //显示岗位信息

};

10.boss.cpp老板的源文件

#include"boss.h"
boss::boss(int id, string name, int did)
{
    
    
	m_ID = id;
	m_Name = name;
	m_DeptID = did;
}
void  boss::showInfo()   //显示个人信息
{
    
    
	cout << "职工编号: " << m_ID
		<< "\t职工的姓名:" << m_Name
		<< "\t岗位:" << getDeptname()
		<< "\t岗位职责 :" << "管理公司所有事务" << endl;
}
string  boss::getDeptname()   //显示岗位信息
{
    
    
	return string("老板");
}

vs2019的文件形式为这样

在这里插入图片描述
运行起来为这样
在这里插入图片描述
增加职工形式在同文件的txt文件下有相应的信息
在这里插入图片描述
在这里插入图片描述
显示信息
在这里插入图片描述
删除信息
在这里插入图片描述

再次查看2可看到1的信息没了并且同文件下的信息也改变
在这里插入图片描述
在这里插入图片描述
查找信息类似操作就行!!!

从其b站上按照视频奋战了一天一个一个敲的
点击进入
第一次写那么长的文章,我的第一篇文章是上学期大一上记得笔记太草率了!
文章中可能会有很多问题,希望和大家一起修改! 我是一个连入门都不算的新生,希望和大家一起进步!

猜你喜欢

转载自blog.csdn.net/qq_53336225/article/details/118330145