C++人事管理系统

news2024/9/21 14:45:41

一、设计目的

企业员工管理系统主要是针对企业员工的基本信息进行增、删、改、查的相关操作,以便用户使用本管理系统时可以快速对企业员工的信息进行管理。

二、设计内容

1.用户首次使用本系统时进行密码设置和初始化操作。
2.实现添加功能,即添加员工的相关信息。
3.实现查看功能,即显示系统中所有员工的相关信息。
4.实现查找功能,即可以通过多种条件对员工进行查询,如姓名、工号等。
5.实现修改功能,即输入员工的姓名修改其相关信息。
6.实现删除功能,即输入员工的姓名删除其相关信息。
7.实现统计员工人数的功能。
8.实现重新设置密码登录密码的功能。
9.退出系统。

三、概要设计

1.功能模块图:

在这里插入图片描述

2.各个模块详细的功能描述。

(1).首次登陆用户信息初始化功能模块:当用户时首次使用本系统时,则需要根据提示进行设置密码和初始化的操作。
(2).输入员工信息功能模块:实现将用户从键盘输入的数据存储到对应字段或数据成员中,并检查输入的合法性。
(3).显示员工信息功能模块:用户根据提示操作显示系统中已有的员工的相关信息,如果系统中海没有存储员工信息则给出无法显示信息的提示。
(4).查询员工信息功能模块:根据用户输入的待查询记录的关键字,在数据结构中查找该记录,如找到则输出该员工的信息,否则给出无法找到的提示信息。
(5).修改员工信息功能模块:根据用户要求,根据提示操作,找到要修改信息的员工然后修改员工的相关信息,如年龄。工资等。
(6).删除员工信息功能模块:由用户输入选择删除相关的员工的信息。
(7).统计员工信息功能模块:统计本系统中员工的信息,如男、女员工的人数等。
(8).重置系统密码功能模块:根据用户的要求,将旧密码更换设置新密码。
(9).退出系统功能模块:在用户执行完相关系统操作之后,退出使用本系统。

四.详细设计

1.功能函数的调用关系图

在这里插入图片描述

2.各功能函数的数据流程图

在这里插入图片描述

3.重点设计及编码

(1)本系统中对是否是第一次使用本系统进行了处理,如果是第一次使用,则需要根据提示信息进行设置密码和初始化操作。其思路是:首先打开密码文件,判断是否为空,进而判断系统是否是第一次使用,如果是,系统会提示输入初始密码,如果不是,系统会进入登陆页面,提示输入登陆密码,代码如下:

void checkfirst()
{
	FILE *fp,*fp1; //声明文件型指针
	char pwd[9],pwd1[9],pwd2[9];
	int i;
	char strt='8';
	if((fp=fopen("employee.txt","rb"))==NULL) 
	{
		printf("\n\t新系统,请进行相应的初始化操作!\n");  //判断系统密码文件是否为空
		bound('_',50);
		getch();
		do
		{
			printf("\n设置密码,请不要超过8位:  ");
			for(i=0;i<8&&((pwd[i]=getch())!=13);i++)
				putch('*');
			printf("\n请再确认一次密码:  ");
			for(i=0;i<8&&(pwd1[i]=getch())!=13;i++)
				putch('*');
			pwd[i]='\0';
			pwd1[i]='\0';
			if(strcmp(pwd,pwd1)!=0)
				printf("\n\n两次密码输入不一致,请重新输入: \n");
			else 
				break;
		}while(1);
		if((fp1=fopen("employee.txt","wb"))==NULL)
		{
			printf("\n系统创建失败,请按任意键退出!\n");
			getch();
			exit(1);
		}
		i=0;
		while(pwd[i])
		{
			pwd2[i]=(pwd[i]^strt);
			putw(pwd2[i],fp1);//将数组元素送入文件流中
			i++;
		}
		fclose(fp1);//关闭文件流
		printf("\n系统初始化成功,请按任意键退出后,再重新进入!\n");
		getch();
		exit(1);
	}
	else 
	{
		i=0;
		while(!feof(fp)&&i<8)//判断是否读完密码文件
			pwd[i++]=getw(fp)^strt;//从文件流中读出字符赋给数组
		pwd[i]='\0';
		if(i>=8)
			i--;
		while(pwd[i]!=-1&&i>=0)
			i--;
		pwd[i]='\0';
		strcpy(password,pwd);
	}
}

(2)自定义函数login()在初始化检测后调用,用于管理员的登录,用户根据提示密码,函数调用strcmp()函数对输入密码和密码文件中的读取数据进行比较,如果一致则进入系统,不一致会提示重新输入,如果3次不一致会强制退出:

