1.项目概述:
1.1项目背景:
人力资源管理系统(HRMS)是一种集成了多种功能的软件系统,其目的在于辅助企业高效地管理人力资源相关的数据和流程。随着企业规模的扩大和市场竞争的激烈,传统的人力资源管理方式已经无法满足现代企业的需求。HRMS应运而生,它不仅能够处理员工信息、薪资管理、考勤管理等基础功能,还能进行绩效评估、培训管理、福利发放等高级功能,甚至支持数据分析和决策支持,成为企业战略规划的重要工具。
1.2项目概述:
本项目旨在开发一个一个综合的人力资源管理系统,以帮助组织有效地管理和优化人力资源。本项目的核心功能有一个综合的人力资源管理系统,以帮助组织有效地管理和优化人力资源。本项目允许添加、删除、查找、修改和显示员工信息,包括薪资、考勤和绩效。这些功能模块相互集成,通过自动化和标准化人力资源管理流程,提高效率和准确性,降低人力成本,实现人力资源的战略目标。人力资源管理系统对企业具有显著的应用价值,它可以降低管理成本、提高工作效率、协助决策制定、优化人才配置,最终帮助企业在激烈的市场竞争中取得优势。人力资源管理系统是现代企业管理的重要组成部分,它不仅提升了员工管理的效率,而且有助于企业建立起一个积极向上、充满活力的工作环境,激发员工的潜能,促进企业的整体发展。
2.项目流程图:
3.项目函数关系调用图:
4.相关函数概述
插入元素函数:insertHash
程序功能 | 将item中的数据存储到pHash中 |
性能要求 | 无 |
限制条件 | 仅限管理人员 |
输入 | 1.参数1:hash表的首地址 |
2.参数2:你要插入的数据 | |
输出 | 成功返回“OK”;失败则显示“对应错误”。 |
算法逻辑 | 1.入参判断 |
2.创建节点并存储数据,将新的节点插入链表中 | |
相关对象及 接 口 | int insertHash(pHash,item) |
备注 | 无 |
删除元素函数:deleteStaffMessage
程序功能 | 插入元素函数 |
性能要求 | 无 |
限制条件 | 仅限管理人员 |
输入 | 1.需要插入元素的表:pHash |
2.需要插入的元素:id | |
输出 | 成功返回“OK”;失败则显示“相应错误”。 |
算法逻辑 | 1.入参判断 |
2.通过id找到删除的位置,修改其状态 | |
相关对象及 接 口 | int deleteStaffMessage(Hash *pHash, int id) |
备注 | 不是链表中的删除,结点还在,只是修改了状态 |
显示元素函数:showHash
程序功能 | 将hash表中的数据打印出来 |
性能要求 | 无 |
限制条件 | 仅限管理人员 |
输入 | 参数:hash表的首地址 |
输出 | 成功返回“OK”;失败则显示“对应错误”。 |
算法逻辑 | 1.入参判断 |
2.遍历hash表 | |
相关对象及 接 口 | int showHash(Hash *pHash) |
备注 | 无 |
查找元素函数:searchStaffMessage
程序功能 | 查找员工信息 |
性能要求 | 无 |
限制条件 | 仅限管理人员 |
输入 | 1.参数1:hash表的首地址 |
2.参数2:要查找的id号 | |
3.参数3:保存要查找的数据 | |
输出 | 成功返回“OK”;失败则显示“对应错误”。 |
算法逻辑 | 1.入参判断 |
2.定义指针变量指向首结点 | |
相关对象及 接 口 | int searchStaffMessage(Hash *pHash,int id,data_type *pData) |
备注 | 无 |
修改元素函数:AlterStaffMessage
程序功能 | 修改员工信息 |
性能要求 | 无 |
限制条件 | 仅限管理人员 |
输入 | 1.参数1:hash表的首地址 |
2.参数2:修改的信息 | |
输出 | 成功返回“OK”;失败则显示“对应错误”。 |
算法逻辑 | 1.入参判断 |
2.通过id找到要修改的位置,并进行修改 | |
相关对象及 接 口 | int AlterStaffMessage(Hash *pHash,data_type NewData) |
备注 | 无 |
5.具体代码
5.1 头文件:
#ifndef _HEAD_H
#define _HEAD_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 50
//定义数据元素的类型
typedef struct staff
{
//姓名
char name[30];
//工号
int id;
//绩效
int per;
//薪水
int salary;
//考勤
int att[20];
//状态
char status[20];
}data_type;
//定义链表结点的数据类型
typedef struct linkNode
{
data_type data;//数据域
struct linkNode *pNext;//指针域
}Link;
//定义hash表的数据类型
typedef struct hash
{
Link *pArr[SIZE];//长度为SIZE的元素的首地址,每个元素的类型都是int **
int count;//统计员工的数量
int lastId;//最后一个员工的id号
}Hash;
enum res
{
HASHNULL,
MALLOCERROR,
ERROR,
POSERROR,
OK
};
//创建一个Hash表
//参数:void
//返回值:成功返回hash表的首地址,失败返回NULL
Hash *createHash(void);
//创建hash函数
int hashFun(int key);
//向hash表中插入元素
//参数1:hash表的首地址
//参数2:你要插入的数据
//返回值:成功返回OK,失败返回失败原因
int insertHash(Hash *pHash,data_type item);
//显示
//参数1:hash表的首地址
//返回值:成功返回OK,失败返回失败原因
int showHash(Hash *pHash);
//删除员工信息
//参数1:hash表的首地址
//参数2:要删除的ID
//返回值:成功返回OK,失败返回失败原因
int deleteStaffMessage(Hash *pHash,int id);
//查找员工信息
//参数1:hash表的首地址
//参数2:要查找的id号
//参数3:保存要修改的结构体的信息
int searchStaffMessage(Hash *pHash,int id,data_type *pData);
//修改员工的信息
//参数1:hash表的首地址
//参数2:修改的信息
//返回值:成功返回OK,失败返回失败原因
int AlterStaffMessage(Hash *pHash,data_type NewData);
#endif
5.2 相关子函数:
#include "../include/head.h"
//创建hash表
//参数:void
//返回值:成功返回hash表的首地址,失败返回NULL
Hash *createHash(void)
{
Hash *pHash = NULL;
pHash = (Hash *)malloc(sizeof(Hash));
if(NULL == pHash)
{
return NULL;
}
memset(pHash, 0, sizeof(Hash));
return pHash;
}
int hashFun(int key)
{
return key-1;
}
//向hash表中插入元素
//参数1:hash表的首地址
//参数2:你要插入的数据
//返回值:成功返回OK,失败返回失败原因
int insertHash(Hash *pHash,data_type item)
{
//1.入参判断
if(NULL == pHash)
{
return HASHNULL;
}
//2.通过hash获得存储下标
int index = hashFun(item.id);
//3.创建一个新结点
Link *pNew = (Link *)malloc(sizeof(Link));
if(NULL == pNew)
{
return MALLOCERROR;
}
memset(pNew, 0, sizeof(pNew));
pNew->data = item;
//4. 保护插入结点后的所有结点
pNew->pNext = pHash->pArr[index];
//5.将新结点插入
pHash->pArr[index] = pNew;
//6.count++
pHash->count++;
return OK;
}
//显示
//参数:hash表的首地址
//返回值:成功返回OK,失败返回失败原因
int showHash(Hash *pHash)
{
//1.入参判断
if(NULL == pHash)
{
return HASHNULL;
}
//2.遍历
int i;
Link *pTmp = NULL;
for(i=0;i<pHash->lastId;i++)
{
pTmp = pHash->pArr[i];
while(NULL != pTmp)
{
printf("------------------------------------\n");
printf("姓名:%s\n",pTmp->data.name);
printf("工号:%d\n",pTmp->data.id);
printf("绩效:%d\n",pTmp->data.per);
printf("薪资:%d\n",pTmp->data.salary);
printf("考勤:%s\n",pTmp->data.att);
printf("状态:%s\n",pTmp->data.status);
printf("------------------------------------\n");
pTmp = pTmp->pNext;
}
}
}
//删除员工信息
int deleteStaffMessage(Hash *pHash, int id)
{
//入参判断
if(NULL == pHash)
{
return HASHNULL;
}
//判断id是否正确
if(id < 0 || id > pHash->lastId)
{
return POSERROR;
}
//通过hash函数获得存储数据的下标
int pos = hashFun(id);
//定义一个指针,指向链表的首结点
Link *pHead = pHash->pArr[pos];
if(NULL == pHead)
{
return POSERROR;
}
//不是链表中的删除,结点还在,只是修改了状态
while(pHead != NULL)
{
if(id == pHead->data.id)
{
//离职(修该员工的状态)
pHash->count--;
strcpy(pHead->data.status,"已离职");
break;
}
pHead = pHead->pNext;
}
return OK;
}
//查找某个员工信息
//参数1:hash表的首地址
//参数2:要查找的id号
//参数3:保存要查找的数据
int searchStaffMessage(Hash *pHash,int id,data_type *pData)
{
//1.入参判断
if(NULL == pHash)
{
return HASHNULL;
}
//2.判断id是否正确
if(id < 0 || id > pHash->lastId)
{
return POSERROR;
}
//3.通过hash函数获得存储下标
int pos = hashFun(id);
//4.定义指针变量指向首结点
Link *pHead = pHash->pArr[pos];
if(NULL == pHead)
{
return POSERROR;
}
while(pHead != NULL)
{
if(id == pHead->data.id)
{
if(NULL == pData)
{
//显示ID对应的员工信息
printf("姓名:%s\n",pHead->data.name);
printf("工号:%d\n",pHead->data.id);
printf("绩效:%d\n",pHead->data.per);
printf("薪资:%d\n",pHead->data.salary);
printf("考勤:%s\n",pHead->data.att);
printf("状态:%s\n",pHead->data.status);
}
else
{
*pData = pHead->data;
}
}
pHead = pHead->pNext;
}
return OK;
}
//修改员工信息
//参数1:hash表的首地址
//参数2:修改的信息
//返回值:成功返回OK,失败返回失败原因
int AlterStaffMessage(Hash *pHash,data_type NewData)
{
if(NULL == pHash)
{
return HASHNULL;
}
//通过hash函数获得下标
int pos = hashFun(NewData.id);
Link *pHead = pHash->pArr[pos];
if(pHead == NULL)
{
return POSERROR;
}
while(pHead != NULL)
{
if(NewData.id == pHead->data.id)
{
pHead->data = NewData;
}
pHead = pHead->pNext;
}
return OK;
}
int destroyHash(Hash **pHash)
{
if(NULL == *pHash)
{
return HASHNULL;
}
//先释放Hash表中各个位置的单项链表,在释放hash表
int i;
Link *pHead = NULL;
Link *pDel = NULL;
for(i = 0; i < (*pHash)->lastId; i++)
{
pHead = (*pHash)->pArr[i];
while(NULL != pHead)
{
//头删法
pDel = pHead;
pHead = pHead->pNext;
free(pDel);
pDel = NULL;
}
}
free(*pHash);
*pHash = NULL;
return OK;
}
5.3 主函数:
#include "../include/head.h"
int main(void)
{
int op;
int id;
data_type item;
Hash *pHash = createHash();
//当hash表创建成功之后,自动导入文件中的信息至hash表中
data_type messageData;
data_type staffData;
int fr = open("Message.txt",O_RDONLY);
if(fr < 0)
{
perror("open error");
}
else
{
printf("打开保存员工信息系统成功!\n");
//导入信息
while(1)
{
int rd_count = read(fr,&messageData,sizeof(data_type));
if(0 == rd_count)
{
printf("导入信息完毕!\n");
break;
}
else if(rd_count < 0)
{
perror("导入失败!\n");
return ERROR;
}
else
{
//将读到的员工信息添加的hash表中
insertHash(pHash,messageData);
//lastId自增一个
pHash->lastId++;
}
}
close(fr);
}
while(1)
{
//菜单
printf("请输入选项:\n");
printf("------------员工管理系统----------------\n");
printf("1-----------------------------------添加\n");
printf("2-----------------------------------删除\n");
printf("3-----------------------------------查找\n");
printf("4-----------------------------------修改\n");
printf("5-----------------------------------显示\n");
printf("-1----------------------------------退出\n");
scanf("%d",&op);
if(-1 == op) break;
switch(op)
{
case 1:
printf("请输入新员工的名字:\n");
scanf("%s",item.name);
item.id = pHash->lastId + 1;
pHash->lastId++;
printf("请输入新员工的绩效:\n");
scanf("%d",&item.per);
printf("请输入员工的薪资:\n");
scanf("%d",&item.salary);
printf("请输入员工的考勤情况:\n");
scanf("%s",item.att);
printf("请输入员工的状态:\n");
scanf("%s",item.status);
insertHash(pHash,item);
break;
case 2:
printf("请输入要删除的员工的id号:\n");
scanf("%d",&id);
deleteStaffMessage(pHash,id);
break;
case 3:
printf("请输入要查找的员工的id号:\n");
scanf("%d",&id);
searchStaffMessage(pHash,id,NULL);
break;
case 4:
printf("请输入要修改的员工的id:\n");
scanf("%d",&id);
searchStaffMessage(pHash,id,&staffData);
printf("新的绩效:\n");
scanf("%d",&staffData.per);
printf("请定薪:\n");
scanf("%d",&staffData.salary);
AlterStaffMessage(pHash,staffData);
case 5:
showHash(pHash);
break;
defult:
printf("输入错误,请重新输入:\n");
}
}
//更新员工信息至Message.txt文件中
int fw = open("Message.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);
if(fw < 0)
{
perror("open error");
}
else
{
int i;
for(i=0; i < pHash->lastId; i++)
{
Link *pTmp = pHash->pArr[i];
while(NULL != pTmp)
{
//写入
int wr_count = write(fw, &pTmp->data,sizeof(data_type));
if(0 == wr_count)
{
printf("什么也没写!\n");
break;
}
else if(wr_count < 0)
{
perror("写入失败\n");
break;
}
pTmp = pTmp->pNext;
}
}
}
printf("%p\n",pHash);
destroyHash(&pHash);
printf("%p\n",pHash);
close(fw);
printf("更新员工信息成功!\n");
return 0;
}