黑马程序员----职工管理系统(c++)

2023-11-02

目录

一、项目概要:

二、代码:

三、演示效果

四、项目注意点:

五、一点点感悟:


一、项目概要:

(1)面向角色:普通员工、经理和老板;

(2)主要功能:增加员工信息、显示员工信息、删除离职员工信息、修改员工信息、查找员工信息、按照编号排序、清空所有文档和退出管理程序;

(3)项目结构:


二、代码:

  • employee.h
#pragma once
#include<iostream>
using namespace std;
#include"worker.h"
//员工类
class Employee :public worker
{
public:
	//构造函数
	Employee(int id, string name, int dId);
	//显示个人信息
	virtual void showInfo();
	//获取职工岗位名称
	virtual string getDeptName();
};
  • employee.cpp
#include "employee.h"
Employee::Employee(int id, string name, int dId)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = dId;
}
void Employee::showInfo()//打印职工信息
{
	cout << "职工编号:" << this->m_Id
		<< "\t职工姓名:" << this->m_Name
		<< "\t岗位:" << this->getDeptName()
		<< "\t岗位职责:完成经理交给的任务" << endl;
}

string Employee::getDeptName()
{
	return string("员工");
}
  • manager.h
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"
//经理类
class Manager :public worker
{
public:
	Manager(int id, string name, int dId); 
	//显示个人信息
	virtual void showInfo();
	//获取职工岗位名称
	virtual string getDeptName();
};
  • manager.cpp
#include"manager.h"
Manager::Manager(int id, string name, int dId)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = dId;
}
void Manager::showInfo()//打印职工信息
{
	cout << "职工编号:" << this->m_Id
		<< "\t职工姓名:" << this->m_Name
		<< "\t岗位:" << this->getDeptName()
		<< "\t岗位职责:完成老板交给的任务,并下发任务给员工" << endl;
}

string Manager::getDeptName()
{
	return string("经理");
}
  • boss.h
#pragma once
#include<iostream>
using namespace std;
#include"worker.h"
//老板类
class Boss:public worker
{
public:
	Boss(int id, string name, int dId);
	//显示个人信息
	virtual void showInfo();
	//获取职工岗位名称
	virtual string getDeptName();
};
  • boss.cpp
#include "boss.h"
Boss::Boss(int id, string name, int dId)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = dId;
}
void Boss::showInfo()//打印职工信息
{
	cout << "职工编号:" << this->m_Id
		<< "\t职工姓名:" << this->m_Name
		<< "\t岗位:" << this->getDeptName()
		<< "\t岗位职责:管理好公司" << endl;
}

string Boss::getDeptName()
{
	return string("老板");
}

  • worker.h
#pragma once
#include<iostream>
#include<string>
using namespace std;
//职工抽象基类
class worker
{
public:
	//显示个人信息
	virtual void showInfo() = 0;
	//获取岗位名称
	virtual string getDeptName() = 0;
	int m_Id;//职工编号
	string m_Name;//职工姓名
	int m_DeptId;//职工所在部门名称编号
};
  • 职工管理系统.cpp
#include<iostream>
using namespace std;
#include"workermanager.h"//引用自定义的文件,来实例化管理对象
//引用员工、经理和老板
/*
#include "worker.h"
#include"boss.h"
#include"employee.h"
#include"manager.h"
*/
int main()
{
	//测试代码:
	/*worker* worker = NULL;
	worker = new Employee(1,"张三",1);
	worker->showInfo();
	delete worker;

	worker = new Manager(2, "李四", 2);
	worker->showInfo();
	delete worker;

	worker = new Boss(3, "王五", 3);
	worker->showInfo();
	delete worker;
	*/

	WorkerManager wm;//实例化管理者对象
	int choice = 0;//用来存储用户的选项
	while (true)//死循环
	{
		//展示菜单
		wm.Show_Menu();//调用展示菜单成员函数
		cout << "请输入您的选择:" << endl;
		cin >> choice;//接受用户的选项
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加员工信息
			wm.Add_Emp();
			break;
		case 2:	//显示员工信息
			wm.Show_Emp();
			break;
		case 3://删除离职员工信息
			wm.Del_Emp();
			break;
		case 4:	//修改员工信息
			wm.Mod_Emp();
			break;
		case 5:	//查找员工信息 
			wm.Find_Emp();
			break;
		case 6:	//按照编号排序
			wm.Sort_Emp();
			break;
		case 7:	//清空所有文档
			wm.Clean_File();
			break;
			
		default:
			system("pause");
			break;
		}
		

	}
	system("pause");
	return 0;

}
  • workermanager.h