void login()//检测登陆密码
{
	int i,n=3;
	char pwd[9];
	do
	{
		printf("\n请输入登陆密码:  ");
		for(i=0;i<8&&((pwd[i]=getch())!=13);i++)
			putch('*');
		pwd[i]='\0';
	    if(strcmp(pwd,password))
		{
	    	printf("\n密码错误,请重新输入!\n");
		    system("cls");//调用清屏命令
		    n--;
		}
	    else 
		   break;
	}while(n>0);
	if(!n)
	{
		printf("密码输入3次错误,请退出!\n");
		getch();
		exit(1);
	}
}

(3)自定义函数addemp()用于添加员工的信息,首先打开存储员工信息的数据文件,系统会提示用户输入相应的员工基本信息,当用户输入完成一个员工的信息后,系统会提示用户是否继续输入员工信息:

void addemp()
{
	FILE *fp;
	EMP *emp1;
	int i=0;
	char choice='y';
	if((fp=fopen("employee.txt","ab"))==NULL)// 追加打开一个二进制文件,并在文件末尾写数据 
	{
		printf("打开文件出错!\n");
		getch();
		exit(1);
	}
	do
	{
		i++;
		emp1=(EMP*)malloc(sizeof(EMP));
		if(emp1==NULL)
		{
			printf("内存分配失败,请按任意键退出!\n");
			getch();
			return;
		}
		printf("\n\t请输入第%d各员工的信息\n",i);
		bound('_',40);
		printf("工号:  ");
		scanf("%d",&emp1->num);
		printf("职务:  ");
		scanf("%s",&emp1->duty);
		printf("姓名:  ");
		scanf("%s",&emp1->name);
		printf("性别:  ");
		scanf("%s",&emp1->sex);
		printf("年龄:  ");
		scanf("%d",&emp1->age);
		printf("文化程度:  ");
		scanf("%s",&emp1->edu);
		printf("工资:  ");
		scanf("%d",&emp1->salary);
		printf("办公电话:  ");
		scanf("%s",&emp1->tel_office);
		printf("家庭电话:  ");
		scanf("%s",&emp1->tel_home);
		printf("手机号码:  ");
		scanf("%s",&emp1->mobile);
		printf("QQ号码:  ");
		scanf("%s",&emp1->qq);
		printf("家庭地址:  ");
		scanf("%s",&emp1->address);
		emp1->next=NULL;
		if(emp_first==NULL)//判断表头指针是否为空
		{
			emp_first=emp1;
			emp_end=emp1;
		}
		else
		{
			emp_end->next=emp1;
			emp_end=emp1;
		}
		fwrite(emp_end,sizeof(EMP),1,fp);//对数据流添加数据项
		gfirst=0;
		printf("\n");
		bound('_',40);
		printf("\n是否继续输入?(y/n)");
		fflush(stdin);//清除缓存区
		choice=getchar();
		if(toupper(choice)!='Y')
		{
			fclose(fp);//关闭文件流
			printf("\n输入完毕,请按任意键返回!\n");
			getchar();
			return;
		}
		system("cls");
	}while(1);
}

(4)自定义函数delemp()实现删除员工的功能。在系统的功能菜单中选择删除信息的操作后,系统就会提示要删除的员工的姓名,输入要删除的员工的姓名后,如果系统从信息链表中找到相关信息后就会将信息显示出来,再次要求用户确定是否要删除,谨防误操作,提高信息的安全性。

void delemp()
{
	int findok=0;
    EMP *emp1,*emp2;
	char name[10],choice;
	system("cls");
	printf("\n请输入要删除的员工的姓名:  ");
	scanf("%s",name);
	emp1=emp_first;
	emp2=emp1;
	while(emp1)
	{
		if(strcmp(emp1->name,name)==0)
		{
			findok=1;
			system("cls");
			printf("\n员工 %s 的信息如下: \n  ",emp1->name);
			bound('_',40);
			printf("工号: %d \n",emp1->num);
		    printf("职务: %s \n",emp1->duty);
		    printf("姓名: %s \n",emp1->name);
		    printf("性别: %s \n",emp1->sex);
		    printf("年龄: %d \n",emp1->age);
	     	printf("文化程度: %s \n",emp1->edu);
		    printf("工资: %d\n",emp1->salary);
		    printf("办公电话: %s \n",emp1->tel_office);
		    printf("家庭电话: %s \n",emp1->tel_home);
		    printf("手机号码: %s \n",emp1->mobile);
		    printf("QQ号码: %s \n",emp1->qq);
		    printf("家庭地址: %s \n",emp1->address);
			bound('_',40);
			printf("\n确定要删除该员工信息?(y/n)  ");
			fflush(stdin);
			choice=getchar();
			if(choice!='y'&&choice!='Y')
				return;
			if(emp1==emp_first)
				emp_first=emp1->next;
			else 
				emp2->next=emp1->next;
			free(emp1);
			gsave=1;
			savedata();//保存数据
			return;
		}
		else
		{
			emp2=emp1;
			emp1=emp1->next;
		}
		if(!findok)
		{
			bound('_',40);
			printf("\n没有找到姓名是: %s 的信息!\n",name);
			getch();
		}
		return;
	}
}

