用C语言编写打卡机
- 任务描述
- 开发环境
- 代码结构
- 在Code过程中遇到的问题和解决
- C语言里没有class的,可以写 .c 和 .h 把代码从main() 里分离出来
- static 和 extern 定义的变量的使用
- 指针和数组的使用
- goto跳出循环的使用
- 常用的函数及库函数
- QT Creator 设置编辑好的注释块添加注释格式
任务描述
一款记录员工上下班打卡时间的C语言程序。首先输入员工的编号以及验证码。验证码的输入有三次机会。输入正确的验证码,程序会询问员工是否要打卡。
每天要记录上班和下班的打卡时间。是否迟到以及加班时间长短也要同时记录到员工当天的信息里去。实行弹性工作制,迟到的计算要考虑到上一天的加班时长。
下班的时候打卡会记录当天的工作时长,如果没有达到规定的上班时长,程序会询问是否要重新打卡,获得员工的输入之后再记录。
每周五下班之后生成本周的考勤记录,记录里包括本周上班的平均时长、迟到和早退的次数以及缺卡次数。
开发环境
Windows 10
QT Creator 4.11.1(Community)
代码结构
打卡机flowchart的流程图:
在Code过程中遇到的问题和解决
C语言里没有class的,可以写 .c 和 .h 把代码从main() 里分离出来
- C语言仅仅支持的容器时原生数组,字符串是用原生字符数组来实现的
- 可以用struct存储不同类型的数据项[^1]
#include <stdio.h>2#include <time.h>34int main(int argc, char *argv[]) {5 char len[20] = {0};67 time_t timep;8 time(&timep);9
10 struct tm *p;
11 p = gmtime(&timep);
12
13 snprintf(len, 20, "%d-%d-%d %d:%d:%d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec);
14
15 printf("\n%s\n", len);
16 return 0;
17}
运行结果
1baoshaohua:test bao$ ./test
2
32020-3-25 9:51:42
4baoshaohua:test bao$
static 和 extern 定义的变量的使用
- 在程序中按照星期的每一天定义了两个一维int数组,在每个数组里存储了打卡的时间、星期一到星期五分别以数字1 - 5来代替、加班时长和是否早退的信息。这十个int类型的一维数组定义为static在包含main()方法的main.c里, 其它文件里使用extern关键字来获取这些变量。
main.cint WEEKDAY_DATA_IN[10];
calculatorAndWriteData.cextern int WEEKDAY_DATA_IN[10];
- static 和 extern的区别
static | extern |
---|---|
只能在本文件中访问,写在方法外部 | 用来获取全局变量的值 |
只有一份内存 | 不能用于定义变量 |
所有文件共享extern联合使用 | 先在当前文件查找有没有全局变量,没有找到,才会去其他文件查找 |
指针和数组的使用
- 在转换系统当前时间为一个 int 类型的数组时,返回值用了指针,因为在C语言里是不能返回数组的。
- int 类型的数组用来存放关于时间的信息,包括 {second, minute, hour, day in month, month, year, day in week, amount of extra work, if late to work}
- 指针在使用前必须先赋值
goto跳出循环的使用
- 和 goto 有同样功能可以跳出循环的有 return 和 break
- retuen 是跳出整个函数体,break跳出循环体执行下一行代码
- goto 它本身有一个label 用来标记从循环体跳出后去哪里执行,有可能是循环体的下一行代码或者是函数体的某个位置
常用的函数及库函数
- 在代码里用到的函数有 scanf, printf, sort, fopen, getchar, putchar, malloc, free, abs, pow等
- UTF-8的编码格式输出不了中文,应采用GBK系列的编码