创作背景
轮班,顾名思义,就是员工按照轮休制度参加工作的时间,一般分为“两班倒”和“三班倒”,而对于员工而言,轮班表就是他们上下班的工作时间表。现行很多大众化的日历或者app中都无法实现自动编排轮班,导致部分员工如果需要超前知晓轮班时间就需要一轮一轮递推,过程十分繁琐,而且容易出错。于是,一个能够查询员工轮班时间的执行文件就十分有必要了。2021年2月12日晚,笔者父亲来电,希望能够编出一种帮他查询轮休的代码或者可执行文件。挂断电话后,稍作思考,便有了思路,第二天上午经过几轮修改,一种基于C语言的轮班查询器得以完善。
具体要求
笔者父亲工作的地方是按照“三班倒”的轮休制度来操作的,总共分为“甲、乙、丙、丁”四种班组,分别按照不同的作息上班,但总体轮休办法基本一致,具体为“晚班、早班、中班、休息”四种工作时间,按照“晚班、早班、中班、休息”的顺序,每种工作时间执行两天,往复递推,例如,星期一二是晚班、星期三四是早班、星期五六是中班、星期日和下星期的星期一则为休息,往复轮休。该轮班查询器不仅要满足以上条件,并且希望能够查询轮休的同时,知晓星期。
编写思路
1、由于是四种班组,因此就可以定义一个一维数组,数组中储存分别表示“甲、乙、丙、丁”四种班组的代码,代码运行前,首先咨询使用者班组,再进行下一步操作。
2、首先设定“甲、乙、丙、丁”四种班组的某一日期的轮班代码,如2021年1月1日甲班是早班第二天,再让用户输入某个日期,拿用户输入的日期与所设定的固定日期进行比较,计算差值,得到该日期与前面设定的固定日期的差,再利用每八天轮班一次,用差值除以8取余,得到余数,余数“1、2、3、4、5、6、7、8”分别对应“晚班第一天、晚班第二天、早班第一天、早班第二天、中班第一天、中班第二天、休息第一天、休息第二天”。
3、计算星期。利用基姆拉尔森计算公式计算该日期的星期,w = ( day + 2month +3(month+1)/5 + year + year/4 - year/100 +year/400)%7,根据已知公元1年1月1日星期一来推算。其中,要把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
4、如果输入日期与设定固定日期的差值超过一年,则利用循环来重复定义固定日期和轮休代码,即“自适应环境变化”。
实现效果演示
源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
*运行软件:Visual C++
*作者:彭晟祺
*完成日期:2021年2月12日
*/
int main()
{
int year0,month0,day0,year,month,day,lunban,runnian,a,b,c,d,e,n,m,i,x;
char weekname[][10]={
1,2,3,4,5,6,7};
printf("轮班查询器 V1.3\n\n开发者:祺祺\n完善时间:2021年2月13日\n班次说明:1-甲班、2-乙班、3-丙班、4-丁班\n前言:由于作者水平有限,软件运行过程中难免会出现bug,数据仅供参考,希望使用者批评指正!\n\n\n");
printf("按回车键确认\n");
repeat:
printf("\n请按照班次说明输入班次代码(例如:1):");
scanf("%d",&i);
switch(i)
{
case 1:
lunban=4;
printf("\n您的班次为:甲班\n");
break;
case 2:
lunban=6;
printf("\n您的班次为:乙班\n");
break;
case 3:
lunban=8;
printf("\n您的班次为:丙班\n");
break