人力资源管理系统

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值