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

(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.rhkb.cn/news/147994.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

httpserver 下载服务器demo 以及libevent版本的 httpserver

实现效果如下&#xff1a; 图片可以直接显示 cpp h 这些可以直接显示 其他的 则是提示是否要下载 单线程 还有bug 代码如下 先放上来 #include "httpserver.h" #include "stdio.h" #include <stdlib.h> #include <arpa/inet.h> #include…

为什么Spring不建议使用基于字段的依赖注入

在我们通过IDEA编写Spring的代码的时候&#xff0c;假如我们编写了如下代码&#xff1a; IDEA会给我们一个warning警告&#xff1a; 翻阅官方文档&#xff1b;我们会发现&#xff1a; 大意就是强制依赖使用构造器注入&#xff0c;可选依赖使用setter注入那么这是为什么呢&am…

一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案

前言 如今进行入自媒体行业的人越来越多&#xff0c;短视频也逐渐成为了主流&#xff0c;但好多时候是想如何把视频里面的语音转成文字&#xff0c;比如&#xff0c;录制会议视频后&#xff0c;做会议纪要&#xff1b;比如&#xff0c;网课教程视频&#xff0c;想要做笔记&…

【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 LCR 090. 打家劫舍 II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

fcpx插件:82种复古电影胶卷框架和效果mFilm Matte

无论您是在制作音乐剪辑、私人假期视频还是大型广告活动&#xff0c;这个专业的插件都将帮助您为您的镜头赋予真正的电影角色。 复古效果在任何视频中都能立即识别出来&#xff0c;增添了感伤的复古氛围&#xff0c;并使镜头更具说服力。使用 mFilm Matte 轻松实现这些特征&…

C++算法 —— 动态规划(10)二维费用背包

文章目录 1、动规思路简介2、一和零3、盈利计划 背包问题需要读者先明白动态规划是什么&#xff0c;理解动规的思路&#xff0c;并不能给刚接触动规的人学习。所以最好是看了之前的动规博客&#xff0c;以及两个背包博客&#xff0c;或者你本人就已经懂得动规了。 1、动规思路简…

九、2023.10.3.Linux(end).9

文章目录 33、简述mmap的原理和使用场景&#xff1f;34、互斥量能不能在进程中使用&#xff1f;35、协程是轻量级线程&#xff0c;轻量级表现在哪里&#xff1f;36、说说常见信号有哪些&#xff0c;表示什么含义&#xff1f;37、说说线程间通信的方式有哪些&#xff1f;38、说说…

Access注入---Cookie注入

Access注入----Cookie注入Access数据库&#xff08;微软&#xff09; 逐渐淘汰 &#xff08;没有库的概念&#xff0c;是表的集合&#xff09;Access没有系统自带库Cookie注入&#xff08;头注入HEAD注入的&#xff09;php中产生Cookie注入的可能性小&#xff0c;但ASP产生Cook…

RabbitMQ的基本介绍

什么是MQ 本质是一个队列&#xff0c;只不过队列中存放的信息是message罢了&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递信息。在互联网架构中&#xff0c;MQ是一种非常常见的上下游“逻辑解耦物理解耦”的消息通信服务。使用了MQ之后&#xff0c;信息发送…

postgresql16-新特性

postgresql16-新特性 any_value数组抽样数组排序 any_value any_value 返回任意一个值 select e.department_id ,count(*), any_value(e.last_name) from cps.public.employees e group by e.department_id ;数组抽样 -- 从数组中随机抽取一个元素 array_sample(数组&#…

以太网基础学习(四)——IP协议

一 、IP协议概述 IP&#xff08;Internet Protocol&#xff0c;互联网协议&#xff09;是互联网通信的基础协议&#xff0c;它负责将数据包从源地址传输到目的地址。IP协议定义了如何封装数据包&#xff0c;如何寻址数据包以及如何路由数据包&#xff0c;它是随着互联网的出现而…

弧度、圆弧上的点、圆的半径(r)、弧长(s)之间的关系

要计算弧度和圆弧上的点&#xff0c;需要知道以下几个要素&#xff1a; 圆的半径&#xff08;r&#xff09;&#xff1a;即圆的中心到圆周上任意一点的距离。 弧长&#xff08;s&#xff09;&#xff1a;从圆周上的一个点到另一个点所经过的弧长。 弧度&#xff08;θ&#x…

【CAD二次开发】给CAD添加TRUSTEDPATHS避免dll插件信任弹窗

找到配置文件目录,遍历下面的每个配置文件; 找到 Variables 下的TRUSTEDPATHS项目;在后面添加新的目录即可,多个目录使用分号分隔; public static void AddPath(string trusedPath){// 指定注册表键的路径

指针笔试题(带解析版)

题目2&#xff1a; struct MyStruct {int num;char* pcname;short sdate;char cha[2];short sba[4]; }*p; //结构体大小为32字节 //p0x100000 int main() {p 0x100000;printf("%p\n", p 0x1);//p&#xff1a;结构体指针&#xff0c;1下一个结构体指针&#xff0c;…

axb_2019_brop64

axb_2019_brop64 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)64位&#xff0c;只开了NX __int64 repeater() {size_t v1; // raxchar s[208]; // [rsp0h] [rbp-D0h] BYREFprintf("…

SLAM从入门到精通(用python实现机器人运动控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在ROS下面&#xff0c;开发的方法很多&#xff0c;可以是c&#xff0c;可以是python。大部分接口操作类的应用&#xff0c;其实都可以用python来开…

深度学习 图像分割 PSPNet 论文复现(训练 测试 可视化)

Table of Contents 一、PSPNet 介绍1、原理阐述2、论文解释3、网络模型 二、部署实现1、PASCAL VOC 20122、模型训练3、度量指标4、结果分析5、图像测试 一、PSPNet 介绍 PSPNet(Pyramid Scene Parsing Network)来自于CVPR2017的一篇文章&#xff0c;中文翻译为金字塔场景解析…

springboot+Uniapp+redis智能导诊系统源码,支持以公众号、小程序、App 等形式接入

AI医疗的智能导诊系统源码 智慧导诊系统全套源码 什么是智能导诊系统&#xff1f; 智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件&#xff0c;它能够通过对患者的症状、病史等信息进行计算分析&#xff0c;快速推荐科室和医生。通过简单的描述自身症状&#…

go语法入门2

字符串 使用双引号或反引号引起来的任意个字符。它是字面常量。 func main() {var a "abc\n测试" // \n换行fmt.Println(a) } abc 测试func main() {var a "abc\n\t测试" \\换行后在tabfmt.Println(a) } abc测试func main() {var a abc测试 …

火山引擎 ByteHouse 与白鲸开源完成兼容性认证,加速数据价值释放

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 数据作为新型生产要素&#xff0c;已快速融入生产、分配、流通、消费和社会服务管理等各环节&#xff0c;深刻改变着生产方式、生活方式和治理方式。越来越多企业也…