C++案例:职工管理系统

博主分享了自学C++过程中遇到的挑战,特别是从面向过程思维转向面向对象思维。他们独立完成了职工管理系统案例,涉及类的继承、文件操作、数组管理等。案例包括添加、显示、删除、修改和排序职工信息等功能,但意识到代码仍停留在面向过程的实现。博主计划继续深化面向对象的理解,并反思了自己的代码实现。
摘要由CSDN通过智能技术生成
	学完C++基础内容(到指针这一节),开始了类的学习。从面向过程的思维要逐步转为面向对象的思维,现在的情况,较难,需要在以后的学习过程中慢慢体会,多思考,多做案例。
	本人通过看视频课程自学C++,视频来源黑马程序员,B站有免费全部视频,相信很多同学都是看的这个。目前已学完视频第二阶段——C++核心编程的内容,阶段结束后给出了一个案例,即职工管理系统。
	题目要求如下:
	职工管理系统可以用来管理公司内部所有员工的信息。
	公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位以及职责。
	普通员工职责:完成经理交给的任务
	经理职责:完成老板交给的任务,并下发任务给员工
	老板职责:管理公司所有事物
	管理系统需要实现的功能如下:
	1. 退出管理程序:退出当前管理系统
	2. 增加职工信息,实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门编号
	3. 显示职工信息:显示公司内部所有职工的信息
	4. 删除离职职工:按照员工编号删除指定的员工
	5. 修改职工信息:按照编号修改职工个人信息
	6. 按照编号排序:按照职工编号,进行排序,排序规则有用户指定(升序或降序)
	7. 清空所有文档:清空文件中记录的所有职工信息(请空前需要再次确认,防止误删)
	系统界面效果如下:
	![在这里插入图片描述](https://img-blog.csdnimg.cn/20201024162904114.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1aHVzaHVhaXNodWFp,size_16,color_FFFFFF,t_70#pic_center)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201024163631694.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h1aHVzaHVhaXNodWFp,size_16,color_FFFFFF,t_70#pic_center
在这里插入图片描述
保存职工信息的文件以这样的方式存储,中间以TABLA键隔开
做这个案例时,觉得这是个提升自己的好机会,另一方面也给后面的学习增加信心,所以就没有看视频教程的任何提示,完全独立思考。这里写写我最开始面对这个案例的想法与思路。
首先,很明显的是职工这个概念要用继承的方法,定义一个父类,再定义普通员工、经理、老板的子类并继承父类。
程序运行时,一定要有一个容器来存放所有的职工信息,在现在这个阶段,肯定还是得用数组。
本人认为难点在于读取文件,并将文件信息正确地存放在数组中。文件输入流将文件内部数据一个一个传入,在这个过程中,要判断数据的位置与类型,并根据这些数据与类型在堆区开辟内存,存放对应的对象,用上面所说的数组来存放堆区地址。
其次,添加职工的功能也在整个功能中是相对较难实现的,需要根据用户输入的数据创建对应的职工子类对象。
有一个重要的点,由于数组存放的职工与数组长度是不一样的,必须有一个标志去实时记录存放的职工人数。
最开始的想法已经过去好几天了,想起的就这么多,源码附上:(完全根据自己的想法来实现的,功能和案例的要求有微小差别)

	using namespace std;
#include<iostream>
#include<string>
#include<fstream>
//类的声明
class staff
{
	public:
		int	Id;	//职工编号
		int position;	//岗位	1:普通员工	2:经理	3:老板/董事长
	string name;	//职工姓名
	string duty;	//岗位职责数字
	string position2;	//岗位职责描述	
	staff()
	{
		this->Id = 0;
		this->name = " ";
		this->position = 0;
		this->position2 = " ";
		this->duty = " ";
	}
	staff(staff& s)
	{
		this->Id = s.Id;
		this->name = s.name;
		this->position = s.position;
		this->position2 = s.position2;
		this->duty = s.duty;
	}
	virtual void Set_Position() {};
	virtual void Set_Duty() {};
	
};
class President :public staff
{
	
	virtual void Set_Position()
	{
		position = 3;
		position2 = "总裁";
	}
	virtual void Set_Duty()
	{
		duty = "岗位职责:管理公司所有事物";
	}
};
class manager :public staff
{
	virtual void Set_Position()
	{
		position = 2;
		position2 = "经理";
	}
	virtual void Set_Duty()
	{
		duty = "岗位职责:完成老板交给的任务,并下发任务给员工";
	}
};
class employee :public staff
{
	virtual void Set_Position()
	{
		position = 1;
		position2 = "员工";
	}
	virtual void Set_Duty()
	{
		duty = "岗位职责:完成经理交给的任务";
	}
};

//函数定义
void Add_stuff(staff** Staff, int& End_Of_Staff)
{
	int d, p;
	string n;	//临时存储读取的单个信息
	cout << "请输入需要添加的职工编号:" << endl;
	cin >> d;
	cout << "请输入需要添加的职工姓名:" << endl;
	cin >> n;
	cout << "请输入需要添加的职工岗位:" << endl;
	cout << "1:员工" << endl;
	cout << "2:经理" << endl;
	cout << "3:总裁" << endl;
	cin >> p;
	if (p >= 1 && p <= 3)
	{
		if (p == 1)
		{
			Staff[End_Of_Staff] = new employee;
		}
		else if (p == 2)
		{
			Staff[End_Of_Staff] = new manager;
		}
		else
		{
			Staff[End_Of_Staff] = new President;
		}
		Staff[End_Of_Staff]->Id = d;
		Staff[End_Of_Staff]->name = n;
		Staff[End_Of_Staff]->Set_Position();
		Staff[End_Of_Staff]->Set_Duty();
		cout << "添加职工成功!" << endl;
		End_Of_Staff++;
	}
	else
		cout << "输入错误,请输入正确的编号:" << endl;	
};
void Display_stuff( staff **Staff, int &End_Of_Staff)
{
	if (End_Of_Staff == NULL)
	{
		cout << "无职工信息" << endl;
	}
	else
	{
		cout << "全部职工信息为:" << endl;
		int i;
		for (i = 0; i < End_Of_Staff; i++)
		{
			cout << "职工编号:" << Staff[i]->Id << "\t" << "职工姓名:" << Staff[i]->name << "\t" << "岗位:" << Staff[i]->position2 << "\t" << Staff[i]->duty << endl;
		}
	}
};
void Search_stuff(staff** Staff, int& End_Of_Staff)
{
	int a,b,j;
	string c;
	while (1)
	{
		cout << "请输入正确的查找方式:" << endl;
		cout << "1:按员工编号查找" << endl;
		cout << "2:按姓名查找" << endl;
		cin >> a;
		if (a == 1 || a == 2)
			break;
	}
	if (a == 1)
	{
		cout << "请输入要查找的员工号:" << endl;
		cin >> b;
		for (j = 0; j < End_Of_Staff; j++)
		{
			if (Staff[j]->Id == b)
			{
				cout << "查找成功!该职工信息如下:" << endl;
				cout << "职工编号:" << Staff[j]->Id << "\t" << "职工姓名:" << Staff[j]->name << "\t" << "岗位:" << Staff[j]->position2 << "\t" << Staff[j]->duty << endl;
				break;
			}	
		}
		if (j == End_Of_Staff)
		{
			cout << "没有该职工!" << endl;
		}
	}
	else
	{
		cout << "请输入要查找员工的姓名:" << endl;
		cin >> c;
		for (j = 0; j < End_Of_Staff; j++)
		{
			if (Staff[j]->name == c)
			{
				cout << "查找成功!该职工信息如下:" << endl;
				cout << "职工编号:" << Staff[j]->Id << "\t" << "职工姓名:" << Staff[j]->name << "\t" << "岗位:" << Staff[j]->position2 << "\t" << Staff[j]->duty << endl;
				break;
			}
		}
		if (j == End_Of_Staff)
		{
			cout << "没有该职工!" << endl;
		}	
	}
};
void Delete_stuff(staff** Staff, int& End_Of_Staff)
{
	int b,j,k,m=End_Of_Staff;
	cout << "请输入即将要删除的职工号:" << endl;
	cin >> b;
	for (j = 0; j < End_Of_Staff; j++)
	{
		if (Staff[j]->Id == b)
		{
			k = j;
			for (k; k < End_Of_Staff - 1; k++)
			{
				//找到之后,需先将指针内容指向的堆区地址释放,在重新拷贝其下一个的对象,其地址存放在当前位置;由此不断往前覆盖
				if (Staff[k] != NULL)
				{
					delete Staff[k];
					Staff[k] = NULL;
				}
				if (Staff[k + 1]->position == 1)
				{
					Staff[k] = new employee;
					*Staff[k] = *Staff[k + 1];
				}
				else if (Staff[k + 1]->position == 2)
				{
					Staff[k] = new manager;
					*Staff[k] = *Staff[k + 1];
				}
				else
				{
					Staff[k] = new President;
					*Staff[k] = *Staff[k + 1];
				}
			}
			End_Of_Staff--;
			cout << "职工删除成功" << endl;
			break;
		}
	}
	if (j == m)
	{
		cout << "没有该职工!" << endl;
	}
};
void Modify_stuff(staff** Staff, int& End_Of_Staff)
{
	int i, d;
	cout << "请输入要修改的职工号:" << endl;
	cin >> d;
	for (i = 0; i < End_Of_Staff; i++)
	{
		if (Staff[i]->Id == d)
		{
			cout << "查到:" << d << "号职工,请输入新职工号:" << endl;
			break;
		}
	}
	if (i == End_Of_Staff)
	{
		cout << "没有该职工!" << endl;
	}
	else
	{
		cin >> Staff[i]->Id;
		cout << "请输入新姓名:" << endl;
		cin >> Staff[i]->name;
		cout << "请输入岗位:" << endl;
		cout << "1、普通职工" << endl;
		cout << "2、经理" << endl;
		cout << "3、老板" << endl;
		cin >> Staff[i]->position;
		cout << "修改成功!" << endl;
	}
};
void Rank_stuff(staff** Staff, int& End_Of_Staff)
{
	int a, i, j;
	staff* temp;
	cout << "请选择排序方式:" << endl;
	cout << "1、按职工号进行升序" << endl;
	cout << "2、按职工号进行降序" << endl;
	cin >> a;
	while (1)
	{
		if (a == 1)
		{
			for (i = 0; i < End_Of_Staff - 1; i++)
			{
				for (j = 0; j < End_Of_Staff - 1 - i; j++)
				{
					if (Staff[j]->Id >= Staff[j + 1]->Id)
					{
						temp = Staff[j + 1];
						Staff[j + 1] = Staff[j];
						Staff[j] = temp;
					}
				}

			}
			cout << "排序成功!排序后结果为:" << endl;
			Display_stuff(Staff, End_Of_Staff);
			break;
		}
		else if (a == 2)
		{
			for (i = 0; i < End_Of_Staff - 1; i++)
			{
				for (j = 0; j < End_Of_Staff - 1 - i; j++)
				{
					if (Staff[j]->Id <= Staff[j + 1]->Id)
					{
						temp = Staff[j + 1];
						Staff[j + 1] = Staff[j];
						Staff[j] = temp;
					}
				}
			}
			cout << "排序成功!排序后结果为:" << endl;
			Display_stuff(Staff, End_Of_Staff);
			break;
		}
		else
		{
			cout << "输入错误" << endl;
			cout << "请选择排序方式:" << endl;
			cout << "1、按职工号进行升序" << endl;
			cout << "2、按职工号进行降序" << endl;
			cin >> a;
		}
	}
};
void clear_whole(staff** Staff, int& End_Of_Staff)
{
	int i;
	for (i = 0; i < End_Of_Staff; i++)
	{
		if (Staff[i] != NULL)
		{
			delete Staff[i];
			Staff[i] = NULL;
		}
	}
	cout << "清除成功!" << endl;
	End_Of_Staff = 0;
};
void Display_menu()   //显示菜单函数
{
	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 Save_Staff(staff** Staff, int& End_Of_Staff)
{
	int i;
	if (End_Of_Staff != 0)
	{
		ofstream ofs;
		ofs.open("职工信息.txt", ios::out);
		for (i = 0; i < End_Of_Staff; i++)
		{
			if (i < End_Of_Staff - 1)
			{
				ofs << Staff[i]->Id << "\t" << Staff[i]->name << "\t" << Staff[i]->position << endl;
			}
			else
			{
				ofs << Staff[i]->Id << "\t" << Staff[i]->name << "\t" << Staff[i]->position;
			}
		}
	}
	else
	{
		ofstream ofs;
		ofs.open("职工信息.txt", ios::trunc);
		ofs.close();
	}
}

int main()
{
	//变量定义
	int pick;//输入选择
	int End_OF_Staff;//职工数组最后一个对象定位

	staff *Staff[1000];	//保存职工信息的数组
	int i;	//循环变量

	//读取文件信息,存储在Staff数组中
	ifstream ifs;
	ifs.open("职工信息.txt", ios::in);
	if (!ifs.is_open())
	{
		cout << "职工信息文件接入失败" << endl;
		goto exit;
	}
	else
	{
		cout << "职工文件信息接入成功!" << endl;
	}
	           
	for (i = 0; i != 10000; i++)
	{
		int d, p;
		string n;	//临时存储读取的单个信息
		if (ifs.eof())
			break;
		if ((i - 1) % 3 == 0)
		{
			ifs >> d >> n >> p;
			if (p == 1)
			{
				Staff[(i - 1) / 3] = new employee;
			}
			else if (p == 2)
			{				
				Staff[(i - 1) / 3] = new manager;
			}
			else
			{
				Staff[(i - 1) / 3] = new President;
			}
			Staff[(i - 1) / 3]->Id = d;
			Staff[(i - 1) / 3]->name = n;
			Staff[(i - 1) / 3]->Set_Position();
			Staff[(i - 1) / 3]->Set_Duty();
			End_OF_Staff = (i - 1) / 3 + 1;
		}
	}
	ifs.close();
	while (1)
	{
		Display_menu();
		cin >> pick;
		switch (pick)
		{
		case 0: goto exit;      break;
		case 1:Add_stuff(Staff, End_OF_Staff);     break;
		case 2:Display_stuff(Staff,End_OF_Staff); break;
		case 3:Delete_stuff(Staff, End_OF_Staff);  break;
		case 4:Modify_stuff(Staff, End_OF_Staff);  break;
		case 5:Search_stuff(Staff, End_OF_Staff);  break;
		case 6:Rank_stuff(Staff, End_OF_Staff);    break;
		case 7:clear_whole(Staff, End_OF_Staff);   break;
		default:cout << "请输入正确的选项代号!" << endl; break;
		}	
	}
	exit:cout << "欢迎下次使用!" << endl;
	//重写文件——更新职工信息
	Save_Staff(Staff, End_OF_Staff);
	return 0;
}

最后总结一下:
当把所有出错的语句,遇到的问题,还有一些搞不明白的bug都解决,所有的功能都实现了的时候,还是很开心的啦,也是成就感十足的!
不过,看了视频教程里面的案例实现,发现我这代码。。。。。怕是一坨屎(微笑脸)
不足的地方有很多,很多基本的知识点都忘了!例如:退出窗口程序exit()都不知道;清屏语句不知道…
最最最最关键的,是开头说的,面向对象的思维!看了人家标准答案,我这简直就是用面向过程的思维来实现的哈哈,这个问题,这个思维过程,后面的逐渐转变过去。
再次回看自己的代码,怎么看不懂了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值