(7)自定义函数resetpwd()用于修改密码。在系统的功能菜单中选择修改的操作选项后,系统会提示输入旧密码,用户咋正确的输入旧密码后,根据提示即可实现密码的修改:

void resetpwd()
{
	char pwd[9],pwd1[9];
	int i;
	FILE *fp1;
	system("cls");
	printf("\n请输入旧密码: \n");
	for(i=0;i<8&&((pwd[i]=getchar())!=13);i++)
		putchar('*');
	pwd[i]='\0';
	if(strcmp(password,pwd)!=0)
	{
		printf("\n密码错误,请按任意键退出!\n");
		getchar();
		return;
	}
	do
	{
		printf("\n设置密码,请不要超过8位:  ");
		for(i=0;i<8&&((pwd[i]=getchar())!=13);i++)
			putchar('*');
		printf("\n请再确认一次密码:   ");
		for(i=0;i<8&&((pwd[i]=getchar())!=13);i++)
			putchar('*');
		pwd[i]='\0';
		pwd1[i]='\0';
		if(strcmp(pwd,pwd1)!=0)//比较两次输入的密码
			printf("\n两次密码输入不一致,请重新输入!  \n\n");
		else 
			break;
	}while(1);
	if((fp1=fopen("employee.tex","wb"))==NULL)
	{
		printf("\n系统创建失败,请按任意键退出!\n");
		getchar();
		exit(1);
	}
	i=0;
	while(pwd[i])
	{
		putw(pwd[i],fp1);//将数组元素送入文件流中
    	i++;
	}
	fclose(fp1);//关闭文件流
	printf("\n密码修改成功,请按任意键退出后,再重新进入!\n");
	getch();
	return;
}

(8)主函数程序代码如下:

int main()
{
	emp_first=emp_end=NULL;//链表指针初始化
	gsave=gfirst=0;
	checkfirst();
	login();
	readdata();
	menu();
	system("PAUSE");
	return 0;
}

五、测试数据及运行结果

1.正常测试数据和运行结果
第一组:实现添加员工信息并显示添加后员工的信息的功能,操作如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二组:实现查询员工信息的功能,操作如下:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第三组:实现修改员工信息的功能,并显示修改后员工的信息,操作如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

六、交流与联系

q:969060742 文档、代码、程序资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1061167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机竞赛 身份证识别系统 - 图像识别 深度学习

文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计 图像识别 深度学习 身份证识别…

【算法训练-二分查找 四】【模拟二分】X的平方根

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【二分查找】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

stm32-SPI协议

SPI协议详解&#xff08;图文并茂超详细&#xff09; SPI通讯协议 于是我们想有没有更好一点的串行通讯方式&#xff1b;相比较于UART&#xff0c;SPI的工作方式略有不同。 SPI是一个同步的数据总线&#xff0c;也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和…

Django的模版使用(Django-03)

一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用&#xff0c;让项目中的业务逻辑代码和数据表现代码分离&#xff0c;让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…

Linux文本三剑客---awk

AWK是什么 Linux文本三剑客之一&#xff08;grep,sed,awk&#xff09;&#xff0c;功能最强大的文本工具。 逐行读取输入的文本内容&#xff0c;默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格&#xff0c;会自动压缩成一个&#xff0c;然后按照指定的模式和条件执…

3D 毛玻璃晶质见证卡

效果展示 页面结构 从上面的效果展示来看&#xff0c;页面主要成员是一张卡片&#xff0c;并且卡片上有三个小矩形&#xff0c;而小矩形上会展示对应的内容。 当鼠标悬停在卡片上时&#xff0c;卡片会随着鼠标的移动而改变视角。 CSS3 知识点 transform-style 属性的 prese…

用OpenCV(Python)获取图像的SIFT特征

