利用多态实现职工管理系统增删改查,与文件交互
主要功能在WorkerMange中
Worker.h
#pragma once
#include<iostream>
#include<string>
using namespace std;
class worker
{
public:
virtual ~worker() {};//析构
virtual string function() = 0;
int m_num;//编号
string m_job;//职位
string m_name;//姓名
};
staff.h
#pragma once
#include"Worker.h"
class staff:public worker
{
public:
staff(int num,string name);
string function();
};
manager.h
#pragma once
#include"Worker.h"
class manager:public worker
{
public:
manager(int num, string name);
string function();
};
boss.h
#pragma once
#include"Worker.h"
class boss:public worker
{
public:
boss(int num, string name);
string function();
};
WorkerManage.h
#pragma once
#include<iostream>
#include"Worker.h"
#include"boss.h"
#include"Staff.h"
#include"manager.h"
using namespace std;
class WorkerManage
{
public:
WorkerManage();//构造
void show();//主界面
void Exit();//退出
void add();//增加员工
bool if_Repeat(int x);//判断编号是否重复
bool save(worker** w,int size,int way);//存储至文件中其中way参数区分如何存储
bool look_file();//判断文件状态
int count_file();//统计记录数
void Read();//将文件中的数据读入all_w中
void display();//显示所有员工信息
void delete_Record();//删除相应编号下的记录
void find();//查找员工信息
int find_num(int num);//按照编号查找
void show_num();//显示按编号查找的信息
void show_name();//按照名字查找(考虑重名者)
void Modify();//修改员工信息
void sort();//排序
void sort1();//升序
void sort2();//降序
void swap(int a,int b);//交换
void if_clear();//清空文件
public:
worker** w;//存放新增人员的信息
worker** all_w;//存放文件中的所有记录
int num;//所增加的人数
int all_num;//文件中总记录数
~WorkerManage();//析构!
};
staff.cpp
#include"Staff.h"
staff::staff(int num, string name)
{
this->m_num = num;
this->m_job = "普通员工";
this->m_name = name;
}
string staff::function()
{
return "完成经理交给的任务";
}
manager.cpp
#include "manager.h"
manager::manager(int num, string name)
{
this->m_num = num;
this->m_name = name;
this->m_job = "经理";
}
string manager::function()
{
return "完成老板交给的任务,并下发任务给员工";
}
boss.cpp
#include"boss.h"
boss::boss(int num, string name)
{
this->m_name = name;
this->m_num = num;
this->m_job = "老板";
}
string boss::function()
{
return "管理公司所有事物";
}
WorkerManage.cpp
#include"WorkerManage.h"
#include<fstream>
#include<string>
#include<iomanip>
#define FILE "file.txt"
WorkerManage::WorkerManage()
{
this->num = 0;
this->all_num = 0;
this->w = NULL;
this->all_w = NULL;
}
void WorkerManage::show()
{
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;
}
void WorkerManage::Exit()
{
cout << "欢迎下次使用!" << endl;
exit(0);
}
void WorkerManage::add()
{
cout << "请输入您要添加的人数:";
bool sno_flag;//重复标记
worker* ww = NULL;//暂存单个人员信息
cin >> this->num;
if (this->num > 0)
{
this->w = new worker* [this->num];
for (int i = 0; i < this->num; ++i)
{
int sno;
sno_flag = true;
cout << "请输入第" << i+1 << "个新员工编号:";//输入编号
while (sno_flag)
{
cin >> sno;
if (cin.fail())//粗略判断输入的是否为数字
{
cout << "编号错误,请重新输入:";
cin.clear();//清除错误状态
cin.ignore();//忽略掉输入缓冲区的内容
}
else if(sno<=0)
cout << "编号为正,请重新输入:";
else if (!if_Repeat(sno))//与文件中编号重复
{
cout << "编号重复,请重新输入:";
}
else//与本次输入的编号重复
{
sno_flag = false;
for (int j = 0; j < i; ++j)
{
if (w[j]->m_num == sno)
{
sno_flag = true;
cout << "编号重复,请重新输入:";
break;
}
else sno_flag = false;
}
}
}
string new_name;
cout << "请输入第" << i+1 << "个新员工姓名:";
cin >> new_name;
int pos;
cout << "请选择新员工职位:" << endl;
cout << "1.普通员工" << endl;
cout << "2.经理" << endl;
cout << "3.老板" << endl;
bool pos_flag = true;
while (pos_flag)
{
pos_flag = false;
cin >> pos;
switch (pos)
{
case 1:
ww = new staff(sno, new_name);
break;
case 2:
ww = new manager(sno, new_name);
break;
case 3:
ww = new boss(sno, new_name);
break;
default:
cout << "无此选项,请重新选择职务:";
pos_flag = true;
break;
}
}
w[i] = ww;
}
if (save(w, num,1))//以追加方式存储至文件
cout << "成功存储" << num << "位员工信息!" << endl;
else
cout << "存储信息失败!" << endl;
for (int i = 0; i < num; ++i)//释放内存并归零
delete w[i];
delete[]w;
w = NULL;
num = 0;
}
else
{
cout << "数值错误,请重新操作!" << endl;
return;
}
}
bool WorkerManage::if_Repeat(int x)
{
ifstream ifs(FILE, ios::in);
int a;
string b;
string c;
if (!ifs.is_open())
{
ifs.close();
return true;
}
while (ifs >> a >> b >> c)
{
if (a == x)
{
ifs.close();
return false;
}
}
ifs.close();
return true;
}
bool WorkerManage::save(worker** w,int size,int way)
{
ofstream ofs;
if (way)
ofs.open(FILE, ios::app);//追加存储
else
ofs.open(FILE, ios::trunc);//全部覆盖
if (!ofs.is_open())
{
ofs.close();
cout << "文件打开失败!" << endl;
return false;
}
for (int i = 0; i < size; ++i)//打印
{
ofs << w[i]->m_num << '\t' << w[i]->m_name << '\t' << w[i]->m_job << endl;
}
ofs.close();
return true;
}
bool WorkerManage::look_file()
{
ifstream ifs(FILE, ios::in);
if (!ifs.is_open())//文件不存在
{
cout << "文件不存在!" << endl;
return false;
}
//文件存在但为空
char c;
ifs >> c;
if (ifs.eof())
{
cout << "文件为空!" << endl;
return false;
}
else return true;//文件存在且有记录
}
int WorkerManage::count_file()
{
int n = 0;
ifstream ifs(FILE, ios::in);
int sno;
string name;
string job;
while (ifs >> sno >> name >> job)
++n;
ifs.close();
return n;
}
void WorkerManage::Read()
{
if (all_w != NULL)//若开始有记录,则清除
{
for (int i = 0; i < all_num; ++i)
delete all_w[i];
delete[]all_w;
all_num = 0;
all_w = NULL;
}
all_num = count_file();//计算记录数
all_w = new worker * [all_num];
ifstream ifs(FILE, ios::in);
int i = 0;
int sno;
string name;
string job;
while (ifs >> sno >> name >> job && i < all_num)
{
worker* all_ww = NULL;
if (job == "普通员工")
all_ww = new staff(sno, name);
else if (job == "经理")
all_ww = new manager(sno, name);
else
all_ww = new boss(sno, name);
all_w[i] = all_ww;
++i;
}
ifs.close();
}
void WorkerManage::display()
{
if (!look_file())//没有信息则返回
return;
Read();//记录读入
for (int i = 0; i < all_num; ++i)//控制格式,左对齐
{
cout << left << setw(5) << all_w[i]->m_num;
cout << left << setw(10) << all_w[i]->m_name;
cout << left << setw(10) << all_w[i]->m_job;
cout<< all_w[i]->function() << endl;
}
}
void WorkerManage::delete_Record()
{
cout << "请输入所删除员工的编号:";
int sno;
cin >> sno;
int find = find_num(sno);
if (find == -1)
{
cout << "删除失败!" << endl;
return;
}
for (; find < all_num-1; ++find)
all_w[find] = all_w[find + 1];//挪位
--all_num;
if (save(all_w, all_num, 0))//重新录入文件
cout << "删除成功!" << endl;
else
cout << "操作失败!" << endl;
}
void WorkerManage::find()
{
cout << "1.按照编号查找 2.按照姓名查找 其他键退出" << endl;
cout << "请选择查找方式:";
int x(-1);
cin >> x;
if (x == 1)
show_num();
else if (x == 2)
show_name();
else return;
}
int WorkerManage::find_num(int num)
{
if (!look_file())
{
return -1;
}
Read();//刷新记录
for (int i = 0; i < all_num; ++i)
{
if (all_w[i]->m_num == num)
return i;
}
cout << "未找到此编号人员" << endl;
return -1;
}
void WorkerManage::show_num()
{
int sno;
cout << "请输入要查找人员的编号:";
cin >> sno;
int i = find_num(sno);
if (i!=-1)
{
cout << left << setw(5) << all_w[i]->m_num;
cout << left << setw(10) << all_w[i]->m_name;
cout << left << setw(10) << all_w[i]->m_job;
cout << all_w[i]->function() << endl;
}
}
void WorkerManage::show_name()
{
if (!look_file())
return;
Read();
string name;
cout << "请输入所查找员工的姓名:";
cin >> name;
bool find = false;//是否找到
for (int i = 0; i < all_num; ++i)
{
if (all_w[i]->m_name == name)
{
cout << left << setw(5) << all_w[i]->m_num;
cout << left << setw(10) << all_w[i]->m_name;
cout << left << setw(10) << all_w[i]->m_job;
cout << all_w[i]->function() << endl;
find = true;
}
}
if (!find)
cout << "未找到此员工信息" << endl;
}
void WorkerManage::Modify()
{
cout << "请输入所修改员工的编号:";
int sno;
int re;
int num;
cin >> sno;
int find = find_num(sno);
if (find == -1)
return;
cout << "选择需要修改的项目:" << endl;
cout << "1.员工编号" << endl;
cout << "2.员工职位" << endl;
cout << "3.员工姓名" << endl;
cin >> re;
switch (re)
{
case 1:
cout << "请输入修改后的编号:";
while (true)
{
cin >> num;
if (if_Repeat(num)||num==sno)//或者编号并未修改
break;
else cout << "编号存在重复,请重新输入:";
}
all_w[find]->m_num = num;
if (save(all_w, all_num, 0))
cout << "修改成功!" << endl;
else
cout << "操作失败" << endl;
break;
case 2:
cout << "请选择新职务:" << endl;
cout << "1.普通员工" << endl;
cout << "2.经理" << endl;
cout << "3.老板" << endl;
while (true)
{
cin >> num;
if (num != 1 && num != 2 && num != 3)
cout << "重新选择:";
else break;
}
if (num == 1)
all_w[find] = new staff(all_w[find]->m_num, all_w[find]->m_name);
else if(num==2)
all_w[find] = new manager(all_w[find]->m_num, all_w[find]->m_name);
else
all_w[find] = new boss(all_w[find]->m_num, all_w[find]->m_name);
if (save(all_w, all_num, 0))
cout << "修改成功!" << endl;
else
cout << "操作失败" << endl;
break;
case 3:
cout << "请输入修改后的姓名:";
cin >> all_w[find]->m_name;
if (save(all_w, all_num, 0))
cout << "修改成功!" << endl;
else
cout << "操作失败" << endl;
break;
default:
cout << "选择错误!" << endl;
break;
}
}
void WorkerManage::sort()
{
cout << "请选择排序方式:" << endl;
cout << "1.按编号升序" << endl;
cout << "2.按编号降序" << endl;
int s;
while (true)
{
cin >> s;
if (s == 1 || s == 2)
break;
else
cout << "无此选项,请重新选择:";
}
if (s == 1)
sort1();
else
sort2();
cout << "排序成功!" << endl;
}
void WorkerManage::sort1()
{
Read();//重新读入
bool flag = true;
for (int i = all_num-1 ; i > 0 && flag ; --i)
{
flag = false;
for (int j = 0; j < i; ++j)
{
if (all_w[j]->m_num > all_w[j + 1]->m_num)
{
swap(j, j + 1);
flag = true;
}
}
}
if (save(all_w, all_num, 0))
cout << "排序完毕!" << endl;
else
cout << "操作失败!" << endl;
}
void WorkerManage::sort2()
{
Read();//重新读入
bool flag = true;
for (int i = all_num - 1; i > 0 && flag; --i)
{
flag = false;
for (int j = 0; j < i; ++j)
{
if (all_w[j]->m_num < all_w[j + 1]->m_num)
{
flag = true;
swap(j, j + 1);
}
}
}
if (save(all_w, all_num, 0))
cout << "排序完毕!" << endl;
else
cout << "操作失败!" << endl;
}
void WorkerManage::swap(int a,int b)
{
worker* temp = all_w[a];
all_w[a] = all_w[b];
all_w[b] = temp;
}
void WorkerManage::if_clear()
{
cout << "确认清空文档?" << endl;
int x;
cout << "按1确定,其他键返回" << endl;
cin >> x;
if (x != 1)
return;
ofstream ofs(FILE, ios::trunc);//删除文件后新建
ofs.close();
}
WorkerManage::~WorkerManage()
{
if (w != NULL)
{
for (int i = 0; i < num; ++i)
{
if (w[i] != NULL)
{
delete w[i];
}
}
delete[]w;
w = NULL;
}
if (all_w != NULL)
{
for (int i = 0; i < all_num; ++i)
{
if (all_w[i] != NULL)
{
delete all_w[i];
}
}
delete[]all_w;
all_w = NULL;
}
}
主文件
#include"WorkerManage.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
WorkerManage w;
int x;
while (true)
{
system("cls");
w.show();
cout << "请选择所要进行的操作:";
cin >> x;
switch (x)
{
case 0:
w.Exit();
break;
case 1:
w.add();
system("pause");
break;
case 2:
w.display();
system("pause");
break;
case 3:
w.delete_Record();
system("pause");
break;
case 4:
w.Modify();
system("pause");
break;
case 5:
w.find();
system("pause");
break;
case 6:
w.sort();
system("pause");
break;
case 7:
w.if_clear();
system("pause");
break;
default:
cout << "无此选项" << endl;
system("pause");
break;
}
}
}