一、项目概述
1.项目背景
在现代企业中,人力资源管理是确保业务顺利运作和实现战略目标的关键。然而,传统的人力资源管理方式往往依赖于纸质记录或不集成的电子表格,这导致信息难以检索、更新和共享。在当今快速发展的商业环境中,企业需要一个高效且可靠的系统来管理员工信息、薪资、考勤和绩效,以提高管理效率并支持决策。
2.项目概述
本项目旨在设计和实现一个人力资源管理系统(HRMS),以帮助企业更有效地管理其人力资源。该系统将采用哈希链表来加速员工信息的查询,并提供功能丰富的界面,用于处理员工信息、薪资管理、考勤记录和绩效管理。系统将具备以下特征:
1.使用哈希链表实现查询:系统将采用哈希链表的数据结构来存储和查询员工信息,以确保快速、高效的数据检索
2.数据持久化:系统将支持数据的本地保存与读取,以确保员工数据的持久性和可恢复性。
3.数据操作:系统将提供一系列操作功能,包括查询、添加、删除和修改员工信息,满足不同的管理需求。
4.员工信息管理:包括员工的个人信息、薪资、职位等。
本项目的目标是通过提供全面且易用的功能,帮助企业更有效地管理其人力资源,提升工作效率,增强员工满意度,并为企业的持续发展提供坚实的基础。
二、项目流程图
三、函数关系调用图
四、代码实现
head.h
/*1.xxxx管理系统的设计与实现
要求:1.要使用哈希链表实现查询;
2.能够将数据保存到本地;
3.能够从本地读取数据;
4.能够对系统进行数据的操作(查询、添加、删除、修改)。
人力资源管理系统(HRMS):处理员工信息、薪资管理、考勤管理、绩效管理等。*/
#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[20]; //姓名
int age; //年龄
int id; //职工号
char sex[5]; //性别
char job[20]; //职位
int salary; //薪资
char status[20]; //状态
struct staff *next; //指向下一个职工信息的指针
}staff;
//定义链表结构体
typedef struct linknood
{
staff data; //数据域
struct linknood *next; //指向下一个职工信息的指针
}Link;
//定义哈希表结构体
typedef struct hash_list
{
Link *arr[SIZE]; //哈希表
int count; //统计员工数量
int lastID; //记录最后一个职工的ID
}hash;
enum res
{
HASH_NULL,
MALLOC_ERROR,
ERROR,
POS_ERROR,
OK
};
//函数声明
void menu(); //菜单
hash *HashCreat(void); //创建哈希表
int Hashfunc(int key); //哈希函数
int insertStaff(hash *pHash, staff item); //添加职工信息
int showStaff(hash *pHash); //显示职工信息
int deleteStaff(hash *pHash, int id); //删除职工信息
int alterStaff(hash *pHash, staff New); //修改职工信息
int searchStaff(hash *pHash, int id, staff *pData); //查询职工信息
int importStaff(hash *pHash); //从文件中导入职工信息
int updateStaff(hash *pHash); //更新职工信息到文件
#endif
创建哈希表、构造哈希函数
creat.c
//创建哈希表
#include "../include/head.h"
hash *HashCreat(void)
{
hash *pHash = (hash *)malloc(sizeof(hash));
if(pHash == NULL) return NULL;
memset(pHash, 0, sizeof(hash));
return pHash;
}
int Hashfunc(int key)
{
return key - 1;
}
添加员工信息
insert.c
//添加员工信息
#include "../include/head.h"
int insertStaff(hash *pHash, staff item)
{
//入参判断
if(pHash == NULL) return HASH_NULL;
int index = Hashfunc(item.id);
Link *pNew = (Link *)malloc(sizeof(Link));
if(pNew == NULL) return MALLOC_ERROR;
memset(pNew, 0, sizeof(Link));
pNew->data = item; //赋值
pNew->next = pHash->arr[index]; //保护后面元素
pHash->arr[index] = pNew; //插入新结点
pHash->count++;
return OK;
}
删除员工信息
delete.c
#include "../include/head.h"
//删除员工信息
int deleteStaff(hash *pHash, int id)
{
//入参判断
if(pHash == NULL) return HASH_NULL;
if(id < 0 || id >pHash->lastID) return POS_ERROR;
int pos = Hashfunc(id); //获得存储数据下标
Link *pHead = pHash->arr[pos];
if(pHead == NULL) return POS_ERROR;
while(pHead != NULL)
{
if(id == pHead->data.id)
{
pHash->count--;
strcpy(pHead->data.status,"离职");
break;
}
pHead = pHead->next;
}
return OK;
}
显示员工信息
show.c
#include "../include/head.h"
//显示员工信息
int showStaff(hash *pHash)
{
if(pHash == NULL) return HASH_NULL;
Link *pTmp = NULL;
for(int i = 0; i < pHash->lastID; i++)
{
pTmp = pHash->arr[i];
while(pTmp != NULL)
{
printf("************************************\n");
printf("姓名:%s\n",pTmp->data.name);
printf("工号:%d\n",pTmp->data.id);
printf("年龄:%d\n",pTmp->data.age);
printf("性别:%s\n",pTmp->data.sex);
printf("职位:%s\n",pTmp->data.job);
printf("薪资:%d\n",pTmp->data.salary);
printf("状态:%s\n",pTmp->data.status);
printf("************************************\n");
pTmp = pTmp->next;
}
}
return OK;
}
修改员工信息
alter.c
#include "../include/head.h"
//修改员工信息
int alterStaff(hash *pHash, staff New)
{
//入参判断
if(pHash == NULL) return HASH_NULL;
int pos = Hashfunc(New.id);
Link *pHead = pHash->arr[pos];
if(pHead == NULL) return POS_ERROR;
while(pHead != NULL)
{
if(New.id == pHead->data.id)
{
pHead->data = New;
}
pHead = pHead->next;
}
return OK;
}
查找员工信息
search.c
#include "../include/head.h"
//查找员工信息
int searchStaff(hash *pHash, int id, staff *pData)
{
//入参判断
if(pHash == NULL) return HASH_NULL;
if(id < 0 || id > pHash->lastID) return POS_ERROR;
int pos = Hashfunc(id);
Link *pHead = pHash->arr[pos];
while(pHead != NULL)
{
if(id == pHead->data.id)
{
if(pData == NULL)
{
printf("************************************\n");
printf("姓名:%s\n",pHead->data.name);
printf("工号:%d\n",pHead->data.id);
printf("年龄:%d\n",pHead->data.age);
printf("性别:%s\n",pHead->data.sex);
printf("职位:%s\n",pHead->data.job);
printf("薪资:%d\n",pHead->data.salary);
printf("状态:%s\n",pHead->data.status);
}
else
{
*pData = pHead->data;
}
}
pHead = pHead->next;
}
return OK;
}
导入员工信息
import.c
#include "../include/head.h"
int importStaff(hash *pHash)
{
staff message;
int fr = open("data.txt", O_RDONLY);
if(fr < 0)
{
perror("open\n");
}
else
{
printf("打开成功!\n");
while(read(fr, &message, sizeof(staff)) > 0)
{
insertStaff(pHash, message);
pHash->lastID++;
}
printf("导入成功!\n");
close(fr);
}
return OK;
}
更新员工信息
update.c
#include"../include/head.h"
int updateStaff(hash *pHash)
{
int fw = open("data.txt", O_RDWR | O_CREAT | O_TRUNC, 0666);
if(fw < 0)
{
printf("打开文件失败!\n");
}
else
{
//更新信息
for(int i = 0; i < pHash->lastID; i++)
{
Link *pTmp = pHash->arr[i];
while(pTmp != NULL)
{
write(fw, &pTmp->data, sizeof(staff));
pTmp = pTmp->next;
}
}
printf("更新成功!\n");
}
close(fw);
return OK;
}
菜单函数
menu.c
//菜单函数
#include"../include/head.h"
void menu()
{
printf("请输入选项:\n");
printf("*************员工管理系统*****************\n");
printf("1---------------添加员工信息-------------------\n");
printf("2---------------显示员工信息-------------------\n");
printf("3---------------删除员工信息-------------------\n");
printf("4---------------修改员工信息-------------------\n");
printf("5---------------查找员工信息-------------------\n");
printf("-1------------------退出----------------------\n");
printf("*************www.hqyj.com****************\n");
}
主函数
main.c
#include"../include/head.h"
int main()
{
int op; //操作
staff item; //员工信息
staff message;//保存文件中读到的员工信息
staff staffdata;//保存查看到的员工信息
int id = 0;
hash *pHash = HashCreat(); //创建哈希表
//导入文件中的信息到哈希表中
importStaff(pHash);
while(1)
{
menu(); //打印菜单
printf("请输入操作:");
scanf("%d", &op);
if(op == -1)
{
break;
}
switch (op)
{
case 1:
printf("请输入员工信息:\n");
printf("姓名:");
scanf("%s", item.name);
item.id = pHash->lastID + 1;
pHash->lastID++;
printf("性别:");
scanf("%s", item.sex);
printf("年龄:");
scanf("%d", &item.age);
printf("职位:");
scanf("%s", item.job);
printf("薪资:");
scanf("%d", &item.salary);
printf("状态:");
scanf("%s", item.status);
insertStaff(pHash, item);
printf("添加成功!\n");
break;
case 2:
showStaff(pHash);
break;
case 3:
printf("请输入要删除的员工ID:");
scanf("%d", &id);
deleteStaff(pHash, id);
printf("删除成功!\n");
break;
case 4:
printf("请输入要修改的员工ID:");
scanf("%d", &id);
searchStaff(pHash, id, &staffdata);
//处理哪些结构体成员
int opt = 0; //修改哪里
printf("请输入要调整的岗位:");
scanf("%s", staffdata.job);
printf("请输入要调整的薪资:");
scanf("%d", &staffdata.salary);
alterStaff(pHash, staffdata);
break;
case 5:
printf("请输入要查找的员工ID:");
scanf("%d", &id);
searchStaff(pHash, id, NULL);
break;
}
}
updateStaff(pHash);
return 0;
}
五、效果展示
互相分享 与君共勉~~~
大家有什么资源也可以互相分享 ,有什么问题也可以互相讨论~~~