中兴内部考题求解
考勤系统:
系统通过读取Socket输入的员工刷卡记录,分析员工的考勤信息,输出考勤结果
系统启动,从员工信息文件(employee.txt)中读取员工列表,输入文件内容格式为“工号,姓名”(工号为1~1000的随机正整数,包括1和1000,工号与姓名之间用半角的逗号分隔,姓名最多不超过5个汉字或10个英文字母,最少1条最多10条员工记录)
参考如下:
5,NAME1
2,NAME2
3,NAME3
不考虑空文件或文件不存在的情况以及所有的数据异常的情况(员工信息文件与系统可执行程序处与同一目录)
系统启动成功后,从Socket接受命令(Socket已封装好并提供给考生),考勤信息及具体指令都从Socket输入,命令的具体定义见接口,系统根据命令执行相应的动作。
规则:
1、规定上班时间为8:00~17:30,所有刷卡时间都精确到分
2、考勤类型说明
考勤类型分为:“NORMAL(正常),ABSENT(旷工),WORK LATE(迟到),LEAVE EARLY(早退),WORK LATE&LEAVE EARLY(既迟到又早退),PUNCH ABNORMAL(刷卡异常)”
2.1没有刷卡记录
当天没有刷卡记录,算旷工,工时记为0
2.2刷卡记录不完整
当天只有一次刷卡记录,算刷卡异常,不算旷工、迟到、早退,工时记为0,查询时,该刷卡时间显示为上班时间
2.3刷卡记录完整
(1)当天有两次或两次以上刷卡记录时(如果两次刷卡时间相同,也算两次正常的刷卡记录),最早的算上班,最晚的算下班。
(2)有两次完整的刷卡记录,上班时间晚于规定的上班时间算迟到,但如果上班时间等于或晚于规定的下班时间,则算旷工,工时记为0。
(3)有两次完整的刷卡记录,下班时间遭遇规定的下班时间算早退,但如果下班时间等于或遭遇对顶的上班时间,则算旷工,工时记为0。
(4)迟到、早退可以同时存在。
3、每个员工可以输入多条check记录,输入的check记录不一定按时间排序。
4、工时:下班时间 上班时间,格式为“XXHXXM”(XX小时XX分),如:8H0M。
下班时间:员工实际的下班时间。
上班时间:刷卡上班时间与实际上班时间之间取较晚时间
(8:00之前的时间不算工时,工时计算不需要扣除休息时间)
例如某员工的刷卡记录为:
07:40
08:20
20:30
该员工的工时:20:30 - 8:00 = 12:30 (12H30M)
命令接口说明:
一、清空所有刷卡记录(START)
命令字cmdID = 0
命令格式:cmdID
例如: 0
说明:收到之后,清空所有员工的check记录,在客户端输出“OK”
可以调用系统提供的接口 print error string
二、刷卡(CHECK)
命令字 cmdID = 1
命令格式:cmdID,employee,checkTime
例如:1,2,07:30
说明:TIME为24小时制,有效时间为0:00~23:59,时与分都固定为2位,时间中间的冒号为半角冒号,不用考虑时间格式错误的情况,但要考虑时间取值非法的情况。
如果工号不存在,或ID值非法在客户端输出“ERR:ID INVALID”。
如果时间非法,在客户端输出“ERR: TIME INVALID”。
如果正常,在客户端输出“OK”。
三、查询考勤信息(LIST)
命令字 cmdID = 2
命令格式:cmdID(,employeeID)括号内位可选部分,如果不给员工ID,则表示查询所有员工信息,但ID不存在或ID非法在客户端输出“ERR: IN INVALID”,否则在客户端输出完整报文(可以调用系统提供的接口“print report info”输出单条报文)
例如:查询ID为3的员工考勤信息:
ID = 3
NAME = abc
TYPE = NORMAL
CHECK IN = 08:00
CHECK OUT = 17:40
WORK TIME = 9H40M
如果查询所有,报文按ID从小到大排序输出
四、命令字错误
如果命令字错误,直接返回“ERR: COMMAND INVALID”
(版主注:推荐本贴的意思是给初学者一个比较完整的可以练手的例子,不是为了帮楼主解决就业问题,希望大家正确看待。by Mackz)
[解决办法]
这不就是要写一个程序吗?而且可以说是一个小小的课程设计了.出这么冗长的题的人脑袋进水了.
还是帮下楼主吧:
会用SOCKET吧? 如果不会就要学一下语法了,包括初始化\连接\收发数据\终止
然后是读写文件,这个应该会吧?文件读写可以用C语言方法也可以用MFC的方法.
再来就是逻辑分析了,主要是分析上下班时间的合法性,不合法的就应该算迟到或早退或旷工了.这个是最烦的一步,不过只是烦而已,只是比较一下时间段,应该也是难不倒楼主的.
最后.将上面整个过程串起来,就是你要的结果了.
[解决办法]