原本这个帖子,是由回复组成的,整个代码分布在各个回复里面,读者不好阅读,现在整个把它们放到正文,方便查看。

这是早期写的一个,仅仅是简单的考勤系统,大致功能是有的,但并未写的很牛叉,采用了文本来记录考勤数据,供小菜一览。

[cpp] view plaincopy
  1. //头文件:emp_head.h
  2. #ifndef EMP_HEAD_H
  3. #define EMP_HEAD_H
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #define MAXNUM 1000
  7. enum {
  8. NORMAL           = 0,
  9. ABSENT           = 1,
  10. WORK_LATE        = 2,
  11. LEAVE_EARLY      = 3,
  12. LATE_AND_LEARLY  = 4,
  13. PUNCH_ABNORMAL   = 5
  14. };
  15. enum {
  16. ERR_TIME_INVALID  = 1,
  17. ERR_ID_INVALID    = 2,
  18. ERR_CMD_INVALID   = 3,
  19. ERR_EXIT_SYS      = 9
  20. };
  21. struct emp_data
  22. {
  23. int id;
  24. char name[8];
  25. int type;
  26. char check_in[16];//19:58 20110804
  27. char check_out[16];
  28. int work_time; //1208 --> 12H12M
  29. } emp_data1;
  30. int cmd_process(char* cmdx);
  31. void p_err(int err);
  32. int check_time(char *time);
  33. int check_type(char *check_in, char *check_out);
  34. void th_func(void);
  35. void print_help(void);
  36. int clean_data(char *fileaddr);
  37. int request_data(char *fileaddr, char* cmdx);
  38. int check_inout(char *fileaddr, char* cmdx);
  39. int type_check(char* check_in, char *check_out, int* outlen);
  40. char* ret_typestr(int typecode);
  41. //char* analy_cmd(char* cmdx, int* n);
  42. #endif  //end EMP_HEAD_H

以下内容全部为一个c文件(主c文件),其实也就只有这个c文件。加上上面的头文件,整个可以编译通过生成我们的考勤系统。只是因为CSDN的语法高亮做的不好,如果代码太长的话,整个网页加载起来很慢,所以就分开为几小段了。

另外关于输入检查这一块,之前没有写一个函数,结果这个程序只能固定多少个字符,来进行偏移,少了不行,多了也不行,全都是用指针偏移来操作的。后来写了个函数(请参考从符号分隔的命令行获取任意参数的函数(逗号分隔,空格分隔等都可以)(2011-12-29 01:04)) ,但是,由于太懒,所以没有改写这个考勤系统。留给读者改改吧。

