C语言小项目—上下班打卡机(核心功能实现)
项目简介:
应市场需求,某工程师现设计了一款新上下班打卡机,打卡机具有以下功能:
(1) 上班打卡,员工具有编号(首位为 1 的六位编号),输入编号后,再
输入校验码,校验码生成规则:员工编号除首位反序,再与员工编号
求和,如:员工编号,110086,校验码为 178087。校验码错误即打
卡失败。记录打卡时间
(2) 下班打卡,只需输入员工编号即可。记录打卡时间,显示该人员今天
上班时长,如果上班时长不够,显示早退 xx 分钟。可以更新下班打
卡时间。无下班打卡显示缺卡。
(3) 可以设置规定上班时长,如 9 小时
(4) 测试需要可以规定 6 秒=实际 1 小时,每次测试,输入指令后,开启
打卡机,打卡机开启模拟时间为:周一早上七点。程序运行结束为周
五晚 12 点。
(5) 实行弹性打卡制,如前一天上班时长超过规定时长 3 小时以上,第
二天迟到 2 小时以内不算迟到。
(6) 打卡机运行结束之前,每周该打卡机会生成每周考勤周报,显示周平
均上班时长,周迟到,早退,缺卡次数等。
任务过程:
1、创建项目
2、合理定义所需函数,主函数中只允许有 clockin_machine_start()调用
3、按照任务概述实现函数流程
4、调试修改
测试及部分代码:
一、上班时长设置
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include "Global.h"
void ClockIn_machine_start();
void ClockIn();
void ClockOut();
int Check();
void ReHours();
void UpDateTime(int pattern);
void WeekChart(int day, int duringTime);
int number; //员工编号
int pattern = 1; //打卡模式(1为上班打卡,2为下班打卡)
int startTimes[5] = {
0 }; //上班打卡次数限制(每日1次)
int stopTimes[5] = {
0 }; //下班打卡次数限制(每日3次,允许误打)
clock_t openTime, insert, start, stop;
long duration; //打卡持续时长
int officeHours = 9; //上班时间,默认为9小时
int day = 0; //打卡日期
int hour; //打卡当天时间(时)
int minute; //打卡当天时间(分)
int duringTime; //实际上班时间
int times_1 = 0; //迟到次数
int times_2 = 0; //早退次数
int times_3 = 0; //缺卡次数
int chart[5] = {
0 };
int main(int argv, char *argc[]) {
ClockIn_machine_start();
system("PAUSE");
return 0;
}
void ClockIn_machine_start()
{
//规定上班时间
ReHours();
while (1)
{
//打卡模式选择
printf("\n***************************************************************\n\n");
printf(" 1.上班打卡\n");
printf(" 2.下班打卡\n");
printf(" 3.当前时间\n");
printf("\n***************************************************************\n\n");
printf("输入“3”可获取当前时间\n输入“1”或“2”进行打卡模式选择:\n");
scanf_s("%d", &pattern);
if (pattern == 1)
{
if (startTimes[day] == 0) {
//上班打卡
ClockIn();
}
else
{
printf("请勿在一天中重复上班打卡\n");
UpDateTime(0);
}
}
else if (pattern == 2)
{
if (stopTimes[day] < 3) {
//下班打卡
ClockOut();
}
else
{
printf("今日下班打卡次数已达上线\n");
UpDateTime(0);
}
}
else if (pattern == 3)
{
//显示当前时间
UpDateTime(0);
}
else
{
printf("打卡失败,请输入正确的指令!!!\n");
}
}
}
void ReHours()
{
printf("***************************************************************");
printf("\n\n 上班时长设置\n");
printf("\n***************************************************************\n\n");
char reFlag = 'n';
printf("是否自定义上班时长(默认上班时长为 9 小时) [Y/n]\n");
reFlag = getchar();
if (reFlag == 'Y' || reFlag == 'y')
{
printf("设置上班时长:\n");
scanf_s("%d", &officeHours);
}
printf("打卡机开启\n");
openTime = clock(); //设置好打卡时长后,打卡机开启
}
二、上班打卡
void ClockIn()
{
printf("\n***************************************************************");
printf("\n\n 上班打卡");
printf("\n");
printf("\n***************************************************************\n\n");
int checkFlag = 0;
//效验编号
checkFlag = Check();
if (checkFlag)
{
int checkNumber;
int tempNumber;
int times = 0;
checkNumber = number + number % 10 * 10000 + (number % 100 - number % 10) * 100
+ (number % 1000 - number % 100) + number % 10000 / 1000 * 10 + number % 100000 / 10000;
printf("效验码:%d\n", checkNumber);
printf("请输入上述效验码:\n");
scanf_s("%d", &tempNumber)