#pragma once//防止头文件重复包含
#include<iostream>//包含输入输出流头文件
#include "worker.h"
#include"boss.h"
#include"employee.h"
#include"manager.h"

#include<fstream>
#define FILENAME  "empFile.txt"

using namespace std;//使用标准命名空间
class WorkerManager
{
public:
	//构造函数
	WorkerManager();

	//展示菜单
	void Show_Menu();

	//退出系统
	void ExitSystem();

	//记录职工人数
	int m_EmpNum;

	//职工数组指针
	worker** m_EmpArray;//这里需要引入worker.h

	//添加职工
	void Add_Emp();

	//保存文件
	void save();

	//判断文件是否为空标志
	bool m_FileIsEmpty;

	//统计文件中的人数
	int get_EmpNum();

	//初始化员工
	void init_Emp();

	//显示职工
	void Show_Emp();

	//删除职工
	void Del_Emp();

	//判断职工是否存在,如果存在返回职工所在数组中的位置,不存在返回-1
	int IsExist(int id);

	//修改职工
	void Mod_Emp();

	//查找员工
	void Find_Emp();

	//按照编号排序
	void Sort_Emp();

	//清空文件
	void Clean_File();

	//析构函数
	~WorkerManager();

};
  • workermanager.cpp
#include"workermanager.h"
WorkerManager::WorkerManager()
{
	//初始化情况共三种
	// 1、文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化属性,设置初始化记录人数为0
		this->m_EmpNum = 0;		
		//初始化数组指针
		this->m_EmpArray = NULL;
		//初始化文件是否为空
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}
	// 2、文件存在且数据为空
	char ch;
	ifs >> ch;
	if(ifs.eof())
	{
	//文件为空
	cout << "文件为空!" << endl;
	//初始化属性,设置初始化记录人数为0
	this->m_EmpNum = 0;
	//初始化数组指针
	this->m_EmpArray = NULL;
	//初始化文件是否为空
	this->m_FileIsEmpty = true;
	ifs.close();//关闭文件
	return;
	}
	//3、文件存在,并且记录数据
	int num = this->get_EmpNum();
	cout << "职工人数为:" << num << endl;
	this->m_EmpNum = num;
	//开辟空间
	this->m_EmpArray = new worker * [this->m_EmpNum];
	//将文件中的数据存放到数组中
	this->init_Emp();
	
	
	//测试第三种情况是否成功
	/*
	for (int i = 0; i < this->m_EmpNum; i++)
	{
		cout << "职工编号:" << this->m_EmpArray[i]->m_Id
			<< "姓名:" << this->m_EmpArray[i]->m_Name
			<< "职位:" << this->m_EmpArray[i]->m_DeptId;
	}
	*/


}
//展示菜单
void WorkerManager::Show_Menu()
{
	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;
	cout << endl;
}
//0------------------退出系统
void WorkerManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出
}

