文件存储,交互界面,数组存储。
部分功能未实现。
#include<iostream>
#include"workermanager.h"
#include"employee.h"
#include "worker.h"
#include "manager.h"
#include "boss.h"
#include <string>
using namespace std;
int main()
{
WorkerManager wm;
int choice;
while(1)//让程序一直运行
{
wm.showmanue();//显示菜单
cout << "请输入您的选择:" << endl;
cin >> choice;
cout << "您的选择是:" << choice << endl;
switch (choice)
{
case 0://退出
cout << endl<<"再见,欢迎下次使用!" << endl;
return 0;
system("pause");
break;
case 1://增加
wm.addemp();
break;
case 2://显示
wm.showworkerlist();
break;
case 3://删除
//查找->删除->调整数组->写入
wm.deleteworker();
break;
case 4://修改
//查找->修改->调整数组
break;
case 5://查找
wm.findworker();
break;
case 6://排序
//冒泡排序、快速排序等等
break;
case 7://清空
//将指针初始化为NULL,将职工数初始化为0
break;
default:
cout << "输入错误,请重新输入。" << endl;
break;
}
}
return 0;
}
#include "workermanager.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"
#include <fstream>
void WorkerManager::addemp()//添加职工
{
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] = m_emparray[i];
}
//添加新数据
worker * newworker=NULL;//newworker用于临时存放新员工的信息
for (int i = this->m_empnum ; i < newsize; i++)//将原来的数据放入新申请堆空间
{
//原来的数据用完了,需要输入新数据
int select = 0;
cout << "请输入员工岗位(1/2/3):" << endl;
cin >> select;
switch (select)
{
case 1:
newworker = new employee(1,"o",1);
break;
case 2:
newworker = new manager(1, "o", 1);
break;
case 3:
newworker = new boss(1, "o", 1);
break;
default:
break;
}
cout << "请输入待添加员工的信息:" << endl;
cout << "请输入员工姓名:" << endl;
cin >> newworker->name;
cout << "请输入员工编号:" << endl;
cin >> newworker->m_id;
newworker->m_dep=select;
newspace[i] = newworker;
}
//释放原有空间
delete [] this->m_emparray;
//更改新空间指向
this->m_emparray=newspace;
//更改新空间职工人数
this->m_empnum=newsize;
cout << "成功添加了" << addnum << "名员工" << endl;
this->savefile();
}
else
cout << "输入有误:" << endl;
}
int WorkerManager::get_empnum()//获取文件中职工个数
{
ifstream ifs;
ifs.open(FILENAME, ios::in);//用读取方式打开文件
//临时存放员工信息
int _id;
string _name;
int _depid;
int num = 0;
while (ifs >> _name && ifs >> _id && ifs >> _depid)
{
num++;//人数
}
ifs.close();
return num;
}
void WorkerManager::initworker()//初始化成员
{
ifstream ifs;
ifs.open(FILENAME, ios::in);//用读取方式打开文件
int _id;
string _name;
int _depid;
int num = this->get_empnum();
int index = 0;//索引变量
while (ifs >> _name && ifs >> _id && ifs >> _depid)
{
worker* workerpt = NULL;
switch (_depid)
{
case 1://创建employee对象
workerpt = new employee(_id, _name,_depid);
break;
case 2://创建manager对象
workerpt = new manager(_id, _name, _depid);
break;
case 3://创建boss对象
workerpt = new boss(_id, _name, _depid);
break;
}
this->m_emparray[index] = workerpt;
index++;
}
ifs.close();
}
//读取文件
//在构造函数中初始化员工数据指针和员工个数
WorkerManager::WorkerManager()
{
//文件不存在的时候
ifstream ifs;
ifs.open(FILENAME, ios::in);//用读取方式打开文件
if (!ifs.is_open())//文件打开不成功
{
cout << "文件不存在!"<<endl;
m_empnum = 0;//记录职工人数初始化为0
m_emparray = NULL;//职工数组指针初始化为NULL
this->isfileempty = true;//职工数为空
ifs.close();
return;
}
else
{
char firstchar;
ifs >> firstchar;
if (ifs.eof())//判断文件是否为空
{
cout << "文件为空!" << endl;
m_empnum = 0;//记录职工人数初始化为0
m_emparray = NULL;//职工数组指针初始化为NULL
this->isfileempty = true;//职工数为空
ifs.close();
return;
}
else//文件存在且不为空
{
int num = this->get_empnum();
cout << "职工人数为:" << num<<endl;
this->m_empnum = num;//初始化成员属性
//调用初始化函数对其余属性初始化
this->m_emparray = new worker*[this->m_empnum];
initworker();
return;//*********必须要有,否则会报错!!!
}
}
//初始化
m_empnum=0;//记录职工人数初始化为0
m_emparray=NULL;//职工数组指针初始化为NULL
}
WorkerManager::~WorkerManager()
{
if (this->m_emparray != NULL)
{
delete[] this->m_emparray;
this->m_emparray = NULL;
}
}
void WorkerManager::showmanue()
{
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;
}
void WorkerManager::savefile()//保存文件
{
//创建文件流对象
ofstream ofs;
//打开文件
ofs.open("workerlist.txt", ios::out);
//写入数据
for (int i = 0; i < this->m_empnum; i++)
{
ofs << this->m_emparray[i]->name <<" "
<< this->m_emparray[i]->m_id << " "
<< this->m_emparray[i]->m_dep << " ";
}
//关闭文件
ofs.close();
}
void WorkerManager::showworkerlist()//显示职工信息
{
//文件不存在的时候
ifstream ifs;
ifs.open(FILENAME, ios::in);//用读取方式打开文件
if (!ifs.is_open())//文件打开不成功
{
cout << "文件不存在!" << endl;
ifs.close();
return;
}
else
{
char firstchar;
ifs >> firstchar;
if (ifs.eof())//判断文件是否为空
{
cout << "文件为空!" << endl;
ifs.close();
return;
}
else//文件存在且不为空
{
cout << "公司职工人数为:" << this->m_empnum << endl;
cout << "公司职工信息如下:" << endl;
for (int i = 0; i < this->m_empnum; i++)
{
cout << "职工姓名 " << this->m_emparray[i]->name <<"\t"
<< "职工编号:" << this->m_emparray[i]->m_id << "\t"
<< "职工岗位:";
switch (this->m_emparray[i]->m_dep)
{
case 1:
cout << "普通员工" <<endl ;
break;
case 2:
cout << "经理" << endl;
break;
case 3:
cout << "老板" << endl;
break;
default:
break;
}
}
ifs.close();
return;
}
}
}
int WorkerManager::getworkerindex()//获取待删除职工索引
{
int _id;
int index = 0;
cout << "请输入待删除/查找的员工编号(ID):" << endl;
cin >> _id;
//文件不存在的时候
ifstream ifs;
ifs.open(FILENAME, ios::in);//用读取方式打开文件
if (!ifs.is_open())//文件打开不成功
{
cout << "文件不存在!" << endl;
ifs.close();
return -1;
}
else
{
char firstchar;
ifs >> firstchar;
if (ifs.eof())//判断文件是否为空
{
cout << "文件为空!" << endl;
ifs.close();
return -1;
}
else//文件存在且不为空
{
while (index!= this->m_empnum&&this->m_emparray[index]->m_id != _id)
{
index++;
}
ifs.close();
if (index != this->m_empnum)
{
return index;
}
else return -1;
}
}
}
void WorkerManager::deleteworker()//删除职工
{
int del_index= this->getworkerindex();//待删除位置
if (del_index == -1)
{
cout << "删除失败!" << endl;
}
else
{
worker** newspaceptpt = new worker*[this->m_empnum - 1];
//将删除后的数据放入新空间
for (int i = 0; i < del_index; i++)
{
newspaceptpt[i] = this->m_emparray[i];
}
for (int i = del_index + 1; i < this->m_empnum; i++)
{
newspaceptpt[i - 1] = this->m_emparray[i];
}
delete[]this->m_emparray;
this->m_emparray = newspaceptpt;
this->m_empnum--;
if (this->m_empnum == 0)
{
this->isfileempty = 0;
}
else this->isfileempty = 1;
//更新文件
this->savefile();
cout << "已删除编号(ID)为" << del_index << "的员工!" << endl;
cout << "删除成功!" << endl;
}
}
void WorkerManager::findworker()//查找员工信息
{
int index_worker = this->getworkerindex();
if (index_worker == -1)
{
cout << "查找失败" << endl;
}
else
{
cout << "员工编号为" << this->m_emparray[index_worker]->m_id << "的员工信息如下:" << endl;
cout << "姓名:" << this->m_emparray[index_worker]->name << endl;
switch (this->m_emparray[index_worker]->m_dep)
{
case 1:
cout << "普通员工" << endl;
break;
case 2:
cout << "经理" << endl;
break;
case 3:
cout << "老板" << endl;
break;
default:
cout << "无此人" << endl;
break;
}
}
}
#pragma once
#ifndef workmanage_h
#define workmanage_h
#include <iostream>
#include <fstream>
#include"worker.h"
using namespace std;
#define FILENAME "workerlist.txt"//用于存储职工信息的文件名
class WorkerManager {
public:
WorkerManager();
~WorkerManager();
void showmanue();//菜单展示
int m_empnum;//记录职工人数
worker ** m_emparray;//职工数组指针
void addemp();//添加职工
void savefile();//保存文件
bool isfileempty;//文件是否为空标志
int get_empnum();//获取文件中职工个数
void initworker();//初始化成员
void showworkerlist();//显示职工信息
void deleteworker();//删除职工
int getworkerindex();//获取待删除职工索引
void findworker();//查找员工信息
};
#endif // !workmanage_h
#pragma once
#include "worker.h"
#include <iostream>
#include <string>
using namespace std;
class boss :public worker {
public:
boss(int id, string nam, int dep);
virtual void showInfo();//显示个人信息接口
virtual string getdepname();//显示部门接口
};
#include "boss.h"
#include <iostream>
#include <string>
using namespace std;
boss::boss(int id, string nam, int dep)
{
this->m_dep = dep;
this->m_id = id;
this->name = nam;
}
void boss::showInfo()//显示个人信息接口
{
cout << "显示职工个人信息:" << endl;
cout << "职工姓名为:" << name << endl;
cout << "职工编号为:" << m_id << endl;
cout << "职工岗位为:" << getdepname() << endl;
cout << "职工职责为:分配任务" << endl;
}
string boss::getdepname()//显示部门接口
{
return string("老板");
}
#pragma once
#include "worker.h"
#include<iostream>
#include <string>
using namespace std;
class employee : public worker {
public:////注意:这个public千万不能省略,不然会出错。因为class中默认权限为private
/*接口*/
virtual void showInfo() ;//显示个人信息接口
virtual string getdepname();//显示部门接口
employee(int id, string nam, int dep);
};
#include "employee.h"
///*数据*/
//int m_id;
//string name;
//int m_dep;
employee::employee(int id,string nam,int dep) {//初始化员工对象
this->m_id=id;
this->name=nam;
this->m_dep=dep;
}
void employee::showInfo()//显示个人信息接口
{
cout << "显示职工个人信息:" << endl;
cout << "职工姓名为:" << name << endl;
cout << "职工编号为:" <<m_id<< endl;
cout << "职工岗位为:" << getdepname() << endl;
cout << "职工职责为:完成经理交代的任务。" << endl;
}
string employee::getdepname()//显示部门接口
{
return string("员工");
}
#pragma once
#include "worker.h"
#include <iostream>
#include <string>
using namespace std;
class manager :public worker {
public:
manager(int id, string nam, int dep);
virtual void showInfo();//显示个人信息接口
virtual string getdepname();//显示部门接口
};
#include "manager.h"
#include <iostream>
#include <string>
using namespace std;
manager::manager(int id, string nam, int dep)
{
this->m_dep = dep;
this->m_id = id;
this->name = nam;
}
void manager::showInfo()//显示个人信息接口
{
cout << "显示职工个人信息:" << endl;
cout << "职工姓名为:" << name << endl;
cout << "职工编号为:" << m_id << endl;
cout << "职工岗位为:" << getdepname() << endl;
cout << "职工职责为:完成boss交代的任务。" << endl;
}
string manager::getdepname()//显示部门接口
{
return string("经理");
}
#pragma once
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class worker {
public:
/*数据*/
int m_id;
string name;
int m_dep;
/*接口*/
virtual void showInfo() = 0;//显示个人信息接口
virtual string getdepname() = 0;//显示部门接口
};