资源简介 (共56张PPT)第9章 企业员工管理系统项目概述项目案例实现项目概述项目案例实现9.29.1 点击查看本小节知识架构 点击查看本小节知识架构学习目标理解掌握掌握熟练理解项目的整体框架1掌握项目中数据的操作流程42掌握项目功能模块的设计思想3熟练应用数据结构中的队列在本章之前,本书已经详细地介绍了基于 C 语言的各种数据结构以及基本的算法,如线性表、队列、栈、二叉树、插入与排序等。本章将以企业办公自动化(Office Automation, OA)系统为参考原型,展示通过数据结构以及文件实现各种功能需求,意在帮助读者熟练操作数据以及提升代码处理能力。本章将知识点与实际开发结合,望读者通过对本章的学习,为实际开发奠定基础。9.1 企业员工管理系统9.1.1开发背景返回目录9.1.2项目需求分析9.1.3环境使用说明9.1.4项目技术拓展9.1.5系统软件设计9.1.1 开发背景随着计算机技术的不断发展,计算机作为知识经济时代的产物,已被广泛应用于社会各个行业和领域。随着我国市场经济的日趋繁荣,企业间的竞争日益激烈,迫使企业采用先进的计算机硬件设备以及高质量的辅助软件来管理企业的各项运作,以提高劳动生产率以及人员效率。人力资源管理系统的发展历史可以追溯到 20 世纪 60 年代末期。由于当时计算机技术已经进入实用阶段,同时大型企业用手工来计算和发放薪资既费时费力又非常容易出差错,因此,第一代人力资源管理系统应运而生。受技术条件和需求的限制,当时的管理系统用户非常少,而且那种系统充其量是一种自动计算薪资的工具,既不包含非财务的信息,也不包含薪资的历史信息,几乎没有报表生成功能和薪资数据分析功能。但是,它的出现为人力资源管理展示了美好的前景,即用计算机的高速度和自动化来代替手工的巨大工作量,用计算机的高准确性来避免手工的错误和误差。自此,大规模集中处理大型企业的薪资成为可能。9.1.1 开发背景第二代人力资源管理系统出现于 20 世纪 70 年代末。随着计算机技术的飞速发展,无论是计算机的普及性,还是计算机系统工具和数据库技术的进步,都为人力资源管理系统的升级提供了可能。第二代人力资源管理系统基本上解决了第一代系统的主要缺陷,对非财务的人力资源信息和薪资的历史信息都给予了考虑,其报表生成和薪资数据分析功能也都有了较大的改善。但这一代系统主要是由计算机专业人员开发研制的,未能系统地考虑人力资源的需求和理念,而且其非财务的人力资源信息也不够系统和全面。人力资源管理系统的革命性变化出现在 20 世纪 90 年代末。由于市场竞争的需要,如何吸引和留住人才,激发员工的创造性、工作责任感和工作热情已成为关系企业兴衰的重要课题,人才成为企业最重要的资产之一。“公正、公平、合理”的企业管理理念和企业管理水平的提高,使社会对人力资源管理系统有了更高的需求,同时,个人计算机的普及,数据库技术、客户/服务器技术,特别是因特网技术的发展,使第三代人力资源管理系统的出现成为必然。第三代人力资源管理系统的特点是从人力资源管理的角度出发,用集中的数据库处理几乎所有与人力资源相关的数据,如职位信息、签到信息、考勤信息、岗位描述、个人信息和历史资料。这些数据被统一管理起来,形成了集成信息源。9.1.2 项目需求分析本项目案例以 Linux 操作系统为平台,以 C 语言为开发语言,通过对文件的操作模拟数据库的存储数据功能,通过链式队列实现数据操作。企业员工管理系统可供两种类型的用户使用:人力资源(Human Resources,HR)管理人员与普通员工。不同类型用户登录系统使用的功能也不同。普通员工的功能需求为查看个人信息、修改密码、申请请假、申请加班;HR 管理人员则拥有最高权限,其功能需求包括查询员工信息、更新员工信息、添加新员工、移除离职员工。项目整体框架如图所示。9.1.2 项目需求分析该系统在用户登录后,根据用户类型判断用户级别。如果用户为 HR 管理人员,则进入 HR 操作界面;如果用户为普通员工,则进入普通操作界面。运行程序,登录界面如图所示。如果使用 HR 管理人员的账号(工号)登录,登录后的界面如图所示。9.1.2 项目需求分析如果使用普通员工的账号(工号)登录,登录后的界面如图所示。9.1.3 环境使用说明企业员工管理系统的环境使用说明如表所示。读者可参考该说明进行环境配置,以免后续代码示例无法编译运行。运行平台(操作系统)可选取不同版本,WMware 为虚拟机工具,也可选择不同版本。9.1.4 项目技术拓展1.文件本项目选取 Linux 操作系统中一个重要的元素来存储数据——文件。在实际开发中,大部分数据操作都用数据库存储信息,而本项目案例选用文件来替代数据库模拟数据的存储。相对于操作数据库来说,操作文件更容易帮助读者理解数据传递的过程,且简单易懂。了解文件首先需要理解 Linux 操作系统中的文件类型,以及它们各自的特点。Linux 操作系统中的大多数文件是普通文件或目录文件,但是也有另外一些文件类型。(1)普通文件(Regular File)。最常见的文件类型,这种文件的数据形式可以是文本或二进制数据。(2)目录文件(Directory File)。这种文件包含其他类型文件的名字以及指向与这些文件有关的信息的指针。对一个目录文件具有可读权限的任一进程都可以读该目录文件的内容,但只有内核具有写目录文件的权限。(3)字符设备文件(Character Special File)。这种文件被视为对字符设备的一种抽象,它代表的是应用程序对硬件设备的访问接口,Linux 应用程序通过对该文件进行操作来实现对设备的访问。9.1.4 项目技术拓展(4)块设备文件(Block Special File)。这种文件类似于字符设备文件,只是这种文件用于磁盘设备。Linux 操作系统中的所有设备或者抽象为字符设备文件,或者抽象为块设备文件。(5)管道(Pipe)文件。这种文件用于进程间的通信,有时也将其称为命名管道。(6)套接字(Socket)。这种文件用于进程间的网络通信。套接字也可用于在一台宿主机上的进程之间的本地通信。(7)符号连接(Symbolic Link)。这种文件指向另一个文件。本项目选择普通文件作为操作对象,并通过一些库函数完成对文件的操作。2.文件的操作在 Linux 操作系统中,对文件的操作方式很多,这里只介绍通过库函数实现对文件的处理。操作文件首先需要打开文件,然后对文件进行读写,最后关闭文件。9.1.4 项目技术拓展(1)打开文件的库函数为 fopen(),具体的功能以及参数如表所示。9.1.4 项目技术拓展该函数的参数有两个,一个为文件名,另一个为打开文件的方式。打开文件的方式共有 6 种,且每一种都有特定的权限。例如,mode 参数传入 r 表示只读,文件被打开后,程序只能对该文件进行读操作,不能写入。函数返回值为流指针,通过对流指针进行操作,可实现对文件中数据的读写。(2)读文件的库函数为 fread(),具体的功能以及参数如表所示。9.1.4 项目技术拓展该函数的参数 ptr 用来指向保存读取到的数据的区域,由于该指针的类型为 void,因此数据的格式是不固定的,即读取的数据可以是字符、字符串以及结构体等。操作的核心为第 4 个参数 stream,即流指针,操作该流指针即可完成对指定文件的读取。(3)读文件的库函数还有 fgets(),具体的功能以及参数如表所示。9.1.4 项目技术拓展fgets()函数在读取文件时,读取的数据格式只能是字符或字符串(只有一个字符的字符串)。参数 size 用来设置读取的数据的大小,建议选择一个较大值,否则可能会导致读取的数据不全。例如,字符串为 abcdef,size 设置为 4,则读取的字符串为 abc'\0',其中'\0'表示字符串的结尾。(4)写文件的库函数为 fwrite(),具体的功能以及参数如表所示。9.1.4 项目技术拓展函数 fwrite()与 fread()的数据传输方向刚好相反。(5)关闭文件的库函数为 fclose(),具体的功能以及参数如表所示。函数 fclose()的功能为关闭流指针,流指针关闭后,该流指针失效,无法通过该流指针操作文件。9.1.5 系统软件设计本项目案例使用两个文件完成信息的处理。第一个文件用来保存用户的登录信息,即用户登录时需要访问该文件。如果文件中的信息与输入的登录信息匹配,则登录成功;如果不匹配,则登录失败。第二个文件用来保存用户的详细信息,用来实现查询、删除、修改等操作,如图所示。9.1.5 系统软件设计接下来对项目案例中需要实现的功能进行具体分析。(1)用户登录。系统设置了两种类型的用户,即 HR 管理人员与普通员工。系统对员工的信息进行录入时,对用户类型进行了设置,从而保证用户登录时根据类型的不同进入不同的操作界面。User.dat 文件中保存了所有已经录入系统的员工的登录信息,如姓名、账号、密码、员工类型。用户登录流程如图所示。9.1.5 系统软件设计(2)添加新员工信息,添加新员工信息只限 HR 管理人员操作,即只能在 HR 操作界面完成。添加新员工信息的操作包括两部分:第一部分为向 User.dat 文件中添加员工的登录信息,保证该员工可以使用自己的账号登录系统;第二部分为向 Info.dat 文件中添加员工的具体信息,用来实现后续的查询、修改、删除操作。添加新员工信息流程如图所示。9.1.5 系统软件设计(3)删除员工信息。在员工离职后,需要将系统中员工的信息删除。同理,删除员工仅限 HR管理人员进行操作,其操作包括两部分:第一部分为从 User.dat 文件中将员工的登录信息删除,保证该员工无法再使用自己的账号登录系统;第二部分为从 Info.dat 文件中删除员工的具体信息。删除操作使用了数据结构中的队列来完成,具体原理为:将文件中的信息依次读取出,然后写入队列进行保存;再将信息从队列中读取出并过滤匹配的信息;最后将未过滤掉的信息重新写入文件(保证不需要删除的信息仍然存在于文件中)。9.1.5 系统软件设计综上所述,删除员工信息流程如图所示。9.1.5 系统软件设计(4)修改员工信息。修改员工信息是在删除员工信息的基础上完成的。其大致的原理是:输入需要修改的员工信息并读取文件;然后执行图 9.8 所示的删除处理,执行完成后,需要修改的员工信息从文件中删除;最后执行图 9.7 所示的添加处理,将新信息写入文件。修改员工信息流程如图所示。9.1.5 系统软件设计(5)查询员工信息。查询员工信息只需要输入待查询员工的信息并读取文件,如果匹配成功则输出信息。查询员工信息流程如图所示。9.1.5 系统软件设计(6)查询信息。普通员工只能查询自己的信息,其原理与图所示的查询员工信息类似。(7)修改密码。普通员工不能修改自己的信息,只能修改登录时的密码。修改密码的方式与 HR管理人员更新员工信息的操作类似。修改密码流程如图所示。图中的删除匹配信息同样采用了队列操作。本项目案例中,修改信息都是采用先删除后添加的方式来完成的。9.1.5 系统软件设计(8)申请加班与请假。不论是申请加班还是请假,其原理是一致的,与删除匹配信息的操作类似(借助队列完成)。当系统查询到匹配信息时,不进行删除操作,而是对请假或加班的员工的信息进行修改。申请加班与请假流程如图所示。9.1.5 系统软件设计图中,修改参数使用了队列操作:首先将信息全部从文件中读取出并保存至队列中;然后判断需要修改参数的员工信息是否存在,如果存在则将队列中其他员工的信息重新写入文件;最后对匹配的员工信息进行参数修改,再写入文件。9.2 逻辑结构与物理结构9.2.1全局变量的定义返回目录9.2.2功能代码设计9.2.3系统展示9.2.1 全局变量的定义全局变量主要用来声明项目案例中的员工详细信息与登录信息。员工详细信息与登录信息分别存储在两个结构体中并被设置为头文件,如例所示。9.2.1 全局变量的定义9.2.1 全局变量的定义由例可知,员工的登录信息记录在 USER 结构体中,包括员工类型、员工姓名、登录密码、员工工号。其中,员工工号作为员工的唯一标识,不会出现重复,员工工号同时也是系统的登录账号。INFO 结构体用来记录员工的详细信息,其成员 type 与 USER 结构体中的 type 一致。MSG 结构体用来实现对员工的具体操作。9.2.2 功能代码设计下面按照代码设计流程具体分析程序实现的功能。1.主函数主函数的代码如例所示,menu()函数为核心函数。9.2.2 功能代码设计2.界面实现界面实现的代码参考教材9.2.2节。上述代码根据用户登录后的选择执行不同的功能,执行操作由传入的宏进行确认,并通过judgment()函数完成具体的操作。因此在此部分代码中,judgment()为核心函数。3.控制实现实现操作控制的函数为 judgment(),该函数通过 switch 语句对用户的不同请求做出响应。具体代码如例 所示。9.2.2 功能代码设计9.2.2 功能代码设计例中,执行修改操作的原理是将旧的信息删除,再增加新的信息。函数 judgment()可以根据用户的不同选择,跳转到不同的函数执行具体的操作。4.功能实现judgment()函数中有很多具体的操作子函数,接下来对这些函数(函数的参数都是通过 judgment()函数传入)进行分析。9.2.2 功能代码设计9.2.2 功能代码设计例中,函数的功能为查询员工的登录信息,核心操作为读取写入登录文件的信息,并将其与传入的确认信息进行对比,判断是否匹配。如果匹配则将读取出的信息赋值给从函数参数传入的结构体,用于函数返回时获取操作结果。9.2.2 功能代码设计9.2.2 功能代码设计例中,函数的功能为查询员工的详细信息,核心操作为读取存储员工详细信息的文件,并将传入的确认信息(姓名与工号)与读取的信息进行对比,如果匹配则将读取的信息赋值给从参数传入的结构体,用于函数返回时输出用户的详细信息。9.2.2 功能代码设计例中,函数的功能为增加员工的登录信息,核心操作为将传入的结构体变量 user 写入存放登录信息的文件。9.2.2 功能代码设计例中,函数的功能为增加员工的详细信息,核心操作为将传入的结构体变量 info 写入存放员工详细信息的文件。删除员工登录信息代码参考教材9.2.2节。例中,函数的功能为删除员工的登录信息,即删除登录文件中员工的记录。核心操作为使用队列完成数据的传递,且在传递过程中完成数据的删除。删除员工详细信息代码参考教材9.2.2节。例中,删除员工的详细信息与删除登录信息的原理是一致的,只是操作的结构体与文件不同。员工申请请假代码参考教材9.2.2节。例中,函数的功能为申请请假,即修改申请人的请假参数。核心操作与删除员工信息类似,同样使用队列传递数据,不同的是在该函数中,如果从文件中找到匹配的信息,不执行跳过处理,而是修改参数后,再将信息重新写入文件。9.2.2 功能代码设计例中,函数的功能为申请加班,即修改申请人的加班参数。核心操作与删除员工信息类似,同样使用队列传递数据,不同的是在该函数中,如果从文件中找到匹配的信息,不执行跳过处理,而是修改参数后,再将信息重新写入文件。9.2.3 系统展示将 9.2.2 节展示的代码整合为一个文件,并执行编译,运行结果如下所示。1.H R 管理人员登录第一次登录需要由 HR 管理人员完成,登录后的界面如图所示。在 HR 操作界面选择“添加新员工信息”,按照提示输入员工的信息,如图所示。9.2.3 系统展示2.添加新员工信息在 HR 操作界面选择“添加新员工信息”,按照提示输入员工的信息,如图所示。9.2.3 系统展示3.删除员工信息当员工离职后,需要将该员工从系统中删除,删除员工在管理员操作界面进行,如图所示。选择删除员工信息,当输入员工的姓名与工号后,员工成功删除。9.2.3 系统展示4.修改员工信息如果系统中某个员工的信息需要修改,则可以进行修改操作。在 HR 操作界面选择“修改员工信息”,如图所示。修改员工信息需要输入员工的姓名与工号进行确认,系统将提示用户重新输入。9.2.3 系统展示5.查询员工信息如果系统中有员工信息,则可以随时进行查询。在 HR 操作界面选择“查询员工信息”,如图所示。选择“查询员工信息”后,只需要输入员工的姓名与工号,系统即可输出该员工的详细信息。9.2.3 系统展示6.普通员工登录如果员工的信息已经添加到系统中,则可进行系统登录,如图所示。输入新添加员工的工号与密码即可登录,登录后进入普通操作界面。9.2.3 系统展示7.查询信息普通员工进入操作界面后,可以查询自己的信息。在操作界面选择“查询信息”,如图所示。在查询自己的信息时,只需要输入名字即可,系统将显示员工的详细信息。9.2.3 系统展示8.修改密码普通员工在操作界面可进行密码修改操作,如图所示。选择“修改密码”后,需要输入自己的名字,再输入新的密码。9.2.3 系统展示9.申请请假普通员工可在操作界面进行申请请假操作,如图所示。选择“申请请假”后,输入自己的名字,即可完成申请。9.2.3 系统展示10.申请加班普通员工可在操作界面进行申请加班操作,如图所示。选择“申请加班”后,输入自己的名字,即可完成申请。9.2.3 系统展示11.查看申请记录员工申请了请假或加班后,用户即可在普通操作界面或 HR 操作界面进行查询,如图所示。在 HR 操作界面输入要查询的员工姓名与工号,可见在系统输出的详细信息中,加班与请假的记录已发生变化。本章小结本章以企业办公自动化系统为模型,开发企业员工管理系统,通过数据处理与文件操作模拟完成各种功能。数据操作是本项目案例的核心,其中比较重要的是数据在文件与队列间的传递。读者需要理解各种功能实现的原理,熟悉各种功能实现中涉及的数据处理。本章实现的项目功能有限,望读者可以在此基础上,学习更多技术知识,开发出更人性化的系统。 展开更多...... 收起↑ 资源预览