基于C++实现(控制台)人事管理系统

一、系统需求分析

一个好的公司总是有很多员工需要管理。公司有许多员工,每个员工拥有不同的属性,总的来说分为以下几种:

  • 普通雇员;
  • 项目经理;
  • 销售经理;
  • 销售人员;
  • 技术人员。

公司可能扩大规模、增加员工数目,也可能奖励表现好的员工对其进行升职加薪等,或是对表现不好的员工进行处罚或者直接解雇。公司可能需要根据需要查询员工信息或进行整体上的统计。据此,提供功能如下:

  • 录入数据;可以选择录入员工的类别和相应的属性;
  • 修改数据:可以修改已经录入的员工属性;
  • 查询数据:可以查询已经录入的员工属性;
  • 删除数据:可以删除已经录入的员工资料;
  • 统计数据:可以统计已经录入的员工属性。

可以通过以上功能录入信息、修改信息、查询信息、删除信息、整理统计出所要了解的信息,除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个愉快的心情。人事管理系统有广大的用户群,还可将之出售给其他公司的管理人员,也可以供给一般用户使用。总之该系统可以满足用户需求,实现对其旗下人员的人事管理工作。

二、总体设计

系统提供五大功能:录入、修改、查询、删除、统计。

在录入员工信息时根据系统提示选择员工类别逐一输入。每输入完一条信息,系统会提示是否继续输入,用户可以选择继续或返回主菜单。

在修改员工信息时,用户首先输入要修改的员工编号,系统会检索。如果不知道有哪些员工,还可以显示所有员工信息。如果系统中有该员工的相关信息,则系统首先会提示用户修改该员工的哪一部分信息,用户可自行选择。如果系统中没有该员工的相关信息,则系统会给相关提示之后返回主菜单,用户可以继续选择操作。

在查询员工信息时,用户可以输入要查询的员工编号,系统检索判断是否存在该员工的信息然后做出相应的提示。也可以直接选择显示全部员工信息。

在删除员工信息时,用户需要输入欲删除的员工编号,系统会检索,如果存在该员工则将之删除并给出相应提示。总之,用户可以方便的在系统提示下进行使用。

人事管理系统中功能模块图:

三、详细设计

员工分为5类,其继承关系如下:

人事管理系统各功能模块的实现:

  • 录入模块

  • 修改模块

  • 查询模块

  • 删除模块

  • 统计模块

四、系统调试

系统调试遇到的第一个问题是数据文件不稳定。经过对系统结构特别是对数据文件读写过程的分析,确认问题出现在直接将对象用二进制写入文件这一方法上。由于使用了虚函数等与运行相关的多态,类的对象中有地址,一旦将这些地址写入文件,再读取时很有可能导致内存泄露而崩溃。为此,我修改了程序数据文件读写框架,为每个类都添加了从输入输出流以二进制形式读取写入数据的成员函数。这一过程中,我采用了在主函数中调用读取跟保存函数的方法,而这两个函数分别遍历程序数据库,实现对每一个对象的读取或写入。为了程序简洁清晰,后续开发中我将主函数单独放在一个文件中,其他实用函数单独形成文件,增加程序可读性。调试中遇到的其他问题还有命令行UI的问题,例如无法顺利退出某一层菜单,这是由于循环无法正确跳出导致的。在需要结束运行的地方适当地加break或return语句就可以解决。经过反复的调试,除了一些命令行本身的限制例如无法屏蔽输入法、无法同时监视Esc与键盘输入等用户体验的细节问题外,没有已知的Bug。通过这一工程的调试,我认识到类对象不能够轻易地直接二进制写入文件,通常要单独设置读写方法来保证稳定和安全,这为今后的开发提供了指导。

五、结果分析

在源代码的组织上,第一次将源代码与工程文件分开保存,这样既便于跨平台编译,又利于保证安全防止误操作。类的定义单独保存为类名为文件名的.h和.cpp中,且头文件使用编译头保护,既避免了重复编译又减少了编译的工作量。

在数据的组织上,在直接二进制保存类对象的思路彻底失败之后,立即改为为每个类设置IO函数,保证了数据结构的稳定读写。美中不足在于,代码无法动态确定指针类型,只能将void指针通过switch强制转换为各类指针进行各种操作。这严重增加了重复的操作。

在代码的细节上,由于本学期学习的是输入输出流,而且大部分代码是在学期中逐渐积攒起来的,因此输入输出均采用了C风格的流输入输出,无视掉了Google C风格指引的建议。对于异常处理,根据Google的建议我没有采用C++风格的try-throw-catch结构,而是对于可以预见的非致命错误进行提示后继续运行,对于不可预见的致命性错误使用cerr输出后暂停程序。调试中并没有因为异常处理带来额外的麻烦,大部分的提示也都没有出现。

文件编码仍然是个大问题。果断地使用了GBK……上一次使用了先将代码页调成65001然后使用UTF-8的方法,虽然移植性可能好一点,但是调代码页之后Windows的命令行变得更难看了……这次全部编码都默认地使用了CP936,方便Windows上的运行。移植性神马的反正……不用移植就先不管了……

编译环境的选择。使用的仍然是Code::Blocks+自带MinGW的组合。32位编译器,在Windows 7 x64上编译并测试运行通过。调用了非标准库函数和C++ 11的特性,使用VS特别是老的VS编译不保证通过。[保证通不过我会说吗]

六、总结

虽然不是第一次写命令行UI的程序,也不是第一次写一千行以上的程序,但这次的程序开发还是给我带来了很大的收获。最大的收获就是类对象的IO吧,不能直接写到文件里的,只能保存数据成员,特别是有虚函数这种情况。其他的就是一些细节上比较零碎的收获了,总之有了这次开发经验,今后对C++的驾驭应该会更加轻车熟路。感谢老师为大家提供了这样一个提高自己的机会!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神仙别闹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值