//1------------------添加信息
void WorkerManager::Add_Emp()
{
	cout << "请输入需要添加的职工数量:" << endl;
	int addNum = 0;//保存用户的输入数量
	cin >> addNum;//接受数据
if (addNum > 0)
	{
		//添加
		//计算添加新空间大小
		int newSize = this->m_EmpNum + addNum;//新空间人数=原来记录人数+新增加的人数

		//开辟新空间
		worker ** newspace=new worker* [newSize];
		//将原来空间下数据拷贝到新空间下
		if (this->m_EmpArray != NULL)
		{
			for (int i = 0; i < this->m_EmpNum; i++ )
			{
				newspace[i] = this->m_EmpArray[i];
			}

		}
		//批量添加新数据
		for (int i = 0; i < addNum; i++)
		{
			int id;//职工编号
			string name;//职工姓名
			int dselect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			cout << "请选择新职工职位:" << endl;
			cout << "1-普通员工" << endl;
			cout << "2-经理" << endl;
			cout << "3-老板" << endl;
			cin >> dselect;

			worker* worker = NULL;
			switch (dselect)//根据不同的职位创建不同的职工
			{
			case 1:
				worker = new Employee(id, name, 1);
				break;
			case 2:
				worker = new Manager(id, name, 2);
				break;
			case 3:
				worker = new Boss(id, name, 3);
				break;
			default:
				cout << "输入有误!" << endl;
				break;
			}
			//将创建职工职责,保存在数组中
			newspace[this->m_EmpNum + i] = worker;

		}
		//释放原有空间
		delete[] this->m_EmpArray;
		//更改新空间的指向
		this->m_EmpArray = newspace;
		//更新新的职工人数
		this->m_EmpNum = newSize;
		//更新职工不为空标志
		this->m_FileIsEmpty = false;
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		//保存数据到文件中
		this->save();
	}
	else
	{
		cout << "输入数据有误" << endl;
	}
	//按任意键清屏,回到上一级目录
	system("pause");
	system("cls");

}


//保存文件
void WorkerManager::save()
{
	ofstream ofs;//通过文件输出流的对象ofs打开文件
	ofs.open(FILENAME, ios::out);//用输出的方式打开文件---写文件

	for (int i = 0; i < this->m_EmpNum; i++)	//将每个人数据写入到文件中
	{
		ofs << this->m_EmpArray[i]->m_Id << " "
			<< this->m_EmpArray[i]->m_Name << " "
			<< this->m_EmpArray[i]->m_DeptId << endl;
	}
	ofs.close();//操作结束后,关闭文件
}


//3、文件存在,并且记录数据(对应上面的代码)
int WorkerManager::get_EmpNum()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//打开文件,读取数据
	int id;
	string name;
	int dId;
	int num = 0;
	while (ifs >> id && ifs >> name && ifs >> dId)
	{
		//记录人数
		num++;
	}
	ifs.close();
	return num;
}

//初始化员工
void WorkerManager::init_Emp()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	int id;
	string name;
	int dId;
	int index = 0;//索引位置
	while (ifs >>id  && ifs >> name && ifs >> dId)//读取数据
	{
		worker* worker = NULL;
		//根据不同的部门id创建不同对象
		if (dId == 1)//1普通职工
		{
			worker = new Employee(id, name, dId);
		}
		else if(dId==2)//2经理
		{
			worker = new Manager(id, name, dId);
		}
		else//3老板
		{
			worker = new Boss(id, name, dId);
		}
		//存放在数组中
		this->m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}