import cv2 as cv import numpy as np import matplotlib.pyplot as plt imgcv.imread("../Lena.png") img_graycv.cvtColor(img,cv.COLOR_BGR2GRAY)#创建一个SIFI对象 siftcv.SIFT_create()#使用SIFT对象在灰度图像img_gray中检测关键点&#xff0c;结果存储在变量k…

MATLAB中plot3函数用法

目录 语法 说明 向量和矩阵数据 表数据 其他选项 示例 绘制三维螺旋图 绘制多个线条 使用矩阵绘制多个线条 指定等间距刻度单位和轴标签 将点绘制为不带线的标记 自定义颜色和标记 指定线型 在绘图后修改线条 绘制表中的数据 在 x 和 y 轴上绘制多个表变量 指…

【国漫逆袭】人气榜,小医仙首次上榜,霍雨浩排名飙升,不良人热度下降

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 为了提升作品和角色的讨论度&#xff0c;增加平台的用户活跃度&#xff0c;小企鹅推出了动漫角色榜&#xff0c;该榜单以【年】【周】【日】为单位&#xff0c;通过角色的点赞量和互动量进行排名 上周的动漫角…

解决dockerfile创建镜像时pip install报错的bug

项目场景&#xff1a; 使用docker-compose创建django容器 问题描述 > [5/5] RUN /bin/bash -c source ~/.bashrc && python3 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple: 0.954 Looking in indexes: https://…

关于PointHeadBox类的理解

forward函数 def forward(self, batch_dict):"""Args:batch_dict:batch_size:point_features: (N1 N2 N3 ..., C) or (B, N, C)point_features_before_fusion: (N1 N2 N3 ..., C)point_coords: (N1 N2 N3 ..., 4) [bs_idx, x, y, z]point_labels (opti…

Folium笔记:HeatMap

在地图上生成热力图 0 举例 import folium from folium.plugins import HeatMap# 创建一个地图对象 m folium.Map(location(1.34084, 103.83637), zoom_start13)# 创建一个坐标点的数据集 data [(1.431656, 103.827896),(1.424789, 103.789902),(1.325781, 103.860446),(1.…

【算法训练-搜索算法 一】【DFS网格搜索框架】岛屿数量、岛屿的最大面积、岛屿的周长

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【搜索算法】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

多卡片效果悬停效果

效果展示 页面结构 从页面的结构上看&#xff0c;在默认状态下毛玻璃卡片是有层次感的效果叠加在一起&#xff0c;并且鼠标悬停在卡片区域后&#xff0c;卡片整齐排列。 CSS3 知识点 transform 属性的 rotate 值运用content 属性的 attr 值运用 实现页面整体布局 <div …

代码随想录算法训练营第五十七天 | 动态规划 part 15 | 392.判断子序列、115.不同的子序列

目录 392.判断子序列思路代码 115.不同的子序列思路代码 392.判断子序列 Leetcode 思路 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]递推公式&#xff1a; 初始化&#xff1a;为0遍历顺序&#xff…

日常工作报告生成器微信小程序源码 支持日报,周报,月报,年终终结

相信大家上班都会有做工作报告的情况吧 那么这款小程序就是大家的福音了 只要输入你的工作内容或者岗位自动生成你的工作报告 支持报,周报,月报,年终终结 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391810 源码下载2&#xff1a;评论留言或私信…

JVM篇---第二篇

系列文章目录 文章目录 系列文章目录一、简述一下JVM的内存模型二、说说堆和栈的区别三、什么时候会触发FullGC一、简述一下JVM的内存模型 1.JVM内存模型简介 JVM定义了不同运行时数据区,他们是用来执行应用程序的。某些区域随着JVM启动及销毁,另外一 些区域的数据是线程性独…

自动化测试框架详解

一、什么是自动化测试框架 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架&#xff1f;框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架。前者是从应…

知识图谱-Neo4j使用详解

neo4j应用场景 知识图谱欺诈检测实时推荐引擎反洗钱主数据管理供应链管理增强网络和IT运营管理能力数据谱系身份和访问管理材料清单 图数据库neo4j简介 关系查询&#xff1a;mysql和neo4j性能对比 neo4j的特性和优点&#xff1a; Neo4j-CQL简介 neo4j的Cypher语言是为处理图…

96.qt qml-http之XMLHttpRequest介绍详解使用

在QML中我们可以通过XMLHttpRequest 来实现http/https访问网络接口,接下来我们先来学习XMLHttpRequest类的常用部分、 由于QML的XMLHttpRequest少部分参数是没有的,所以本章来单独讲解下。下章我们来实现旋转请求按钮以及通用的JSON请求模板方法 1.XMLHttpRequest初步使用 …