[cpp] view plaincopy
  1. /*
  2. *主c文件
  3. *author:duanxufang
  4. *time:
  5. *description:考勤系统
  6. *
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <pthread.h>
  11. #include <string.h>
  12. #include "../include/emp_head.h"
  13. #define FILE_IN "emp_record.datafile"
  14. struct emp_data record[MAXNUM] = {0};
  15. int main()
  16. {
  17. pthread_t th_id;
  18. printf("will create thread!\n");
  19. if(pthread_create(&th_id, NULL, (void*)th_func, NULL))
  20. {
  21. printf("create thread error!\n");
  22. exit(1);
  23. }
  24. if(pthread_join(th_id, NULL))
  25. {
  26. printf("thread quit error!");
  27. exit(1);
  28. }
  29. return 0;
  30. }
[cpp] view plaincopy
  1. void p_err(int err)
  2. {
  3. switch(err)
  4. {
  5. case ERR_TIME_INVALID : printf("[ERR:TIME INVALID]\n"); break;
  6. case ERR_ID_INVALID : printf("[ERR:ID INVALID]\n"); break;
  7. case ERR_CMD_INVALID : printf("[ERR:COMMAND INVALID]\n"); break;
  8. case 0 : break;
  9. default: printf("ERR:Not Known!\n");
  10. }
  11. return ;
  12. }
  13. void th_func(void)
  14. {
  15. char input_cmd[256] = {0};
  16. print_help();
  17. while(printf("cmd here>"),gets(input_cmd))
  18. {
  19. int err_no = 0;
  20. if((err_no = cmd_process(input_cmd)) == ERR_EXIT_SYS)
  21. {
  22. printf("EXIT SYSTEM\n");
  23. break;
  24. }
  25. p_err(err_no);
  26. printf("\nplease input next cmd:\n");
  27. }
  28. return ;
  29. }
  30. void print_help(void)
  31. {
  32. printf("--------cmd help:-----------\n\"0\":clean all the records \"1\":checktime input\n");
  33. printf("\"2\":request records q/Q for quit system\n");
  34. printf("h/H for help\n");
  35. printf("cmd format is: 1,0001,duan001,18:56\n \
  36. [id] like 0001 must be 4 chars\n \
  37. [name] like duan001 must be 7 chars\n");
  38. printf("--------cmd help end--------\n");
  39. return ;
  40. }
  41. int cmd_process(char* cmdx)
  42. {
  43. printf("Your cmd: %s\n", cmdx);
  44. int cmd_id = (int)(cmdx[0]-'0');
  45. switch(cmd_id)
  46. {
  47. case 0: clean_data(FILE_IN); break;
  48. case 1: check_inout(FILE_IN, cmdx); break;
  49. case 2: request_data(FILE_IN, cmdx); break;
  50. case 'h'-'0':
  51. case 'H'-'0': print_help(); break;
  52. case 'q'-'0':
  53. case 'Q'-'0': return ERR_EXIT_SYS; //quik system;
  54. default: return ERR_CMD_INVALID;
  55. }
  56. return 0;
  57. }
  58. int clean_data(char *fileaddr)
  59. {
  60. int count = 0;
  61. char buf[60000];
  62. int read_n = 0;
  63. int i = 0;
  64. struct emp_data *pemp = (struct emp_data *)buf;
  65. FILE *fptr;
  66. printf("clean_data()\n");//for debug
  67. if(!(fptr = fopen(FILE_IN, "w")) )
  68. {
  69. printf("in clean _data open file[%s] failed!\n", FILE_IN);
  70. return 1;
  71. }
  72. if(!(read_n = fread(buf, 1, 60000, fptr)))
  73. {
  74. printf("no record!");
  75. return 1;
  76. }
  77. count =read_n/(sizeof(struct emp_data));
  78. for(i =0; i < count; i++)
  79. {
  80. pemp[i].type = PUNCH_ABNORMAL;
  81. strcpy(pemp[i].check_in, "");
  82. strcpy(pemp[i].check_out, "");
  83. pemp[i].work_time = 0;
  84. }
  85. fwrite(buf, 1, read_n, fptr);
  86. read_n = fread(buf, 1, 60000, fptr);
  87. for(i =0; i < count; i++)
  88. {
  89. printf("%d ", pemp[i].id);
  90. printf("%s ", pemp[i].name);
  91. printf("%s ", ret_typestr(pemp[i].type));
  92. printf("%s ", pemp[i].check_in);
  93. printf("%s ", pemp[i].check_out);
  94. printf("%d\n", pemp[i].work_time);
  95. }
  96. fclose(fptr);
  97. return 0;
  98. }
[cpp] view plaincopy
  1. //request_data
  2. int request_data(char *fileaddr, char* cmdx)
  3. {
  4. int count = 0;
  5. char buf[60000];
  6. int read_n = 0;
  7. int i = 0;
  8. struct emp_data *pemp = (struct emp_data *)buf;
  9. printf("in request_data()\n");
  10. FILE *fptr;
  11. if(!(fptr = fopen(FILE_IN, "r")) )
  12. {
  13. printf("in request_data open file[%s] failed!\n", FILE_IN);
  14. return 1;
  15. }
  16. if(!(read_n = fread(buf, 1, 60000, fptr)))
  17. {
  18. printf("no record!");
  19. return 1;
  20. }
  21. count =read_n/(sizeof(struct emp_data));
  22. if(strlen(cmdx)==1)
  23. {
  24. for(i =0; i < count; i++)
  25. {
  26. printf("%4d ", pemp[i].id);
  27. printf("%10s ", pemp[i].name);
  28. printf("%-16s ", ret_typestr(pemp[i].type));
  29. printf("%6s ", pemp[i].check_in);
  30. printf("%6s ", pemp[i].check_out);
  31. printf("%6d\n", pemp[i].work_time);
  32. }
  33. }
  34. else
  35. {
  36. for(i =0; i < count; i++)
  37. {
  38. if(pemp[i].id==atoi(cmdx+2))
  39. {
  40. printf("%4d ", pemp[i].id);
  41. printf("%10s ", pemp[i].name);
  42. printf("%-16s ", ret_typestr(pemp[i].type));
  43. printf("%6s ", pemp[i].check_in);
  44. printf("%6s ", pemp[i].check_out);
  45. printf("%6d\n", pemp[i].work_time);
  46. }
  47. }
  48. }
  49. fclose(fptr);
  50. return 0;
  51. }
  52. //check_inout的前半部分
  53. int check_inout(char *fileaddr, char* cmdx)
  54. {
  55. //取得数量
  56. int count = 0, read_n = 0;
  57. int worktime_len = 0;
  58. int i = 0;
  59. char buf[60000]={0};
  60. int emp_id = atoi(cmdx+2);
  61. struct emp_data *pemp = (struct emp_data *)buf;
  62. printf("in check_inout() \n");
  63. if(strlen(cmdx)<=2)
  64. {
  65. p_err(ERR_CMD_INVALID);
  66. return 1;
  67. }
  68. if((atoi(cmdx+2)>1000)||(atoi(cmdx+2)<1))
  69. {
  70. p_err(ERR_ID_INVALID);
  71. return 1;
  72. }
  73. //检查时间格式
  74. if((cmdx[17]!=':')||(atoi(cmdx+15)>23)||(atoi(cmdx+15)<0)||
  75. (atoi(cmdx+18)>59)||(atoi(cmdx+18)<0))
  76. {
  77. p_err(ERR_TIME_INVALID);
  78. return 1;
  79. }
  80. FILE *fptr;
  81. if(!(fptr = fopen(FILE_IN, "r+")) )
  82. {
  83. printf("open file[%s] failed!\n", FILE_IN);
  84. return 1;
  85. }
  86. read_n = fread(buf, 1, 60000, fptr);
  87. printf("read_n is: %d \n", read_n);
  88. count =read_n/(sizeof(struct emp_data));
  89. fclose(fptr);
  90. check_inout的中间部分
  91. for(i = 0; i < count; i++)
  92. {
  93. if( (pemp->id)== emp_id)
  94. {
  95. //更新刷卡记录
  96. //strncpy 后面这个参数6害惨了我! 其实编译的时候会提示一个strncpy的警告!
  97. strncpy(pemp->check_out, cmdx+15, 6); //!!!之前的值为5,最后必需写一个'\0',且这个'\0'包含在6中会发生段错误
  98. //printf("-------typecheck----");
  99. pemp->type = type_check(pemp->check_in, pemp->check_out, &worktime_len);
  100. pemp->work_time = worktime_len;//worktime();
  101. if(!(fptr = fopen(FILE_IN, "w")) )
  102. {
  103. printf("open file[%s] failed!\n", FILE_IN);
  104. return 1;
  105. }
  106. read_n=fwrite(buf,1,count*(sizeof(struct emp_data)),fptr);
  107. fclose(fptr);
  108. printf("if [0 count]---write bytes :%d\n", read_n);
  109. break;
  110. }
  111. pemp++;
  112. }
  113. //如果不存在这个人的刷卡记录,包括没有任何记录
  114. if(i == count)
  115. {
  116. //把结构数据集的指针指向要写入数据的位置
  117. struct emp_data emp_data2;
  118. pemp = &emp_data2;
  119. pemp->id = emp_id;
  120. bzero(pemp->name, 8);
  121. strncpy(pemp->name, cmdx+7, 7);//必需拷贝7个字符,最后一个字符置为'\0'
  122. pemp->type = PUNCH_ABNORMAL;
  123. strncpy(pemp->check_in, cmdx+15, 6);
  124. strcpy(pemp->check_out, "");
  125. pemp->work_time = 0;
  126. if(!(fptr = fopen(FILE_IN, "a")) )
  127. {
  128. printf("open file[%s] failed!\n", FILE_IN);
  129. return 1;
  130. }
  131. read_n=fwrite(pemp,1,sizeof(struct emp_data),fptr);
  132. fclose(fptr);
  133. printf("if i== count---write bytes :%d,count %d\n", read_n, count);
  134. }
  135. return 0;
  136. }
  137. //检查早退迟到等,并可以计算工时,工时通过outlen指针输出
  138. int type_check(char* check_in, char *check_out, int* outlen)
  139. {
  140. int in_hh, in_mm;
  141. int out_hh, out_mm;
  142. int hh = 0, mm = 0;
  143. int flaglate = 0, flagearly = 0;
  144. int flagt =0;
  145. printf("in type_check()\n");
  146. if((strlen(check_in)>1)&&(strlen(check_out)>1))
  147. {
  148. in_hh = atoi(check_in);
  149. in_mm = atoi(check_in+3);
  150. out_hh = atoi(check_out);
  151. out_mm = atoi(check_out+3);
  152. if((in_hh>8)||((in_hh==8)&&(in_mm>0)))
  153. {
  154. flaglate = 1;
  155. flagt = WORK_LATE;
  156. }
  157. if((out_hh<17)||((out_hh==17)&&(out_mm<30)))
  158. {
  159. flagearly = 1;
  160. flagt = LEAVE_EARLY;
  161. }
  162. if((in_hh>17)||((in_hh==17)&&(in_mm>=30))||
  163. (out_hh<8)||((out_hh==8)&&(out_mm==0)))
  164. {
  165. printf("----1----abs");
  166. flagt = ABSENT;
  167. }
  168. if(flaglate&&flagearly)
  169. {
  170. flagt =LATE_AND_LEARLY;
  171. }
  172. }
  173. else if((strlen(check_in)<1)&&(strlen(check_out)<1))
  174. {
  175. printf("----2----abs");
  176. flagt = ABSENT;
  177. }
  178. else
  179. {
  180. flagt = PUNCH_ABNORMAL;
  181. }
  182. //如果,参数outlen== -1 则不计算工时,否则计算
  183. if(*outlen == -1) goto ret;
  184. if((flagt == ABSENT)||(flagt == PUNCH_ABNORMAL)) //之前这里flagt == ABSENT少打了一个=号,害得结果又错了
  185. {
  186. *outlen = 0;
  187. }
  188. else
  189. {
  190. if(in_mm<=out_mm)
  191. {
  192. *outlen = (out_hh-in_hh)*100 + (out_mm-in_mm);
  193. }
  194. else
  195. {
  196. *outlen = (out_hh-in_hh-1)*100 + 60 + (out_mm-in_mm);
  197. }
  198. }
  199. ret: return flagt;
  200. }
  201. char* ret_typestr(int typecode)
  202. {
  203. switch(typecode)
  204. {
  205. case 0: return "NORMAL";
  206. case 1: return "ABSENT";
  207. case 2: return "WORK_LATE";
  208. case 3: return "LEAVE_EARLY";
  209. case 4: return "LATE_AND_LEARLY";
  210. case 5: return "PUNCH_ABNORMAL";
  211. default: return "typecode not know!";
  212. }
  213. }

自己早期写的一个简单上下班打卡统计工时的考勤系统【整理版】相关推荐

  1. easy-mock写的一个简单的模拟二页的反馈

    用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...

  2. AndroidSDK开发6我用kotlin协程写了一个简单sdk

    目录 AndroidSDK开发6我用kotlin协程写了一个简单sdk 1.kotlin的依赖和导包如下:(//如果不使用协程可以去掉协程的导包减少sdk包大小) 2.Application代码如下: ...

  3. 用shell脚本写的一个简单的俄罗斯方块

    用shell脚本写的一个简单的俄罗斯方块 代码 代码 测试 下载链接 代码 代码 #!/bin/bash #version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程 #定义用于 ...

  4. 最近写了一个简单的面向对象的脚本语言 Q 语言

    最近写了一个简单的面向对象的脚本语言 Q 语言,语法类似于 Javascript, 加入了一些 python 的语法功能. 同时实现了部分的 Javascript prototype 的功能 (个人觉 ...

  5. 自己写的一个简单的android记事本app

    自己写的一个简单的记事本app,效果如下: 一.首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayout中嵌套一个listview布局,最下面是一个button.下面附 ...

  6. 用li写的一个简单的横向导航菜单demo

    用ul li写的一个简单的横向导航菜单,很实用: /* 所有class为menu的div中的ul样式 */ div.menu ul { list-style:none; /* 去掉ul前面的符号 */ ...

  7. 如何复制java卡,使用java做一个简单的集卡程序

    使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...

  8. php实现一个简单的访客统计功能

    文章来源:https://www.zixuephp.net/article-113.html 对我帮助非常大,谢谢 一.文件方式简单统计 用php实现一个简单的访客统计功能,统计网站的总访问量是多少, ...

  9. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

最新文章

  1. 【AWSL】之Linux账号和权限管理(/etc/passwd、/etc/shadow、useradd、passwd、usermod、groupadd、gpasswd...chmod、chown)
  2. 【深度学习】吴恩达网易公开课练习(class1 week3)
  3. exchanger_如何通过示例在Java中使用Exchanger
  4. [Violation] Added non-passive event listener to a scroll-blocking ‘mousewheel‘ event.
  5. 把Scala代码当作脚本运行
  6. Node.js从零开发Web Server博客项目笔记
  7. vue获取输入框得内容_React入坑(四):获取输入框内的内容
  8. 糖果浏览器和139邮箱巧妙应用:将网页文字一键发送到手机上
  9. mysql安装忘了root_MySQL - 安装:MySQL忘记root密码的解决办法
  10. 原生js实现动态生成表格
  11. 计算机标点符号怎么切换,标点符号转换键是什么?
  12. mindspore比pytorch快?是的
  13. 魔兽世界8.0哪个服务器稳定,魔兽世界活得最安逸的BOSS!8.0版本才拿到7.0服务器首杀!...
  14. 六大设计原则(SOLID)备忘
  15. MuMu模拟器进行adb操作
  16. 数据分析统计学基础笔记
  17. 新东方托福词汇(List 36 ~ List 40)
  18. 程序员裸辞全职接单一个月的感触
  19. 【外文翻译】图像中的傅里叶变换
  20. busybox tools

热门文章

  1. 影响IPSec的网络问题
  2. 新一代的数据库SQL审计服务 - SQL洞察
  3. DELPHI XE3 UPDATE2 出来了
  4. 谷歌excel表格批量翻译各国语言
  5. 为什么大部分的股票level2接口都要收费?
  6. 网上搜集到iOS开发中获取手机IDFA,手机序列号,设备名称,别名,分辨率等信息,这里做个总结
  7. Pell数列(递归)
  8. Google Earth Engine(GEE)——MODIS/006/MCD19A2气溶胶数据AOD数据去云去雪分析(北京市为例)
  9. m227只有一台计算机,惠普m227fdw单面打印如何设置_惠普m227fdw怎么设置单面打印-硬件之家...
  10. python可以采用交互式的()执行方式,Python语句既可以采用交互式的____执行方式,又可以采用____执行方式。...