main.cpp
#include
#include
#include
#include"workManger.h"
#include"employee.h"
#include"Manager.h"
#include"boss.h"
using namespace std;
int main()
{
WorkManger w;
while (1) {
w.Cover();
w.Chose();
w.HideConsoleCursor();
}
return 0;
}
workManger.h
#pragma once //防止头文件重复包含
#include
#include
#include
#include
#include"Worker.h"
#include"employee.h"
#include"boss.h"
#include"Manager.h"
#define FILENAME "file.txt"
using namespace std;
//职工管理类
class WorkManger {
public:
//构造函数中初始化数据
WorkManger();
//文字输出位置
void WordOutPos(int x, int y);
//隐藏光标
VOID HideConsoleCursor(VOID);
//更换黑窗口标题
VOID SetTitle(LPCWSTR lpTitle);
//职工管理系统开始界面
void Cover();
//选择界面
void Chose();
//0 退出选项
void ExitSystem();
~WorkManger();
//记录文件中人数个数
int man_num;
//员工数组的指针-----用这个二级指针指向一个一级指针数组
Worker** man_array;
//添加职工
void man_add();
//保存到文件
void save();
//标志文件是否为空
bool file_empty;
//统计文件中在职员工
int Get_num();
//初始化二级指针指向的指针数组
void init_array();
//2 显示职工
void show_man();
//按照职工编号判断职工是否存在,若存在返回职工在数组中的位置,不存在返回-1
int man_isExist(int id);
//3 删除职工
void del_man();
//4 修改职工
void Mod_man();
//5 查找职工
void Find_man();
//6 职工编号排序
void Sort_man();
//7 清空文件
void Clean_file();
};
workManger.cpp
#include"workManger.h"
//构造函数中初始化数据
WorkManger::WorkManger() {
ifstream ifs; //创建对象,读取数据
ifs.open(FILENAME, ios::in);
//1.文件不存在的情况
if (!ifs.is_open()) //判断打开文件是否成功
{
//cout << "文件不存在" << endl;
//初始化文件
man_num = 0;
man_array = NULL;
file_empty =true; //初始化文件为空标志
ifs.close();
return;
}
//2.文件存在,数据为空
char ch;
ifs >> ch;
if (ifs.eof())
{
//cout << "文件存在,数据为空" << endl;
man_num = 0;
man_array = NULL;
file_empty = true; //初始化文件为空标志
ifs.close();
return;
}
//3.文件存在,并且记录有数据
int num = Get_num();
//cout << "职工的人数为:" << num << endl;
this->man_num = num;
//开辟空间
man_array = new Worker * [man_num];
//将文件中的数组保存到数组中
init_array();
//测试代码
/*for (int i = 0; i < man_num; i++)
{
cout << "职工编号:" << man_array[i]->id << " "
<< "职工姓名:" << man_array[i]->name << " "
<< "部门编号: " << man_array[i]->departid << endl;
}*/
}
//文字输出位置
void WorkManger::WordOutPos(int x, int y) {
COORD coord = {
x,y };
HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(output, coord);
}
//隐藏光标
VOID WorkManger::HideConsoleCursor(VOID) {
CONSOLE_CURSOR_INFO cursor_info = {
1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),
&cursor_info);
}
//更换黑窗口标题
VOID WorkManger::SetTitle(LPCWSTR lpTitle) {
SetConsoleTitle(lpTitle);
}
//职工管理系统开始界面
void WorkManger:: Cover() {
SetTitle(L"职工信息管理系统");
WordOutPos(45, 6);
HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
WORD word = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
SetConsoleTextAttribute(output, word);
cout << "职 工 管 理 系 统" << endl;
WordOutPos(48, 8);
WORD word1 = FOREGROUND_BLUE | FOREGROUND_INTENSITY;
SetConsoleTextAttribute(output, word1);
cout << "0.退出管理系统" << endl;
WordOutPos(48, 10);
cout << "1.增加职工信息" << endl;
WordOutPos(48, 12);
cout << "2.显示职工信息" << endl;
WordOutPos(48, 14);
cout << "3.删除离职职工" << endl;
WordOutPos(48, 16);
cout << "4.修改职工信息" << endl;
WordOutPos(48, 18);
cout << "5.查找职工信息" << endl;
WordOutPos(48, 20);
cout << "6.按照编号排序" << endl;
WordOutPos(48, 22);
cout << "7.清空所有文档" << endl;
}
//选择界面
void WorkManger::Chose() {
int chose;
HANDLE output1 = GetStdHandle(STD_OUTPUT_HANDLE);
WordOutPos(48, 24);
WORD word2 = FOREGROUND_RED | FOREGROUND_INTENSITY;
SetConsoleTextAttribute(output1, word2);
cout << "请输入你的选择:";
cin >> chose;
switch (chose)
{
case 0:
system("cls");
ExitSystem();
break;
case 1:
system("cls");
man_add();
break;
case 2:
system("cls");
show_man();
break;
case 3:
system("cls");
del_man();
break;
case 4:
system("cls");
Mod_man();
break;
case 5:
system("cls");
Find_man();
break;
case 6:
system("cls");
Sort_man();
break;
case 7:
system("cls");
Clean_file();
break;
default:
system("cls");
break;
}
}
//0 退出系统
void WorkManger::ExitSystem()
{
WordOutPos(45, 6);
cout << "欢迎下次使用" << endl;
exit(0);
}
//1 增加职工信息
void WorkManger::man_add()
{
cout << "请输入新添加的人员数量" << endl;
int AddNum = 0;
cin >> AddNum;
if (AddNum > 0)
{
//计算新空间大小
int NewSize=AddNum+man_num;
//开辟新的空间
//该二级指针指向的是在堆区动态开辟的指针数组的首地址
//该动态开辟的指针数组里面每个元素均为指针
//然后每个指针指向在堆区动态开辟的数据
Worker** NewSpace = new Worker * [NewSize];//二级指针指向一个存放Worker类型的指针数组,数组中存放的是指针
//将原有空间下的内存放入新空间下
//如果之前的二级指针man_array已经指向了一个指针数组的首地址,就把该指针数组里面的元素拷贝到二级指针NewSpace指向的指针数组
if (man_array != NULL)
{
for (int i = 0; i < man_num; i++)
{
NewSpace[i] = man_array[i];
}
}
//添加新数据
for (int i = 0; i < AddNum; i++)
{
int id;
string name;
int departid;
cout << "请输入第" << i + 1 << "个职工的编号" << endl;
cin >> id;
cout << "请输入第" << i + 1 << "个职工的姓名" << endl;
cin >> name;
cout << "请选择该职工的岗位:" << endl;
cout << "1.普通职工" << endl;
cout << "2.经理" << endl;
cout << "3.老板" << endl;
cin >> departid;
//创建一个指向worker类的指针
//根据情况,每次循环将该指针指向不同类型开辟的堆区空间
Worker* worker = NULL;
switch (departid)
{
case 1:
worker = new Employee(id,name,departid);
break;
case 2:
worker = new Manager(id, name, departid);
break;
case 3:
worker = new Boss(id, name, departid);
break;
default:
break;
}
//在newspace指向的指针数组中原有最后一个元素的后面,存放新的指针
NewSpace[i+man_num] = worker; //指针数组存放的是指针,这边是指针数组每个元素所存放的指针
}
//释放原有空间
delete[] man_array; //这边释放的是二级指针指向的指针数组,因为二级指针指向指针数组的首地址,所以可以用二级指针的名字来代替指针数组的名字
//将二级指针指向新开辟的指针数组
man_array = NewSpace;
//更新新的个数
man_num = NewSize;
//添加完数据之后文件不为空
file_empty = false;
//提示信息
cout << "成功添加" << AddNum << "名新职工" << endl;
save();
system("pause");
system("cls");
}
else
{
cout << "输入有误" << endl;
}
}
//保存到文件(写入)
void WorkManger::save()
{
//创建对象
ofstream ofs;
ofs.open(FILENAME, ios::out); //写入操作
for (int i = 0; i < man_num; i++)
{
ofs << man_array[i]->id << " " << man_array[i]->name << " " << man_array[i]->departid << endl;
}
ofs.close();
}
WorkManger::~WorkManger()
{
//释放堆区内存
if (this->man_array != NULL)
{
for (int i = 0; i < man_num; i++)
{
if (man_array[i] != NULL) //如国二级指针指向的指针数组里面每个指针指向不为空,就释放指针数组内指针指向堆区的内存
{
delete man_array[i];
}
}
delete[] man_array; //释放这个二级指针指向在堆区的指针数组
man_array = NULL;
}
}
//统计文件中现有人数
int WorkManger::Get_num()
{
ifstream ifs;
ifs.open(FILENAME, ios::in); //以读取的方式打开
int id;
string name;
int departid;
int num = 0;
//while(ifs>>buf) 遇到空格,换行,或者文件尾结束一次读取,即一次读取连续的内容
while (ifs >> id && ifs >> name && ifs >> departid) //读完id遇到空格结束一次读取,读取name遇到空格结束一次读取,读取departid遇到空格结束一次读取
{
//三个全部结束读取,num++
//接着第二行,第三行....一直读到文件结束符号
//统计人数变量
num++;
}
return num;
}
//初始化数组
void WorkManger::init_array()
{
ifstream ifs; //读取数据
ifs.open(FILENAME, ios::in);//把文件中的数据读出来
int id;
string name;
int departid;
int index = 0;
//遇到空格,换行,文件结束符结束一次读取
while (ifs >> id && ifs >> name && ifs >> departid) //每次读取一行数据
{
Worker* worker=NULL;
if (departid == 1)
worker = new Employee(id, name, departid);
if (departid == 2)
worker = new Manager(id, name, departid);
if (departid == 3)
worker = new Boss(id, name, departid);
//调用数组之前,前面二级指针要指向一个已经开辟空间的指针数组,否则会访问冲突
man_array[index] = worker;
index++;
}
ifs.close();
}
//2 显示职工信息
void WorkManger::show_man()
{
ifstream ifs; //从文件中读取数据
ifs.open(FILENAME, ios::in);
//判断文件是否为空
if (file_empty) {
cout << "文件不存在或记录为空" << endl;
}
else {
for (int i = 0; i < man_num; i++)
//利用多态调用接口
man_array[i]->ShowInfo();
}
system("pause");
system("cls");
}
//判断职工是否存在
int WorkManger::man_isExist(int Id)
{
int index = -1;
//遍历数组
for (int i = 0; i < man_num; i++)
{
if (man_array[i]->id == Id)
{
index =i; //返回数组中的下标
break;
}
}
return index;
}
//3 删除职工
void WorkManger::del_man()
{
if (file_empty) {
cout << "文件为空或者无记录" << endl;
}
else {
//按照职工编号进行删除操作
cout << "请输入想要删除的职工id" << endl;
int id;
cin >> id;
int index=man_isExist(id);
if (index != -1)
//说明职工存在,并且要删除掉index位置上的职工
{
//数组删除元素的本质:数据前移
for (int i =index; i <man_num-index; i++)
{
man_array[i] = man_array[i + 1];
}
//更新数组中记录的人员个数
man_num--;
//删除后,将数据保存至文件
save();
cout << "删除职工成功" << endl;
}
else {
cout << "职工不存在" << endl;
}
}
system("pause");
system("cls");
}
//4 修改职工
void WorkManger::Mod_man()
{
if (file_empty)
{
cout << "文件不存在或记录为空" << endl;
}
else {
cout << "请输入所要修改职工编号" << endl;
int id;
cin >> id;
int ret = man_isExist(id);
if (ret != -1)
{
//有此职工存在,可进行修改
delete this->man_array[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* worker = NULL;
switch (newid) {
case 1:
worker = new Employee(newid, newname, newdid);
break;
case 2:
worker = new Manager(newid, newname, newdid);
break;
case 3:
worker = new Boss(newid, newname, newdid);
break;
default:
break;
}
//更新至数组中
this->man_array[ret] = worker;
cout << "修改成功" << endl;
//保存到文件中
save();
}
else {
cout << "修改失败,查无此人" << endl;
}
}
system("pause");
system("cls");
}
//5 查找职工
void WorkManger::Find_man() {
if (file_empty)
{
cout << "文件不存在或记录为空" << endl;
}
else {
cout << "请选择你所要查找的方式" << endl;
cout << "1.职工编号查找" << endl;
cout << "2.职工姓名查找" << endl;
int select = 0;
cin >> select;
if (select == 1)
{
//按照编号查
int id;
cout << "请输入所要查找的职工id:" << endl;
cin >> id;
int ret = man_isExist(id);
if (ret != -1)
{
//有该职工存在
cout << "查找成功! 该职工信息如下:" << endl;
man_array[ret]->ShowInfo();
}
else {
cout << "查无此人" << endl;
}
}
else if (select == 2)
{
//按照姓名来查
string name;
cout << "请输入查找职工的姓名: " << endl;
cin >> name;
//加入是否查找到该职工的标志
bool flag=false;
for (int i = 0; i < man_num; i++)
{
if (this->man_array[i]->name == name)
{
cout << "查找成功,职工信息如下:" << endl;
man_array[i]->ShowInfo();
flag = true;
}
}
if (flag == false)
{
cout << "查无此人" << endl;
}
}
else {
cout << "输入错误,请重新输入" << endl;
}
}
system("pause");
system("cls");
}
//6 职工编号排序
void WorkManger::Sort_man()
{
if (file_empty)
{
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 < man_num; i++)
{
int max = i;
for (int j = i + 1; j < man_num; j++)
{
if (select == 1)//升序
{
if (man_array[max]->id > man_array[j]->id)
{
max = j;
}
}
if (select == 2)//降序
{
if (man_array[max]->id < man_array[j]->id)
{
max = j;
}
}
}
if (max != i)
{
Worker* temp = man_array[max];
man_array[max] = man_array[i];
man_array[i] = temp;
}
}
cout << "排序成功,排序后结果为:" << endl;
//保存到文件
save();
//显示职工
show_man();
}
}
//7 清空文件
void WorkManger::Clean_file()
{
cout << "确认是否清空:" << endl;
cout << "1.清空" << endl;
cout << "2.返回" << endl;
int chose = 0;
cin >> chose;
if (chose == 1)
{
ofstream ofs(FILENAME,ios::trunc); //删除文件后,重新创建
ofs.close();
if (man_array != NULL)
{
for (int i = 0; i < man_num; i++)
{
//释放二级指针指向的指针数组里面每个指针元素指向堆区创建对象的内存
delete man_array[i];
//释放完对象后,把指针数组里面每个指针元素置空
man_array[i] = NULL;
}
//释放堆区的指针数组
delete[] man_array;
man_array = NULL;
//初始化数据
man_num = 0;
file_empty = true;
}
cout << "清空成功" << endl;
}
system("pause");
system("cls");
}
基类:Worker.h
#pragma once
#include
#include
using namespace std;
//职工抽象类
class Worker {
public:
//显示个人所有信息
virtual void ShowInfo() = 0;
//获取岗位名称
virtual string GetDaprtName() = 0;
//职工编号
int id;
//职工姓名
string name;
//部门编号
int departid;
};
下面为子类:
Boss.h
#pragma once
#include
#include
#include"Worker.h"
using namespace std;
//老板类
class Boss :public Worker {
public:
//构造函数初始化数据
Boss(int id, string name, int departname);
//显示个人所有信息
void ShowInfo();
//获取岗位名称
string GetDaprtName();
};
boss.cpp
#include"Boss.h"
//构造函数初始化数据
Boss::Boss(int id, string name, int departid) {
this->id = id; this->name = name; this->departid = departid; }
//显示个人所有信息
void Boss::ShowInfo() {
cout << "职工的编号:" << id << "\t职工的姓名:" << name << "\t职工的岗位:" << GetDaprtName() << "\t岗位职责:管理公司事务" << endl;
}
//获取岗位名称
string Boss::GetDaprtName()
{
return (string)"总裁";
}
Employee.h
#pragma once
#include
#include
#include"Worker.h"
using namespace std;
//普通员工类
class Employee:public Worker {
public:
//构造函数初始化数据
Employee(int id, string name, int departname);
//显示个人所有信息
void ShowInfo();
//获取岗位名称
string GetDaprtName();
};
Employee.cpp
#include"employee.h"
//构造函数初始化数据
Employee::Employee(int id, string name, int departid) {
this->id = id; this->name = name; this->departid = departid; }
//显示个人所有信息
void Employee::ShowInfo() {
cout << "职工的编号:" << id << "\t职工的姓名:" << name << "\t职工的岗位:" << GetDaprtName() <<"\t岗位职责:完成经理交给的任务"<< endl;
}
//获取岗位名称
string Employee::GetDaprtName()
{
return (string)"员工";
}
manger.h
#pragma once
#include
#include
#include"Worker.h"
using namespace std;
//经理类
class Manager :public Worker{
public:
//构造函数初始化数据
Manager(int id, string name, int departname);
//显示个人所有信息
void ShowInfo();
//获取岗位名称
string GetDaprtName();
};
manger.cpp
#include"Manager.h"
//构造函数初始化数据
Manager::Manager(int id, string name, int departid) {
this->id = id; this->name = name; this->departid = departid; }
//显示个人所有信息
void Manager::ShowInfo() {
cout << "职工的编号:" << id << "\t职工的姓名:" << name << "\t职工的岗位:" << GetDaprtName() << "\t岗位职责:完成老板交给的任务,并且下发给员工" << endl;
}
//获取岗位名称
string Manager::GetDaprtName()
{
return (string)"经理";
}
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2dspnygd2z40c