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

    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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    (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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    (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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    (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;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    (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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

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

    int main()
    {
    	emp_first=emp_end=NULL;//链表指针初始化
    	gsave=gfirst=0;
    	checkfirst();
    	login();
    	readdata();
    	menu();
    	system("PAUSE");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    五、测试数据及运行结果

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

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

    在这里插入图片描述

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

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

    六、交流与联系

    q:969060742 文档、代码、程序资源
    
    • 1
  • 相关阅读:
    Java项目_在线点餐系统(jsp+sevlet+mysql)(含论文)
    21.过拟合和欠拟合示例
    java基于springboot+vue学生考勤签到请假管理系统84y43
    1.SpringMVC入门案例
    作业 增删改查 三个功能
    发现一款自学Java可视化工具神器,非常牛逼,太爱了!
    Java基础知识篇02——Java基本语法
    从底层结构开始学习FPGA(16)----PLL/MMCM IP的定制与测试
    【深度学习】大模型卷到机器人上了
    Python文件操作篇
  • 原文地址:https://blog.csdn.net/m0_58065010/article/details/133554687