基于C语言的轮班查询器

基于C语言的轮班查询器

  • 创作背景
  • 具体要求
  • 编写思路
  • 实现效果演示
  • 源码
  • 心得与不足

创作背景

轮班,顾名思义,就是员工按照轮休制度参加工作的时间,一般分为“两班倒”和“三班倒”,而对于员工而言,轮班表就是他们上下班的工作时间表。现行很多大众化的日历或者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、如果输入日期与设定固定日期的差值超过一年,则利用循环来重复定义固定日期和轮休代码,即“自适应环境变化”。

实现效果演示

基于C语言的轮班查询器_第1张图片

源码

#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;
	case 4:
		lunban=2;
		printf("\n您的班次为:丁班\n");
		break;
	}
	printf("\n请输入正确格式的日期(例如:2021.1.1):");

	scanf("%d.%d.%d",&year,&month,&day);

	year0=2021;
	e=year-year0;
	n=1;m=0;

	//lunban=2;
	//1为晚班第一天,2为晚班第二天,3为早班第一天,4为早班第二天,5为中班第一天,6为中班第二天,7为休息第一天,8为休息第二天
	year0=2021;
	month0=1;
	day0=1;
	if(e>0)
	{
     


		for(;e>0;e--)
		{
     
		runnian=0;
		a=0;b=0;c=0;

		c=365*n+m*366;

		while(c>0)
		{
     
			lunban++;
			c--;
		}

		if(lunban>7)
			lunban=lunban%8;
		year0++;

		if(year0%4==0)
		{
     
			n=0;m=1;
		}
		else
		{
     
			n=1;m=0;
		};
		}
		goto end;
	}


end:
	runnian=0;
	a=0;b=0;c=0;

	//判断闰年
	if(year%4==0)
	{
     
		runnian=1;
		b=29;
	}
	else
	{
     
		runnian=0;
		b=28;
	}

	a=day-day0;
	d=month-month0;

	switch(d)
	{
     
	case 0:
		c=a+c;
		break;
	case 1:
		c=31+a+c;
		break;
	case 2:
		c=31+b+a+c;
		break;
	case 3:
		c=31+b+31+a+c;
		break;
	case 4:
		c=31+b+31+30+a+c;
		break;
	case 5:
		c=31+b+31+30+31+a+c;
		break;
	case 6:
		c=31+b+31+30+31+30+a+c;
		break;
	case 7:
		c=31+b+31+30+31+30+31+a+c;
		break;
	case 8:
		c=31+b+31+30+31+30+31+31+a+c;
		break;
	case 9:
		c=31+b+31+30+31+30+31+31+30+a+c;
		break;
	case 10:
		c=31+b+31+30+31+30+31+31+30+31+a+c;
		break;
	case 11:
		c=31+b+31+30+31+30+31+31+30+31+30+a+c;
		break;
	}
	while(c>0)
	{
     
		lunban++;
		c--;
	}
	if(lunban>7)
		lunban=lunban%8;

	//星期计算
	if((month == 1) || (month == 2)){
     
		month += 12;
		year--;
	}
	x= (day+2*month+3*(month + 1)/5+year+year/4-year/100+year/400)%7;
	printf("\n您输入的日期是:星期");
	switch(x)
	{
     
	case 0:
		printf("一");
		break;
	case 1:
		printf("二");
		break;
	case 2:
		printf("三");
		break;
	case 3:
		printf("四");
		break;
	case 4:
		printf("五");
		break;
	case 5:
		printf("六");
		break;
	case 6:
		printf("日");
		break;
	}
	printf("\n");

	//输出
	printf("\n按轮休制您那天是:");
	switch(lunban)
	{
     
	case 1:
		printf("晚班的第一天");
		break;
	case 2:
		printf("晚班的第二天");
		break;
	case 3:
		printf("早班的第一天");
		break;
	case 4:
		printf("早班的第二天");
		break;
	case 5:
		printf("中班的第一天");
		break;
	case 6:
		printf("中班的第二天");
		break;
	case 7:
		printf("休息的第一天");
		break;
	case 0:
		printf("休息的第二天");
		break;
	}

	printf("\n\n");
	system("pause");
	goto repeat;
	return 0;
}

心得与不足

1、首先,先说不足之处,程序员编程序最忌讳的就是多次使用goto语句,这样会使代码逻辑乱,并且很容易出现大幅bug,因此,一般编写程序都会限用goto语句,由于笔者水平有限,所编写的代码中两次使用了goto语句。
2、通过这次实践,也让笔者体会到了C语言的奇妙之处,能够用所学解决实际问题,也让笔者对编程更加感兴趣了,笔者也会更加努力学习下去,大家一起加油,共同进步!

你可能感兴趣的:(c语言,编程语言,c++)