通讯录管理系统课程设计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;
}
- 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();
};
- 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;// 岗位职工编号
};
- 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(); //显示岗位信息
};
- 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("员工");
}
- 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() ; //显示岗位信息
};
- 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("经理");
}
- 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站上按照视频奋战了一天一个一个敲的
点击进入
第一次写那么长的文章,我的第一篇文章是上学期大一上记得笔记太草率了!
文章中可能会有很多问题,希望和大家一起修改! 我是一个连入门都不算的新生,希望和大家一起进步!