C++人事管理系统

一、设计目的

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

二、设计内容

1.用户首次使用本系统时进行密码设置和初始化操作。

2.实现添加功能,即添加员工的相关信息。

3.实现查看功能,即显示系统中所有员工的相关信息。

4.实现查找功能,即可以通过多种条件对员工进行查询,如姓名、工号等。

5.实现修改功能,即输入员工的姓名修改其相关信息。

6.实现删除功能,即输入员工的姓名删除其相关信息。

7.实现统计员工人数的功能。

8.实现重新设置密码登录密码的功能。

9.退出系统。

三、概要设计

1.功能模块图:

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

(1).首次登陆用户信息初始化功能模块:当用户时首次使用本系统时,则需要根据提示进行设置密码和初始化的操作。

(2).输入员工信息功能模块:实现将用户从键盘输入的数据存储到对应字段或数据成员中,并检查输入的合法性。

(3).显示员工信息功能模块:用户根据提示操作显示系统中已有的员工的相关信息,如果系统中海没有存储员工信息则给出无法显示信息的提示。

(4).查询员工信息功能模块:根据用户输入的待查询记录的关键字,在数据结构中查找该记录,如找到则输出该员工的信息,否则给出无法找到的提示信息。

(5).修改员工信息功能模块:根据用户要求,根据提示操作,找到要修改信息的员工然后修改员工的相关信息,如年龄。工资等。

(6).删除员工信息功能模块:由用户输入选择删除相关的员工的信息。

(7).统计员工信息功能模块:统计本系统中员工的信息,如男、女员工的人数等。

(8).重置系统密码功能模块:根据用户的要求,将旧密码更换设置新密码。

(9).退出系统功能模块:在用户执行完相关系统操作之后,退出使用本系统。

四.详细设计

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

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

3.重点设计及编码

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

c 复制代码
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次不一致会强制退出:

c 复制代码
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()用于添加员工的信息,首先打开存储员工信息的数据文件,系统会提示用户输入相应的员工基本信息,当用户输入完成一个员工的信息后,系统会提示用户是否继续输入员工信息:

c 复制代码
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()实现删除员工的功能。在系统的功能菜单中选择删除信息的操作后,系统就会提示要删除的员工的姓名,输入要删除的员工的姓名后,如果系统从信息链表中找到相关信息后就会将信息显示出来,再次要求用户确定是否要删除,谨防误操作,提高信息的安全性。

c 复制代码
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()用于修改密码。在系统的功能菜单中选择修改的操作选项后,系统会提示输入旧密码,用户咋正确的输入旧密码后,根据提示即可实现密码的修改:

c 复制代码
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)主函数程序代码如下:

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

五、测试数据及运行结果

1.正常测试数据和运行结果

第一组:实现添加员工信息并显示添加后员工的信息的功能,操作如下图:



第二组:实现查询员工信息的功能,操作如下:

第三组:实现修改员工信息的功能,并显示修改后员工的信息,操作如下:


六、交流与联系

复制代码
q:969060742 文档、代码、程序资源
相关推荐
xqqxqxxq3 分钟前
MySQL 数据类型笔记
数据库·笔记·mysql
数聚天成DeepSData4 分钟前
数聚天成 DeepSData 数据价值落地实战指南
java·maven·devops
小小小米粒14 分钟前
阿姆达尔定律(Amdahl‘s Law)
java·开发语言
知彼解己14 分钟前
Java 版本演进
java·开发语言·spring boot
Logintern0926 分钟前
理解MySQL数据库的“事务与锁”
数据库·mysql
极客先躯30 分钟前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
朱容zr3331331 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
麻瓜code1 小时前
【Redis 】数据类型、持久化与过期删除
数据库·redis·缓存
空杆推不起1 小时前
穿透 Flink CDC 表层用法:数据库日志捕获机制、Flink Source 运行时、端到端一致性底层原理详解
大数据·数据库·flink
知彼解己1 小时前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse