当前位置:网站首页>STL案例-招聘新员工
STL案例-招聘新员工
2022-08-02 17:34:00 【所念非欢】
1.需求分析
- 对新招聘员工信息进行录入(测试时员工可以进行随机生成)
- 对员工部门, 职位和工资随机进行分配
- 根据工资,进行降序排列
- 分部门显示员工信息
- 查找员工信息
- 员工在部门中有不同的职位,要求如下:
- 部门经理只能有一名
- 部门副经理两名
- 三种职位工资只能是降序
- 部门员工若干
2.使用头文件
- string
- map
- vector:
- set
- multiset
3.自定义类
3.1 Worker类
Worker.h
#pragma once
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
class Worker
{
public:
string name; // 姓名
int age; // 年龄
int depart_no; // 部门编号
int post_no; // 职位编号
double salary; // 工资
Worker(string name, int age); // 员工信息录入
void allocation(map<int, vector<int>>& Count); // 分配部门,职位和工资
};
Worker.cpp
#include "Worker.h"
#include <map>
#include <vector>
Worker::Worker(string name, int age)
{
this->name = name;
this->age = age;
}
void Worker::allocation(map<int, vector<int>>& Count)
{
this->depart_no = rand() % 4 + 1; // 随机部门
this->post_no = (rand() % 3 + 1) * 11; // 随机职位
// 对人数的存储结构是在vector容器的职位编号/11-1的位置存储人数个数
int pos = this->post_no / 11 - 1; // 确定人数存储位置
// 判断人数是否超过限定值
while (Count.at(this->depart_no).at(pos) == (pos + 1)) // 人数限制 = 存储位置 + 1,根据这个关系判断是否超出人员限制
{
if (pos == 2) // 如果是普通员工,则没有人数限制,跳出循环
{
break;
}
this->post_no += 11; // 职位编号增加一个等级
++pos; // 存储位置后移
}
++Count[this->depart_no][pos]; // 确定存储位置后人数加一
this->salary = rand() % 10 * 100 + 5000 - this->post_no * 100; // 随机工资
}
3.2 myCompare类(伪函数)
myCompare.h
#pragma once
#include "Worker.h"
class myCompare
{
public:
bool operator()(Worker w1, Worker w2)const;
};
myCompare.cpp
#include "myCompare.h"
bool myCompare::operator()(Worker w1, Worker w2)const
{
return w1.salary > w2.salary;
}
4.实现代码
main.cpp
#include "Worker.h"
#include "myCompare.h"
#include <map>
#include <set>
#include <vector>
map<int, string> depart_mp; // 部门编号和名称对应关系
map<int, string> post_mp; // 职位编号和名称对应关系
// 声明部门列表
multiset<Worker, myCompare> workList_PartA;
multiset<Worker, myCompare> workList_PartB;
multiset<Worker, myCompare> workList_PartC;
multiset<Worker, myCompare> workList_PartD;
// 定义工人列表
multiset<Worker, myCompare> WorkerInfo[4] = {
workList_PartA, workList_PartB, workList_PartC, workList_PartD};
// 分职位统计部门人数
vector<int> Part_A;
vector<int> Part_B;
vector<int> Part_C;
vector<int> Part_D;
// 部门编号和部门人数的对应关系
map<int, vector<int>> Count;
// 初始化部门对应关系
void Init_Department()
{
depart_mp.insert(make_pair(1, "部门A"));
depart_mp.insert(make_pair(2, "部门B"));
depart_mp.insert(make_pair(3, "部门C"));
depart_mp.insert(make_pair(4, "部门D"));
}
// 初始化职位对应关系
void Init_PostList()
{
post_mp.insert(make_pair(11, "经理"));
post_mp.insert(make_pair(22, "副经理"));
post_mp.insert(make_pair(33, "员工"));
}
// 初始化部门人数列表
void Init_Count()
{
for (int i = 0; i < 3; ++i)
{
Part_A.push_back(0);
Part_B.push_back(0);
Part_C.push_back(0);
Part_D.push_back(0);
}
Count.insert(make_pair(1, Part_A));
Count.insert(make_pair(2, Part_B));
Count.insert(make_pair(3, Part_C));
Count.insert(make_pair(4, Part_D));
}
// 初始化的总函数
void init() // 初始化
{
Init_Department();
Init_PostList();
Init_Count();
}
// 输入工人信息
void inputInfo()
{
int num;
cout << "输入招聘人数:";
cin >> num;
string name;
char nameSeed = 'A';
for (int i = 0; i < num; ++i)
{
name = "工人";
name += nameSeed + i;
Worker temp(name, rand() % 11 + 18);
temp.allocation(Count);
WorkerInfo[temp.depart_no - 1].insert(temp);
}
}
// 重载左移运算符,实现自定义数据类型Worker的cout
ostream& operator<<(ostream& cout, Worker worker)
{
cout << "\t员工姓名:" << worker.name << " 年龄:" << worker.age << " 职位:" << depart_mp[worker.depart_no] << post_mp[worker.post_no] << " 工资:" << worker.salary;
return cout;
}
// 输出所有工人信息
void PrintInfo()
{
for (int i = 0; i < 4; ++i)
{
for (multiset<Worker, myCompare>::iterator it = WorkerInfo[i].begin(); it != WorkerInfo[i].end(); ++it)
{
cout << *it << endl;
}
cout << "========================================================================" << endl;
}
}
// 实现对输入姓名的工人信息的查找
void findWorker()
{
string name;
cout << "请输入员工姓名:";
cin >> name;
bool flag = false;
for (int i = 0; i < 4; ++i)
{
for (multiset<Worker, myCompare>::iterator it = WorkerInfo[i].begin(); it != WorkerInfo[i].end(); ++it)
{
if (name == (*it).name)
{
cout << (*it) << endl;
flag = true;
break;
}
}
if (flag)
{
break;
}
}
if (flag)
{
cout << "查找成功!" << endl;
}
else
{
cout << "查找失败!" << endl;
}
}
int main()
{
// 功能函数的调用
init();
inputInfo();
PrintInfo();
findWorker();
system("pause");
return 0;
}
边栏推荐
- MySQL表的约束
- 解决多版本jar包冲突问题
- Informatica旗下PowerCenter的元数据库解析
- Since September, China has granted zero-tariff treatment to 98% of tax items from 16 countries including Togo
- 再获权威认证!马上消费安逸花APP通过中国信通院“金融APP人脸识别安全能力评测”
- 我用这一招让团队的开发效率提升了 100%!
- 小程序毕设作品之微信体育馆预约小程序毕业设计成品(8)毕业设计论文模板
- Red and blue against experience sharing: CS from kill posture
- Kubernetes:(五)Pod进阶(资源限制、健康检查)
- 字节面试官狂问我:你没有高并发、性能调优经验,为什么录取你?
猜你喜欢
默认参数的代码实现及日期的注入与显示
字节面试官狂问我:你没有高并发、性能调优经验,为什么录取你?
Red and blue against experience sharing: CS from kill posture
织梦自定义表单添加全选和全不选功能按钮
红队实战靶场ATT&CK(一)
Smart Contract Security - delegatecall (1)
The days of patching are more difficult than the days of writing code
潮玩的“第二春”,在哪?
深圳地铁16号线二期进入盾构施工阶段,首台盾构机顺利始发
牛津硕士进碳圈,高瓴红杉经纬一起投了
随机推荐
Redis的使用--集群模式
golang源码阅读(11)GO中各个目录的功能
Several common cross-domain solutions
MySQL基本语法
「全球数字经济大会」登陆 N 世界,融云提供通信云服务支持
redis总结_基础
我用这一招让团队的开发效率提升了 100%!
Simulink脚本自动创建Autosar Parameter Port及Mapping
Pytest study notes
2022最新版SSM源码分析:一套教程助你深入理解底层原理,提高核心竞争力!
Security First: Tools You Need to Know to Implement DevSecOps Best Practices
golang源码分析(13)gorpc源码分析
golang 计算器实现
erp系统和wms系统有什么区别
NAACL 2022 | 具有元重加权的鲁棒自增强命名实体识别技术
二舅“反转”了?
Navicat premium download and install 15 detailed tutorial
0725-面试记录
Mysql和Redis如何保证数据一致性
golang源码分析(7):chan