C++职工管理系统

利用多态实现职工管理系统增删改查,与文件交互
主要功能在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;
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【员工管理系统】 问题描述:每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。 基本要求:排序:按不同关键字,对所有员工的信息进行排序;查询:按特定条件查找员工;更新,按编号对某个员工的某项信息进行修改;插入,加入新员工的信息;删除,按编号删除已离职的员工的信息。 选作内容:实现图形用户界面。 通过链表实现 数据结构: #include #include #include #include #include using namespace std; typedef struct workers{ char name[15];//姓名 char department[18];//单位 char gender;//性别 unsigned int age;//年龄 unsigned long long telephone;//电话 unsigned long wage;//工资 unsigned long num;//职工号 struct workers *next; }*Linklist,Lnode; void frist_print() { printf("\t\t⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ \n\n"); printf("\t\t\t欢迎进入员工管理系统\n"); } void menu() { printf("\n\t\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf("\t\t \t ◎1.创建员工信息\t \n"); printf("\t\t \t ◎2.插入员工信息\t \n"); printf("\t\t \t ◎3.修改员工信息\t \n"); printf("\t\t \t ◎4.删除员工信息\t \n"); printf("\t\t \t ◎5.查询员工信息\t \n"); printf("\t\t \t ◎6.员工信息排序\t \n"); printf("\t\t \t ◎7.显示员工信息\t \n"); printf("\t\t \t ◎8.员工工资情况\t \n"); printf("\n\t\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf("注意:输入均以回车作为结束\n"); printf("please choise 1--8:\t "); //putchar(12); } void Inset(Linklist Head){ Linklist s,L; unsigned int agee; unsigned long wagee,numm;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值