//2------------------显示职工
void WorkerManager::Show_Emp()
{
	//判断文件是否为空
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		for (int i = 0; i<m_EmpNum;i++)
		{
			//利用多态调用接口
			this->m_EmpArray[i]->showInfo();
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

//3------------------删除职工
void  WorkerManager::Del_Emp()
{
	if (this->m_FileIsEmpty)//为空
	{
		cout << "文件不存在或者记录为空!" << endl;
	}
	else
	{
		//按照职工编号删除
		cout << "请输入想要删除的职工编号:" << endl;
		int id=0;
		cin >> id;
		int index = this->IsExist(id);//接受返回值
		if (index != -1)//说明职工存在,并且要删除掉index位置上的职工
		{
			//利用数据前移来删除元素
			for (int i = index; i < this->m_EmpNum - 1; i++)
			{
				this->m_EmpArray[i] = this->m_EmpArray[i + 1];//赋值
			}
			this->m_EmpNum--;//更新数组中记录人员

			this->save();//重要点!!!!删除后 数据同步到文件中
			cout << "删除成功!" << endl;

		}
		else
		{
			cout << "删除失败,未找到该职工" << endl;
		}
		//清屏
		system("pause");
		system("cls");

	}
}
//判断职工是否存在,如果存在返回职工所在数组中的位置,不存在返回-1
int  WorkerManager::IsExist(int id)
{
	int index = -1;
	for (int i = 0; i < this->m_EmpNum; i++)
	{
		if (this->m_EmpArray[i]->m_Id == id)
		{
			//找到职工
			index = i;
			break;
		}
	}
	return index;//返回值
}

//4------------------修改职工
void WorkerManager::Mod_Emp()
{
	if (this->m_FileIsEmpty)//文件不存在
	{
		cout << "文件不存在或者记录为空!" << endl;
	}
	else//文件存在
	{
		cout << "请输入修改职工的编号:" << endl;
		int id;
		cin >> id;
		int ret = this->IsExist(id);//反馈搜索结果
		if (ret != -1)
		{
			//查找到编号的职工
			delete this->m_EmpArray[ret];//释放原来的数据
			int newId = 0;//设置新的信息
			string newName = "";
			int dSelect = 0;
			cout << "查到:" << id << "号职工,请输入新职工号:" << endl;
			cin >> newId;
			cout << "请输入新姓名:" << endl;
			cin >> newName;
			cout << "请输入岗位:" << endl;
			cout << "1-普通员工" << endl;
			cout << "2-经理" << endl;
			cout << "3-老板" << endl;
			cin >> dSelect;
			worker* worker = NULL;
			switch (dSelect)//利用分支结构来实现修改的功能
			{
			case 1://普通员工
				worker = new Employee(newId, newName, dSelect);
				break;
			case 2://经理
				worker = new Manager(newId, newName, dSelect);
				break;
			case 3://老板
				worker = new Boss(newId, newName, dSelect);
				break;
			default:
				break;
			}
			//更新数据到数组中
			this->m_EmpArray[ret] = worker;
			cout << "修改成功!"  << endl;  
			//保存到文件中
			this->save();
		}
		else
		{
			cout << "修改失败,查无此人!" << endl;
		}
	}
	system("pause");
	system("cls");

}

//5------------------查找员工
void WorkerManager :: Find_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件为空或记录不存在!" << endl;
	}
	else
	{
		cout << "请输入查找方式:" << endl;
		cout << "1、按照职工编号查找" << endl;
		cout << "2、按照姓名查找" << endl;
		int select = 0;
		cin >> select;
		if (select == 1)//按职工号查找
		{
			int id;
			cout << "请输入查找的职工编号:" << endl;
			cin >> id;
			int ret = IsExist(id);
			if (ret != -1)
			{
				cout << "查找成功,该职工信息如下:" << endl;
				this->m_EmpArray[ret]->showInfo();//调用的是之前写的函数
			}
			else
			{
				cout << "查找失败,查无此人" << endl;
			}
		}
		else if (select == 2)//按姓名查找
		{
			string name;//接收姓名
			cout << "请输入查找姓名:" << endl;
			cin >> name;
			bool flag = false;//查找到的标志,默认没有找到职工
			for (int i = 0; i < m_EmpNum; i++)
			{
				if (m_EmpArray[i]->m_Name == name)
				{
					if (m_EmpArray[i]->m_Name == name)
					{
						cout << "查找成功。职工编号为:" << m_EmpArray[i]->m_Id << "号的信息如下:" << endl;
						flag = true;//找到为ture
						//调用显示信息接口
						this->m_EmpArray[i]->showInfo();
					}
				}
				if (flag == false)
				{
					//查无此人
					cout << "查找失败,查无此人!" << endl;
				}
			}
		}
		else
		{
			cout << "输入选项有误!" << endl;
		}
	}
	system("pause");
	system("cls");

}

//6------------------按照编号排序
void WorkerManager::Sort_Emp()
{
	if (this->m_FileIsEmpty)
	{
		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 <m_EmpNum; i++)
		{
			int minOrMax = i;//声明最小值或者最大值的下标
			for (int j = i + 1; j <this->m_EmpNum; j++)//二次循环
			{
				if (select == 1)//升序
					{
					if (this->m_EmpArray[minOrMax]->m_Id >this-> m_EmpArray[j]->m_Id)
					{
						minOrMax = j;//更新下标
					}
				}
				else//降序
				{
					if (this->m_EmpArray[minOrMax]->m_Id <this->m_EmpArray[j]->m_Id)
						{
							minOrMax = j;
						}
					}
				}
				//判断一开始认定的最大值或者最小值是不是计算的最大值或者最小值,如果不是交换数据
			if (i != minOrMax)
			{
					//交换元素
					worker* temp =this->m_EmpArray[i];
					m_EmpArray[i] =this->m_EmpArray[minOrMax];
					m_EmpArray[minOrMax] = temp;
				}
			}
			cout << "排序成功,排序结果为:" << endl;
			this->save();//排序后结果保存到文件里
			this->Show_Emp();//展示所有的职工,这部分在上面的Show_Emp函数中已经写过清屏操作,这里不需要再写
		}
}

