总结遇到最多的问题,这个坑真大
<Ems.h>
#define once
#include <iostream>
#include <fstream>
#include <string>
#include "worker.h"
using namespace std;
#define SIZE_MAX 3
class LinkClass
{
public:
Worker *wp;
LinkClass *next;
};
class WorkerManager
{
public:
WorkerManager(LinkClass *L);
~WorkerManager();
int M_no;
int M_duty;
string M_name;
LinkClass *LinkList;
int M_size;
void DeleteLink(LinkClass *L);
//显示菜单
void ShowMenu();
//添加
bool Ems_Add(LinkClass *L);
//删除
bool Ems_Delete(LinkClass *L);
//修改
bool Ems_Edit(LinkClass *L);
//查找
bool Ems_Find(LinkClass *L);
//本地存储
bool Ems_Write(const LinkClass *L);
//本地读取
bool Ems_Read(LinkClass *L, WorkerManager *pw);
//打印Link
void Ems_Show(const LinkClass *L);
//
void Ems_DeleteAll(LinkClass *L);
};
void InfoLink(LinkClass *p, WorkerManager *pw);
<worker.h>
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
using namespace std;
//职工类
class Worker
{
public:
//显示个人信息
virtual void showInfo() = 0;
//获取岗位
virtual string getDeptName() = 0;
int M_Id;//编号
int M_Duty;//部门编号
string M_Name;//姓名
};
//老板
class Boss : public Worker
{
public:
//构造
Boss(int id,int duty,string name);
//显示个人信息
void showInfo();
//获取岗位
string getDeptName();
};
//经理
class Manager : public Worker
{
public:
//构造
Manager(int id, int duty, string name);
//显示个人信息
void showInfo();
//获取岗位
string getDeptName();
};
//员工
class FlWorker : public Worker
{
public:
//构造
FlWorker(int id, int duty, string name);
//显示个人信息
void showInfo();
//获取岗位
string getDeptName();
};
<Ems.cpp>
#define _CRT_SECURE_NO_WARNINGS 1
#include "Ems.h"
void InfoLink(LinkClass *p, WorkerManager *pw)
{
p->wp = NULL;
p->next = NULL;
pw->Ems_Read(p, pw);
}
void WorkerManager::DeleteLink(LinkClass *L)
{
LinkClass *p = L->next;
while (p)
{
LinkClass *cur = p->next;
delete p->wp;
delete p;
p = cur;
this->M_size--;
}
}
bool WorkerManager::Ems_Write(const LinkClass *L)
{
bool flag = true;
LinkClass *p = L->next;
ofstream ofs;
ofs.open("Ems.dat", ios::out | ios::binary | ios::trunc);
if (!(ofs.is_open()))
return false;
while (p)
{
ofs.write((char*)p->wp, sizeof(Worker));
p = p->next;
flag = false;
}
if (flag)
ofs << "";
ofs.close();
return true;
}
bool WorkerManager::Ems_Read(LinkClass *L, WorkerManager *pw)
{
LinkClass *p = L;
ifstream ifs;
char c;
ifs.open("Ems.dat", ios::in | ios::binary);
if (!ifs.is_open())
return false;
if (!(ifs >> c))
return false;
ifs.seekg(0);
L->wp = new Boss(1, 1, "1");
while (ifs.read((char*)L->wp, sizeof(Worker)))
{
LinkClass *s = new LinkClass;
int id = L->wp->M_Id;
int duty = L->wp->M_Duty;
string name = L->wp->M_Name;
switch (duty)
{
case 1:
s->wp = new Boss(id, duty, name);
break;
case 2:
s->wp = new Manager(id, duty, name);
break;
case 3:
s->wp = new FlWorker(id, duty, name);
break;
default:
break;
}
s->next = NULL;
p->next = s;
p = p->next;
pw->M_size++;
}
ifs.close();
return true;
}
void WorkerManager::ShowMenu()
{
cout << "************** 职 工 管 理 系 统 ***************" << endl;
cout << "***** W e l c o m e G u M u 2 0 2 3 *****" << endl;
cout << "**************** 0 退出管理程序 **************" << endl;
cout << "**************** 1 添加职工信息 **************" << endl;
cout << "**************** 2 删除离职职工 **************" << endl;
cout << "**************** 3 修改职工信息 **************" << endl;
cout << "**************** 4 查找职工信息 **************" << endl;
cout << "**************** 5 显示职工信息 **************" << endl;
cout << "**************** 6 删除所有信息 **************" << endl;
}
WorkerManager::WorkerManager(LinkClass *L)
{
this->M_size = 0;
this->LinkList = L;
}
WorkerManager::~WorkerManager()
{
this->DeleteLink(LinkList);
cout << "Link已释放" << endl;
}
//增
bool WorkerManager::Ems_Add(LinkClass *L)
{
int id = 0;
int duty = 0;
string name;
while (true)
{
LinkClass *p = L;
LinkClass *cur = p->next;
bool flag = true;
cout << "\t(提示:输入 -1 退出到菜单)" << endl;
cout << "[当前状态] <添加> 请输入工号:>";
cin >> id;
if (-1 == id)
break;
while (cur)
{
if (cur->wp->M_Id == id)
{
cout << "\t工号已被使用!" << endl;
return false;
}
p = cur;
cur = cur->next;
}
LinkClass *s = NULL;
s = new LinkClass;
cout << "\t1 BOSS" << endl;
cout << "\t2 经理" << endl;
cout << "\t3 员工" << endl;
do
{
flag = true;
cout << "[当前状态] <添加> 请选择职位:>";
cin >> duty;
cin.clear(); cin.ignore();
switch (duty)
{
case 1:
cout << "[当前状态] <添加> 请输入姓名:>";
cin >> name;
s->wp = new Boss(id, duty, name);
break;
case 2:
cout << "[当前状态] <添加> 请输入姓名:>";
cin >> name;
s->wp = new Manager(id, duty, name);
break;
case 3:
cout << "[当前状态] <添加> 请输入姓名:>";
cin >> name;
s->wp = new FlWorker(id, duty, name);
break;
default:
cout << "[当前状态] <添加> 职位选项无效,添加失败!" << endl;
flag = false;
break;
}
} while (!flag);
if (!s->wp)
return false;
s->next = NULL;
p->next = s;
this->M_size++;
p = p->next;
cout << "[当前状态] <添加> 添加成功,继续添加!" << endl;
}
return true;
}
//删
bool WorkerManager::Ems_Delete(LinkClass *L)
{
LinkClass *p = L;
int id = 0;
bool flag = false;
cout << "[当前状态] <删除> 请输入工号:>";
cin >> id;
while (p->next)
{
if (p->next->wp->M_Id == id)
{
LinkClass *tmp = p->next;
if (!p->next->next)
p->next = NULL;
else
p->next = p->next->next;
delete tmp;
this->M_size--;
cout << "[当前状态] <删除> 删除成功!" << endl;
flag = true;
}
p = p->next;
}
if (!flag)
{
cout << "[当前状态] <删除> 删除失败,工号不存在!" << endl;
return false;
}
return true;
}
//改
bool WorkerManager::Ems_Edit(LinkClass *L)
{
LinkClass *p = L;
int id = 0;
bool flag = false;
cout << "(输入 -1 跳过修改项)" << endl;
cout << "[当前状态] <修改> 输入要修改人的工号:>";
cin >> id;
while (p)
{
if (p->wp->M_Id == id)
{
int duty = 0;
string name;
LinkClass *tmp = L;
bool repaet = false;
cout << "[当前状态] <修改> 请输入修改后工号:>";
cin >> id;
if (!(-1 == id))
{
while (tmp)
{
if (tmp->wp->M_Id == id)
{
cout << "\t工号已被使用!";
repaet = true;
break;
}
tmp = tmp->next;
}
if (repaet)
continue;
p->wp->M_Id = id;
}
cout << "\t1 BOSS" << endl;
cout << "\t2 经理" << endl;
cout << "\t3 员工" << endl;
do
{
cout << "[当前状态] <修改> 请选择修改后职位:>";
cin >> duty;
cin.clear(); cin.ignore();
if (1 == duty || 2 == duty || 3 == duty)
{
p->wp->M_Duty = duty;
cout << "[当前状态] <修改> 请输入修改后姓名:>";
cin >> name;
flag = true;
}
else if (-1 == duty)
{
cout << "[当前状态] <修改> 请输入修改后姓名:>";
cin >> name;
flag = true;
}
else
cout << "[当前状态] <修改> 职位选项无效,修改失败!";
} while (!flag);
flag = true;
break;
}
p = p->next;
}
if (!flag)
{
cout << "[当前状态] <修改> 工号不存在!" << endl;
return false;
}
return true;
}
//查
bool WorkerManager::Ems_Find(LinkClass *L)
{
LinkClass *p = L;
int choice = 0;
int id = 0;
string name;
bool flag = false;
cout << "[当前状态] <查找> 请选择:" << endl;
cout << "\t1 按工号查找" << endl;
cout << "\t2 按姓名查找" << endl;
cin >> choice;
while (true)
{
if (1 == choice)
{
cout << "[当前状态] <查找> 请输入工号:>";
cin >> id;
while (p)
{
if (p->wp->M_Id == id)
{
if (p->wp->M_Duty > 0)
p->wp->showInfo();
flag = true;
}
p = p->next;
}
break;
}
else if (2 == choice)
{
cout << "[当前状态] <查找> 请输入姓名:>";
cin >> name;
while (p)
{
if (p->wp->M_Name == name)
{
if (p->wp->M_Duty > 0)
p->wp->showInfo();
flag = true;
}
p = p->next;
}
break;
}
else
{
cout << "[当前状态] <查找> 输入选项无效!" << endl;
}
}
if (!flag)
cout << "[当前状态] <查找> 查找结果不存在!" << endl;
return false;
}
void WorkerManager::Ems_Show(const LinkClass *L)
{
if (!M_size)
cout << "table为空!" << endl;
else
{
LinkClass *p = L->next;
cout << "工号" << "\t姓名" << "\t职位" << "\t工作内容" << endl;
while (p)
{
p->wp->showInfo();
p = p->next;
}
}
}
void WorkerManager::Ems_DeleteAll(LinkClass *L)
{
LinkClass *p = L;
if (0 == M_size)
return;
string input;
cout << "[当前状态] <删除全部数据> 请输入' yes '确认(输入其他视为取消操作) :>";
cin >> input;
if (input == "yes")
{
this->DeleteLink(p);
cout << "全部data已删除!" << endl;
}
}
<worker.cpp>
#define _CRT_SECURE_NO_WARNINGS 1
#include "Ems.h"
Boss::Boss(int id,int duty,string name)
{
M_Id = id;
M_Duty = duty;
M_Name = name;
}
void Boss::showInfo()
{
cout << this->M_Id << "\t" << this->M_Name
<<"\t"<<this->getDeptName() << endl;
}
string Boss::getDeptName()
{
return string("老板\t管理公司所有事务");
}
Manager::Manager(int id, int duty, string name)
{
M_Id = id;
M_Duty = duty;
M_Name = name;
}
void Manager::showInfo()
{
cout << this->M_Id << "\t" << this->M_Name
<< "\t" << this->getDeptName() << endl;
}
string Manager::getDeptName()
{
return string("经理\t完成老板安排的任务,并分发任务给员工");
}
FlWorker::FlWorker(int id, int duty, string name)
{
M_Id = id;
M_Duty = duty;
M_Name = name;
}
void FlWorker::showInfo()
{
cout << this->M_Id << "\t" << this->M_Name
<< "\t" << this->getDeptName() << endl;
}
string FlWorker::getDeptName()
{
return string("员工\t完成经理安排的任务");
}
<test.cpp>
#define _CRT_SECURE_NO_WARNINGS 1
#include "Ems.h"
enum Ch
{
EMS_EXIT,//退出 0
EMS_ADD,//增 1
EMS_DELETE,//删 2
EMS_EDIT,//改3
EMS_FIND,//查 4
EMS_SHOW,//显示 5
EMS_DELETEALL//销毁表 6
};
void test()
{
LinkClass Lc;
WorkerManager w(&Lc);
int choice = 0;
//bool flag = true;
InfoLink(&Lc, &w);
while (true)
{
//if (!flag)
// break;
w.ShowMenu();
cout << "[当前状态] <菜单> 请选择:>";
cin >> choice;
cin.clear(); cin.ignore();
switch (choice)
{
case EMS_EXIT://退出
w.Ems_Write(&Lc);
cout << "程序结束" << endl;
//flag = false;
return;
break;
case EMS_ADD://增
w.Ems_Add(&Lc);
w.Ems_Write(&Lc);
system("pause");
system("cls");
break;
case EMS_DELETE://删
w.Ems_Delete(&Lc);
w.Ems_Write(&Lc);
system("pause");
system("cls");
break;
case EMS_EDIT://改
w.Ems_Edit(&Lc);
w.Ems_Write(&Lc);
system("pause");
system("cls");
break;
case EMS_FIND://查
w.Ems_Find(&Lc);
system("pause");
system("cls");
break;
case EMS_SHOW://显示
w.Ems_Show(&Lc);
system("pause");
system("cls");
break;
case EMS_DELETEALL://删除所有
w.Ems_DeleteAll(&Lc);
w.Ems_Write(&Lc);
system("pause");
system("cls");
break;
case -1:
system("cls");
break;
default:
break;
}
}
}
int main()
{
test();
system("pause");
return 0;
}