//7------------------清空文件
void WorkerManager::Clean_File()
{
	cout << "确认清空?" << endl;
	cout << "1-是" << endl;
	cout << "2-否" << endl;
	int select = 0;
	cin >> select;
	if (select == 1)
	{
		//清空文件
		ofstream ofs(FILENAME, ios::trunc);	//打开模式ios::trunc,如果文件存在,删除文件并重新创建
		ofs.close();
		if (this->m_EmpArray != NULL)
		{
			//删除堆区的每个职工对象
			for (int i = 0; i < this->m_EmpNum; i++)//释放堆区的数据
			{
				this->m_EmpArray[i] == NULL;
				delete this->m_EmpArray[i];
			}
			//删除堆区数组指针
			this->m_EmpNum = 0;
			delete[] this->m_EmpArray;
			this->m_EmpArray = NULL;
			this->m_FileIsEmpty = true;
		}
		cout << "清空成功!" << endl;
	}

	system("pause");
	system("cls");
}

WorkerManager::~WorkerManager()//析构函数来释放堆砌的数据,也可以不写等程序结束后释放
{
	if (this->m_EmpArray != NULL)//将内部维护的每个数据进行释放,再把堆区的数组进行释放
	{
		for (int i = 0; i < this->m_EmpNum; i++)
		{
			if (this->m_EmpArray[i] != NULL)
			{
				delete this->m_EmpArray;
			}
		}
		delete[]this->m_EmpArray;
		this->m_EmpArray = NULL;
	}
}

三、演示效果


四、项目注意点:

  • 不要盲目信任自动排版功能,虽然好用但是有些时候不太行;
  • 要注意项目结构的划分;

五、一点点感悟:

虽然跟着视频写的,但是还是写了很久,一个项目的完成真的很不容易,完结撒花!!!

在测试过程中,发现项目还有许多漏洞,后期有能力再更新,嘿嘿!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑马程序员----职工管理系统(c++) 的相关文章

随机推荐

  • 冒泡排序(C++)完整代码

    算法学习 本人机械科研dog一枚 对算法感兴趣 这是我自学算法的记录 第一天 冒泡排序 文章目录 算法学习 一 冒泡排序原理 二 核心代码 三 算法复杂度分析 一 冒泡排序原理 1 从后往前依次比较相邻的元素 若是要按照升序排序 则后面的元
  • 中科院jcr分区2020_中科院SCI期刊分区(又称JCR期刊分区)知多少

    SCI期刊常用的评价指标是IF 考虑到IF指标是洋指标 中国科研工作者进一步根据国情设立了中科院JCR期刊分区表来对期刊的管理进行补充 中科院期刊分区其实就是把所有的期刊按照一定指标划分为四个层次 类似 优 良 及格 等 最开始 这个分区只
  • 以太网眼图测试整改案例分析

    故障现象 以太网眼图测试中 出现不通过现象 结果如下 由上可知 主要是眼图模板下方不能通过 更换不同的PHY芯片 结果依旧 故障分析 眼图测试 其测试内容为MAC芯片 经过变压器到网口之间的原理设计 PCB布局及走线 故障电路设计如下 PC
  • 机器学习之线性回归:OLS 无偏估计及相关性python分析

    戳上面的蓝字关注我们 作者 alg flody 编辑 Emily 0 回顾 在最近的推送中 先后总结了最小二乘法的原理 两个求解方法 直接法和梯度下降 最后利用这两种思路进行了python实战 在用直接法求出权重参数时 有一个假设是某个矩阵
  • 用BF写一个根据位置值实现指针自增的代码

    BF代码 根据位置值实现指针自增 BrainFuck 实现指针会根据目前位置存储的值来自增 比如 4 8 则指针会移动到 12 即 4 8 目前位置 n 的前3个位置 n 1 n 2 n 3 需要为0以便转移数据 代码 gt lt lt l
  • vue平滑滚动到指定位置

    需求 锚点导航问题 点击导航跳到对应的模块 两种方式 1 滚动盒子滚动到指定高度 scrollTo offsetTop每个模块顶部距离可滚动盒子的顶部偏移的像素值 goAnthor selector const height documen
  • windows中如何将已安装的nodejs高版本降级为低版本

    第一步 先清空本地安装的node js版本 1 按健win R弹出窗口 键盘输入cmd 然后敲回车 或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出 输入cmd再点击回车键 然后进入命令控制行窗口 并输入where node查看之前本地
  • 关于两重viewpager+fragment,再重回第二个viewpager消失问题

    问题 第一次进入第二个viewpager中时没有问题 当第二次次进入第二个viewpager中时 viewpager显示空白 解析 1 在第二个fragment中设置viewpager的适配器时 调用了 ViewPagerAdapter n
  • 大数据导论三——大数据技术

    大数据技术层面及其功能 数据采集和预处理 功能 利用ETL工具将分布的数据 抽取到临时中间层后进行处理 最后加载到数据仓库中 成为联机分析处理 数据挖掘的基础 利用日志采集工具把实时采集的数据作为流计算的输入 进行实时处理分析 利用网页爬虫
  • ruoyi-vue整合tdengine多数据源

    ruoyi vue整合tdengine多数据源 实现方式一 在application druid yml配置从库数据源 多数据源使用 注意事项 实现方式二 在application druid yml配置从库数据源 添加TDengineCo
  • 旋转链表(图解说明)

    Leetcode题目描述 题目链接 旋转链表 题目很简洁 就是移动节点 但其中有隐含的意思 要将链表的每个节点向右移动 使每个节点在新的位置 由于尾结点后面没有了节点 要移动就要形成环 所有的节点在环里面转 移动完后又把环断开 形成新的链表
  • Linux -- 线程(一)

    线程 一 线程概念 Linux内核线程实现原理 线程共享资源 线程非共享资源 线程的优点 线程的缺点 创建一个线程 线程的退出 线程退出的注意事项 线程的回收 多线程练习 杀死线程 取消点 线程分离 线程属性 线程属性 分离态 Native
  • C++简单人机交互——走迷宫

    一个简单的小方块走迷宫程序 include
  • webpack 配置介绍

    一 webpack webpack 仅是一个打包工具 不会处理打包过程的东西例如 es6等新特性 如果需要处理这些新特性需要配置单独的加载bebblle loader 等 devDependencies webpack 5 76 3 打包工
  • Android攻城狮—全套必备神级工具(开发,插件,效率)

    http www jianshu com p 0911efbf8009
  • Centos6.4 用rpm方式安装MySql5.6

    1 查看系统是否安装了MySQL 使用命令 rpm qa grep mysql 2 卸载已安装的MySQL 卸载mysql命令如下 rpm e nodeps mysql libs 5 1 61 4 el6 x86 64 要将 var lib
  • 第14.15节 爬虫实战1:使用Python和selenium实现csdn博文点赞

    写在前面 本文仅供参考学习 请勿用作它途 禁止转载 在开始学爬虫时 学习了csdn博客专家 id 明天依旧可好 柯尊柏 实战项目二 实现CSDN自动点赞 的文章 文章介绍了通过Python和selenium模块实现csdn指定文章点赞的过程
  • argis sde 服务连接,arcgis9.3版本场合,arcgis10.2采用直接连接数据库

    1 arc gis 9 3 sde 需要创建 服务 即需要安装arcsde 2 台 或者 多台 机器通过服务连接 2 通过服务连接数据服务
  • JMeter websocket接口测试

    前言 在一个网站中 很多数据需要即时更新 比如期货交易类的用户资产 在以前 这种功能的实现一般使用http轮询 即客户端用定时任务每隔一段时间向服务器发送查询请求来获取最新值 这种方式的弊端显而易见 有可能造成数据更新不及时 如果前端轮询频
  • 黑马程序员----职工管理系统(c++)

    目录 一 项目概要 二 代码 三 演示效果 四 项目注意点 五 一点点感悟 一 项目概要 1 面向角色 普通员工 经理和老板 2 主要功能 增加员工信息 显示员工信息 删除离职员工信息 修改员工信息 查找员工信息 按照编号排序 清空所有文档