//考勤员登陆函数
int get_atten()
{
char num[20],password1[20],quanxian[20]="考勤员";
int flag=0,i;
printf("\n\n\n 请输入您的编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
for(u=head->next;u!= NULL;u=u->next)
{
if(strcmp(u->employee_number,num)==0 && strncmp(u->jurisdiction,quanxian,6)==0)
{
flag=1;
printf(" 请输入密码:"); //共有三次输入机会
for(i=0;i<3;i++)
{
scanf("%s",password1);
fflush(stdin); //清除缓冲区
if(strcmp(u->password,password1)==0) //判断输入密码是否一致
{
printf("\n 密码正确,登陆成功!");
printf("\n");
system("pause");
return 1;
break; //运行成功 ,跳出循环
}
else
{
if(i<2)
{
printf(" 密码错误,请重新输入:"); //若前面两次都输错,则报错
}
}
}
if(i>2)
{
printf(" 密码错误次数已达上限\n 将返回上一步,请重新选择登录身份!\n");
system("pause");
system("cls");
return 0;
}
}
}
if(flag==0)
{
printf("你还不是考勤员喔");
}
system("pause");
system("cls");
}
void atten()
{
int choice;
system("cls");
char name[8];
if(get_atten()) //调用密码函数,判断是否能够继续
{
system("cls");
strcpy(name,u->name);
while(1)
{
printf("\n\n\n 尊敬的%s小主您好,欢迎进入考勤信息管理系统!\n\n",name);
printf(" 考勤员模式\n\n\n");
printf(" ***********************考勤信息管理系统********************\n");
printf(" * *\n");
printf(" * 1.管理员工出勤信息 *\n");
//职员信息添加information_add()、删除information_del()、查询information_find()、修改information_modify()、存储information_storage()功能
printf(" * *\n");
printf(" * 2.查询某部门全体职工出勤信息 *\n");
printf(" * *\n");
printf(" * 3.统计每个职工月在岗,出差,迟到,加班等时间 *\n");
printf(" * *\n");
printf(" * 4.统计不同职工的年出差时间 *\n");
printf(" * *\n");
printf(" * 5.修改本人密码 *\n");
printf(" * *\n");
printf(" * 0.退出管理系统 *\n");
printf(" ***********************************************************\n");
printf(" 请选择:");
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3||choice==4||choice==5)
{
switch(choice)
{
case 1: attenxx(); break;
//2,3,4功能考勤员与管理员共用
case 2: admin_attend(); break; //查询某部门全体职工出勤信息
case 3: admin_staff(); break; //统计每个职工月在岗,出差,迟到,加班等时间
case 4: admin_travel(); break; //统计不同职工的年出差时间
case 5: change_password(); break; //更改密码
case 0: quit(); break; //退出程序函数
}
}
else
{
printf(" 输入有误,请重新输入:\n");
fflush(stdin); //清除缓冲区
//备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
choice=1; //重新给choice赋值,防止跳出循环
}
printf("\n\n");
}
}
else
{
return ; //退出程序
}
}
void attenxx()
{
system("cls");
int choice;
do
{
printf("\n\n");
printf(" 考勤员模式\n\n\n");
printf(" ********考勤信息管理系统**********\n");
printf(" * *\n");
printf(" * 1.添加员工出勤信息 *\n");
printf(" * *\n");
printf(" * 2.删除员工出勤信息 *\n");
printf(" * *\n");
printf(" * 3.查询员工出勤信息 *\n");
printf(" * *\n");
printf(" * 4.修改员工出勤信息 *\n");
printf(" * *\n");
printf(" * 0.退出管理系统 *\n");
printf(" **********************************\n");
printf(" 请选择:");
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3||choice==4)
{
switch(choice)
{
case 0: quit(); break; //退出程序函数
case 1: information_add(); break;
case 2: information_del(); break;
case 3: information_find(); break;
case 4: information_modify_find(); break;
}
}
else
{
printf(" 输入有误,请重新选择:\n");
fflush(stdin); //清除缓冲区
//备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
choice=1; //重新给choice赋值,防止跳出循环
}
}while(choice!=0);
return;
}
void information_add()
{
system("cls");
int i,k,ih,im;
char a[20]="出勤",b[20]="出差",c[20]="迟到",d[20]="加班" ,e[20]="休假",f[20]="病假",g[20]="事假",h[20]="旷工";
int sign1,sign2=0,sign3; //作为判断是否重复的一个标志
int ret; //判断输入是否为数字
cu=cnewnode(cu); //创建一个新节点
printf(" **********************考勤信息管理系统************************\n");
printf(" * *\n");
printf(" * 1.考勤日期: *\n");
printf(" * *\n");
printf(" * 2.职工编号: *\n");
printf(" * *\n");
printf(" * 3.所属部门: *\n");
printf(" * *\n");
printf(" * 4.出勤状态: *\n");
printf(" * *\n");
printf(" * 5.到岗时间: *\n");
printf(" * *\n");
printf(" * 6.下岗时间: *\n");
printf(" * *\n");
printf(" **************************************************************\n");
while(1)
{ //待完善,日期按年月日分别进行输入
gotoxy(24,2); //光标移动函数,
ret=scanf("%d",&cu->att_year);
fflush(stdin); //清除缓冲区
if(ret==0)
{
gotoxy(24,2);
printf("年份应为数字,请重新输入");
Sleep(600);
gotoxy(24,2);
for(k=0;k<=30;k++) //把上一个printf显示的数据清空
printf(" ");
}
if(ret!=0 && cu->att_year<0)
{
gotoxy(24,2);
printf("年份输入有误,请重新输入!");
Sleep(600);
gotoxy(24,2);
for(k=0;k<=30;k++)
printf(" ");
}
if(cu->att_year>0)
{
gotoxy(28,2);
printf("\t");
break;
}
}
while(1)
{ //待完善,日期按年月日分别进行输入
gotoxy(29,2); //光标移动函数,
ret=scanf("%d",&cu->att_mon);
fflush(stdin); //清除缓冲区
if(ret==0)
{
gotoxy(29,2);
printf("月份应为数字,请重新输入");
Sleep(600);
gotoxy(29,2);
for(k=0;k<=30;k++) //把上一个printf显示的数据清空
printf(" ");
}
if(ret!=0&&(cu->att_mon<=0 ||cu->att_mon>12))
{
gotoxy(29,2);
printf("月份输入有误,请重新输入!");
Sleep(600);
gotoxy(29,2);
for(k=0;k<=30;k++)
printf(" ");
}
if(cu->att_mon>0 && cu->att_mon<=12)
{
gotoxy(31,2);
printf("\t");
break;
}
}
while(1)
{ //待完善,日期按年月日分别进行输入
gotoxy(32,2); //光标移动函数,
ret=scanf("%d",&cu->att_day);
fflush(stdin); //清除缓冲区
if(ret==0)
{
gotoxy(32,2);
printf("日期应为数字,请重新输入");
Sleep(600);
gotoxy(32,2);
for(k=0;k<=30;k++) //把上一个printf显示的数据清空
printf(" ");
}
if(ret!=0&&(cu->att_day<0 || cu->att_day>31))
{
gotoxy(32,2);
printf("日期输入有误,请重新输入!");
Sleep(600);
gotoxy(32,2);
for(k=0;k<=30;k++)
printf(" ");
}
if(cu->att_day>0 && cu->att_day<=31)
{
break;
}
}
while(1)
{
gotoxy(24,4);
scanf("%s",cu->att_number);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(cu->att_number);i++) //遍历输入的数据,判断是否满足要求
{
if(cu->att_number[i]<'0'||cu->att_number[i]>'9')
{
gotoxy(24,4);
printf("编号应为数字,请重新输入");
Sleep(600);
gotoxy(24,4);
for(k=0;k<=23;k++) //把上一个printf显示的数据清空
printf(" ");
break; //结束整个for语句
}
if(strlen(cu->att_number)!=7)
{
gotoxy(24,4);
printf("编号应为7位,请重新输入");
Sleep(600);
gotoxy(24,4);
for(k=0;k<=23;k++)
printf(" ");
break;
}
sign2=1; //输入的格式满足要求
}
if(sign2==1)
{
strcpy(check,cu->att_number);
for(at=av->next; at!=NULL;at=at->next) //遍历职工信息这个链表
{
if(strcmp(at->employee_number,check)==0) //该职工编号存在时满足
{
sign1=1; //该职工编号存在
break;
}
if(strcmp(at->employee_number,check)!=0) //该职工编号不存在时满足
{
sign1=0;
continue;
}
}
if(sign1==0) // 请重新输入或者回到员工管理添加
{
gotoxy(24,4);
printf(" 此员工不存在,请重新输入");
Sleep(600);
gotoxy(24,4);
for(k=0;k<=30;k++)
printf(" ");
}
if(i==strlen(cu->att_number)&&sign1==1)
{
break;
}
}
}
while(1)
{
sign2=0;
gotoxy(24,6);
scanf("%s",cu->att_department);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(cu->att_department);i++) //遍历输入的数据,判断是否满足要求
{
if(cu->att_department[i]>=0&&cu->att_department[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
gotoxy(24,6);
printf("不是中文,请重新输入");
Sleep(600);
gotoxy(24,6);
for(k=0;k<=23;k++)
printf(" ");
break;
}
sign2=1; //输入的部门格式满足要求
}
if(sign2==1)
{
strcpy(check,cu->att_department);
if(strcmp(at->department,check)==0) //该员工在此部门时满足
{
sign3=1;
}
if(strcmp(at->department,check)!=0) //该员工不在此部门时满足
{
sign3=0;
}
}
if(sign1==1&&sign3==0) //请重新输入或者回到机构管理添加
{
gotoxy(24,6);
printf(" 此部门无此员工,请重新输入");
Sleep(600);
gotoxy(24,6);
for(k=0;k<=23;k++)
printf(" ");
}
if(i==strlen(u->department)&&sign3==1)
{
break;
}
}
while(1)
{
gotoxy(24,8);
scanf("%s",cu->attendance_status);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(cu->attendance_status);i++) //遍历输入的数据,判断是否满足要求
{
if(cu->attendance_status[i]>=0&&cu->attendance_status[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
gotoxy(24,8);
printf("不是中文,请重新输入");
Sleep(600);
gotoxy(24,8);
for(k=0;k<=23;k++)
printf(" ");
break;
}
}
if(i==strlen(cu->attendance_status))
{
break;
}
}
while(1)
{
gotoxy(24,10); //光标移动函数,
ret=scanf("%d",&cu->att_uphour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
gotoxy(24,10);
printf("时间应为数字,请重新输入");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=30;k++) //把上一个printf显示的数据清空
printf(" ");
}
//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0) && cu->att_uphour!=0)
{
gotoxy(24,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0) && cu->att_uphour==0)
{
gotoxy(25,10);
printf(" : ");
break;
}
//如果出勤状态为出勤或者加班,且上班时间不为8点则
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,d,4)==0) && cu->att_uphour!=8)
{
gotoxy(24,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,d,4)==0) && cu->att_uphour==8)
{
gotoxy(25,10);
printf(" : ");
break;
}
//如果出勤状态为迟到,则在上班时间大于等于8,小于等于12
if(ret!=0 && strncmp(cu->attendance_status,c,4)==0 && (cu->att_uphour<8 || cu->att_uphour>12))
{
gotoxy(24,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,c,4)==0 && cu->att_uphour>=8 && cu->att_uphour<=12)
{
gotoxy(25,10);
printf(" : ");
break;
}
//如果出勤状态为出差则
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_uphour<0 || cu->att_uphour>12))
{
gotoxy(24,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_uphour>=0 && cu->att_uphour<=12))
{
gotoxy(25,10);
printf(" : ");
break;
}
}
while(1)
{
gotoxy(28,10); //光标移动函数,
ret=scanf("%d",&cu->att_upmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
gotoxy(28,10);
printf("时间应为数字,请重新输入");
Sleep(600);
gotoxy(28,10);
for(k=0;k<=30;k++) //把上一个printf显示的数据清空
printf(" ");
}
//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0) && cu->att_upmin!=0)
{
gotoxy(28,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(28,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0) && cu->att_upmin==0)
{
break;
}
//如果出勤状态为出勤或者加班,且上班时间为8点,则应在[0,30]分钟
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,d,4)==0) && (cu->att_upmin>30||cu->att_upmin<0))
{
gotoxy(28,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(28,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,d,4)==0) && cu->att_upmin>=0 && cu->att_upmin<=30)
{
break;
}
//如果出勤状态为迟到,且上班时间为8点,则应在(30,60)分钟
if(ret!=0 && strncmp(cu->attendance_status,c,4)==0 && cu->att_uphour==8 && (cu->att_upmin<=30||cu->att_upmin>=60))
{
gotoxy(28,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(28,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,c,4)==0 && cu->att_uphour==8 && cu->att_upmin>30 && cu->att_upmin<60)
{
break;
}
//如果出勤状态为迟到,且上班时间在8点以后,则应在[0,60)分钟
if(ret!=0 && strncmp(cu->attendance_status,c,4)==0 && cu->att_uphour>8 && (cu->att_upmin<0||cu->att_upmin>=60))
{
gotoxy(28,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(28,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,c,4)==0 && cu->att_uphour>8 && cu->att_upmin>=0 && cu->att_upmin<60)
{
break;
}
//如果出勤状态为出差
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_upmin<0||cu->att_upmin>=60))
{
gotoxy(28,10);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(28,10);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && cu->att_upmin>=0 && cu->att_upmin<60)
{
break;
}
}
while(1)
{
gotoxy(24,12); //光标移动函数,
ret=scanf("%d",&cu->att_downhour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
gotoxy(24,12);
printf("时间应为数字,请重新输入");
Sleep(600);
gotoxy(24,12);
for(k=0;k<=30;k++) //把上一个printf显示的数据清空
printf(" ");
}
//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0) && cu->att_downhour!=0)
{
gotoxy(24,12);
printf("下班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0) && cu->att_downhour==0)
{
gotoxy(25,12);
printf(" : ");
break;
}
//如果出勤状况为出勤或者迟到,下班时间都是17点
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,c,4)==0) && cu->att_downhour!=17)
{
gotoxy(24,12);
printf("下班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,c,4)==0) && cu->att_downhour==17)
{
gotoxy(26,12);
printf(" : ");
break;
}
//如果出勤状态是加班则
if(ret!=0 && strncmp(cu->attendance_status,d,4)==0 && (cu->att_downhour<17 || cu->att_downhour>24))
{
gotoxy(24,12);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,d,4)==0 && cu->att_downhour>=17 && cu->att_downhour<=24)
{
gotoxy(26,12);
printf(" : ");
break;
}
//如果出勤状况是出差则
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downhour<=12 || cu->att_downhour>24))
{
gotoxy(24,12);
printf("下班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(24,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downhour>12 || cu->att_downhour<24))
{
gotoxy(26,12);
printf(" : ");
break;
}
}
while(1)
{
gotoxy(29,12); //光标移动函数,
ret=scanf("%d",&cu->att_downmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
gotoxy(29,12);
printf("时间应为数字,请重新输入");
Sleep(600);
gotoxy(29,12);
for(k=0;k<=30;k++) //把上一个printf显示的数据清空
printf(" ");
}
//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0 )&& cu->att_downmin!=0)
{
gotoxy(28,12);
printf("下班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(28,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0) && cu->att_downmin==0)
{
break;
}
//如果出勤状况为出勤或者迟到,下班时间都是17点30分
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,c,4)==0) && cu->att_downmin!=30)
{
gotoxy(29,12);
printf("下班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(29,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && (strncmp(cu->attendance_status,a,4)==0 || strncmp(cu->attendance_status,c,4)==0) && cu->att_downmin==30)
{
break;
}
//如果出勤状况为加班,且是17点,则应在(30,60) 分钟
if(ret!=0 && strncmp(cu->attendance_status,d,4)==0 && cu->att_downhour==17 && (cu->att_downmin<=30||cu->att_downmin>=60))
{
gotoxy(29,12);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(29,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,d,4)==0 && cu->att_downhour==17 && cu->att_downmin>30 && cu->att_downmin<60)
{
break;
}
//如果出勤状态为迟到,且上班时间在17点到24点,则应在[0,60)分钟
if(ret!=0 && strncmp(cu->attendance_status,d,4)==0 && cu->att_downhour>17 && cu->att_downhour<24 && (cu->att_downmin<0||cu->att_downmin>=60))
{
gotoxy(29,12);
printf("上班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(2,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,d,4)==0 && cu->att_downhour>17 && cu->att_downhour<24 && cu->att_downmin>0 && cu->att_downmin<60)
{
break;
}
//如果出勤状况为出差
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downmin<0 || cu->att_downmin>=60))
{
gotoxy(29,12);
printf("下班时间输入有误,请重新输入!");
Sleep(600);
gotoxy(29,12);
for(k=0;k<=30;k++)
printf(" ");
}
if(ret!=0 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downmin>=0 || cu->att_downmin<60))
{
break;
}
}
//计算在岗,迟到,加班 ,出差
//总上岗时间
ih=cu->att_downhour - cu->att_uphour;
im=cu->att_downmin - cu->att_upmin;
if(im<0) {im+=60;ih--;}
cu->att_intime=ih+(double)im/60;
if(strncmp(cu->attendance_status,b,4)==0) {cu->att_traveltime=ih+(double)im/60;}
//如果该员工早上八点上班并且超过了8.30,则视为迟到
if((cu->att_uphour==8 && cu->att_upmin>30)||(cu->att_uphour>8 && cu->att_uphour<12))
{
ih=cu->att_uphour - 8;
im=cu->att_upmin - 30;
if(im<0) {im+=60;ih--;}
cu->att_latetime=ih+(double)im/60;
}
//如果该员工下班时间并且超过了17.30,则视为加班
if(strncmp(cu->attendance_status,b,4)!=0 && ((cu->att_downhour==17 && cu->att_downmin>30)||(cu->att_downhour>18 && cu->att_downhour<24)))
{
ih=cu->att_downhour - 17;
im=cu->att_downmin - 30;
if(im<0) {im+=60;ih--;}
cu->att_overtime=ih+(double)im/60;
}
cu->next=chead->next; //采用头插法将新节点的尾指针指向第二个节点
chead->next=cu; //将新节点放在头节点后面
printf("\n\n\n\n --->采集成功!\n");
information_storage();
printf("\n ");
system("pause");
system("cls");
}
void information_del()
{
system("cls");
char num[20];
int flag=0,year,mon,day;
printf("\n 请输入您要删除员工的编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
printf(" 请输入要删除的日期:");
scanf("%d %d %d",&year,&mon,&day);
fflush(stdin); //清除缓冲区
for(cu=chead;cu!=NULL;cu=cu->next) //遍历这个链表
{
if(strcmp(cu->att_number,num)==0) //找到相同的编号
{
if(cu->att_year==year)
{
if(cu->att_mon==mon)
{
if(cu->att_day==day)
{
flag++;
printf(" 查找成功!\n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
cp->next=cu->next;
free(cu);
printf("\n --->删除成功!\n");
information_storage();
break;
}
}
}
}
cp=cu; //p指向u当前的节点,后u又指向下一个节点
}
if(flag==0)
printf("\n --->没有这个员工的出勤信息!\n");
system("pause");
system("cls");
}
void information_find()
{
system("cls");
char num[20];
int flag=0,year,mon,day;
printf("\n\n 根据编号查询信息\n");
printf(" 请输入您要查询员工的编号: ");
scanf("%s",num);
fflush(stdin); //清除缓冲区
printf(" 请输入要查询的日期:");
scanf("%d %d %d",&year,&mon,&day);
fflush(stdin);
for(cu=chead->next;cu!= NULL;cu=cu->next)
{
if(strcmp(cu->att_number,num)==0)
{
if(cu->att_year==year)
{
if(cu->att_mon==mon)
{
if(cu->att_day==day)
{
flag++;
printf(" 查找成功!\n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
break;
}
}
}
}
}
if(flag==0)
{
printf(" --->未找到该员工的出勤信息!\n");
}
system("pause");
system("cls");
}
void information_modify_find()
{
system("cls");
int flag=0,year,mon,day;
printf("\n\n 请输入您要修改员工的编号: ");
scanf("%s",number);
printf("\n 请输入您要修改该员工的考勤日期: ");
scanf("%d %d %d",&year,&mon,&day);
fflush(stdin); //清除缓冲区
for(cu=chead;cu!= NULL;cu=cu->next) //遍历这个链表
{
if(strcmp(cu->att_number,number)==0) //找到相同的编号
{
if(cu->att_year==year)
{
if(cu->att_mon==mon)
{
if(cu->att_day==day)
{
flag++;
printf(" 查找成功!\n");
printf(" 员工考勤信息 \n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
system("pause");
information_modify();
}
}
}
}
}
if(flag==0)
printf("\n --->没有这个员工的信息!\n");
system("pause");
system("cls");
return;
}
void information_modify()
{
system("cls");
int choice,ih,im;
int i,ret,sign1,sign2,flag=1;
char a[8]="出勤",b[8]="出差",c[8]="迟到",d[8]="加班",e[8]="休假",f[8]="病假",g[8]="事假",h[8]="旷工" ;
do
{
//因为在储存时u所指向的节点已经发生变化,故再次遍历链表, 找到上次修改的节点
for(cp=chead->next;cp!= NULL;cp=cp->next)
{
if(strcmp(cp->att_number,number)==0)
{
cu=cp;
}
}
printf("\n");
printf(" *******************修改员工信息**********************\n");
printf(" * 1.修改考勤日期 2.修改职工编号 *\n");
printf(" * *\n");
printf(" * 3.修改员工部门 4.修改出勤状态 *\n");
printf(" * *\n");
printf(" * 5.修改上下岗时间 0.退出该程序 *\n");
printf(" * *\n");
printf(" *****************************************************\n");
printf(" 请选择:");
scanf("%d",&choice);
fflush(stdin); //清除缓冲区
if(choice==0||choice==1||choice==2||choice==3||choice==4||choice==5)
{
switch(choice)
{
case 1:
{
printf("\n");
while(1)
{
printf(" 请输入新的年份:"); //日期按年月日分别进行输入
ret=scanf("%d",&cu->att_year);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf("年份应为数字,请重新输入:");
}
if(ret!=0 && cu->att_year<0)
{
printf("年份输入有误,请重新输入!");
}
if(cu->att_year>0)
{
printf("\t");
break;
}
}
while(1)
{
printf(" 请输入新的月份:"); //待完善,日期按年月日分别进行输入
ret=scanf("%d",&cu->att_mon);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf("月份应为数字,请重新输入");
}
if(ret!=0&&(cu->att_mon<=0 ||cu->att_mon>12))
{
printf("月份输入有误,请重新输入!");
}
if(cu->att_mon>0 && cu->att_mon<=12)
{
printf("\t");
break;
}
}
while(1)
{
printf(" 请输入新的日期:"); //待完善,日期按年月日分别进行输入
ret=scanf("%d",&cu->att_day);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf("日期应为数字,请重新输入");
}
if(ret!=0&&(cu->att_day<0 || cu->att_day>31))
{
printf("日期输入有误,请重新输入!");
}
if(cu->att_day>0 && cu->att_day<=31)
{
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工考勤信息 \n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
system("pause");
information_storage();
system("pause");
system("cls");
break;
}
case 2:
{
while(1)
{
printf(" 请输入新的编号:");
scanf("%s",cu->att_number);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(cu->att_number);i++) //遍历输入的数据,判断是否满足要求
{
if(cu->att_number[i]<'0'||cu->att_number[i]>'9')
{
printf(" 编号必须是数字 请重新输入\n");
break;
}
if(strlen(cu->att_number)!=7)
{
printf(" 编号必须为7位 请重新输入\n");
break;
}
}
if(strlen(cu->att_number)==7&&i==strlen(cu->att_number))
{
strcpy(number,cu->att_number);
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工考勤信息 \n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
system("pause");
information_storage();
system("pause");
system("cls");
break;
}
case 3:
{
while(1)
{
printf(" 请输入新的部门:");
scanf("%s",cu->att_department);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(cu->att_department);i++) //遍历输入的数据,判断是否满足要求
{
if(cu->att_department[i]>=0&&cu->att_department[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
printf(" 不是中文,请重新输入");
break;
}
}
if(i==strlen(cu->att_department))
{
break;
}
}
printf("\n --->修改成功!\n");
printf(" 新的员工考勤信息 \n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
system("pause");
information_storage();
system("pause");
system("cls");
break;
}
case 4:
{
while(1)
{
printf(" 请输入新的出勤状态:");
scanf("%s",cu->attendance_status);
fflush(stdin); //清除缓冲区
for(i=0;i<strlen(cu->attendance_status);i++) //遍历输入的数据,判断是否满足要求
{
if(cu->attendance_status[i]>=0&&cu->attendance_status[i]<=255) //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入
{
printf(" 不是中文,请重新输入");
break;
}
}
if(i==strlen(cu->attendance_status))
{
break;
}
}
//出勤状态为休假,加班,迟到,旷工
if(strncmp(cu->attendance_status,e,4)==0 || strncmp(cu->attendance_status,f,4)==0 || strncmp(cu->attendance_status,g,4)==0 || strncmp(cu->attendance_status,h,4)==0)
{
cu->att_uphour=0;
cu->att_upmin=0;
cu->att_downhour=0;
cu->att_downmin=0;
cu->att_intime=0;
cu->att_traveltime=0;
cu->att_latetime=0;
cu->att_overtime=0;
}
if(strncmp(cu->attendance_status,b,4)==0)
{
cu->att_overtime=0;
}
//出勤状态改为出勤
if(strncmp(cu->attendance_status,a,4)==0)
{
cu->att_uphour=8;
cu->att_upmin=30;
cu->att_downhour=17;
cu->att_downmin=30;
cu->att_traveltime=0;
cu->att_latetime=0;
cu->att_overtime=0;
}
//出勤状态为迟到
if(strncmp(cu->attendance_status,c,4)==0)
{
while(1)
{
printf(" 请输入新的上岗时间(小时):");
ret=scanf("%d",&cu->att_uphour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
//如果出勤状态为迟到,则在上班时间大于等于8,小于等于12
if(ret!=0 && (cu->att_uphour<8 || cu->att_uphour>12))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && cu->att_uphour>=8 && cu->att_uphour<=12)
{
break;
}
}
while(1)
{
printf(" 请输入新的上岗时间(分钟):");
ret=scanf("%d",&cu->att_upmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
//如果出勤状态为迟到,且上班时间为8点,则应在(30,60)分钟
if(ret!=0 && cu->att_uphour==8 && (cu->att_upmin<=30||cu->att_upmin>=60))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && strncmp(cu->attendance_status,c,4)==0 && cu->att_uphour==8 && cu->att_upmin>30 && cu->att_upmin<60)
{
break;
}
//如果出勤状态为迟到,且上班时间在8点以后,则应在[0,60)分钟
if(ret!=0 && cu->att_uphour>8 && (cu->att_upmin<0||cu->att_upmin>=60))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && cu->att_uphour>8 && cu->att_upmin>=0 && cu->att_upmin<60)
{
break;
}
}
cu->att_traveltime=0;
cu->att_overtime=0;
}
//出勤状态为出差
if(strncmp(cu->attendance_status,b,4)==0)
{
while(1)
{
printf(" 请输入新的上岗时间(小时):");
ret=scanf("%d",&cu->att_uphour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_uphour<0 || cu->att_uphour>12))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && (cu->att_uphour>=0 && cu->att_uphour<=12))
{
break;
}
}
while(1)
{
printf(" 请输入新的上岗时间(分钟):");
ret=scanf("%d",&cu->att_upmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_upmin<0||cu->att_upmin>=60))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && cu->att_upmin>=0 && cu->att_upmin<60)
{
break;
}
}
while(1)
{
printf(" 请输入新的下岗时间(小时):");
ret=scanf("%d",&cu->att_downhour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_downhour<=12 || cu->att_downhour>24))
{
printf(" 下班时间输入有误,请重新输入!\n");
}
if(ret!=0 && (cu->att_downhour>12 || cu->att_downhour<24))
{
break;
}
}
while(1)
{
printf(" 请输入新的下岗时间(分钟):");
ret=scanf("%d",&cu->att_downmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_downmin<0 || cu->att_downmin>=60))
{
printf("下班时间输入有误,请重新输入!");
}
if(ret!=0 && (cu->att_downmin>=0 || cu->att_downmin<60))
{
break;
}
}
cu->att_latetime=0;
cu->att_overtime=0;
}
//如果出勤状态为加班
if(strncmp(cu->attendance_status,d,4)==0)
{
while(1)
{
printf(" 请输入新的下岗时间(小时):");
ret=scanf("%d",&cu->att_downhour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_downhour<17 || cu->att_downhour>24))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && cu->att_downhour>=17 && cu->att_downhour<=24)
{
break;
}
}
while(1)
{
printf(" 请输入新的下岗时间(分钟):");
ret=scanf("%d",&cu->att_downmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
//如果出勤状况为加班,且是17点,则应在(30,60) 分钟
if(ret!=0 && cu->att_downhour==17 && (cu->att_downmin<=30||cu->att_downmin>=60))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && cu->att_downhour==17 && cu->att_downmin>30 && cu->att_downmin<60)
{
break;
}
//如果出勤状态为加班,且上班时间在17点到24点,则应在[0,60)分钟
if(ret!=0 && cu->att_downhour>17 && cu->att_downhour<24 && (cu->att_downmin<0||cu->att_downmin>=60))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && cu->att_downhour>17 && cu->att_downhour<24 && cu->att_downmin>0 && cu->att_downmin<60)
{
break;
}
}
cu->att_traveltime=0;
cu->att_latetime=0;
}
//计算在岗,迟到,加班 ,出差
//总上岗时间
ih=cu->att_downhour - cu->att_uphour;
im=cu->att_downmin - cu->att_upmin;
if(im<0) {im+=60;ih--;}
cu->att_intime=ih+(double)im/60;
if(strncmp(cu->attendance_status,b,4)==0) {cu->att_traveltime=ih+(double)im/60;}
//如果该员工早上八点上班并且超过了8.30,则视为迟到
if((cu->att_uphour==8 && cu->att_upmin>30)||(cu->att_uphour>8 && cu->att_uphour<12))
{
ih=cu->att_uphour - 8;
im=cu->att_upmin - 30;
if(im<0) {im+=60;ih--;}
cu->att_latetime=ih+(double)im/60;
}
//如果该员工下班时间并且超过了17.30,则视为加班,出差不认为加班
if(strncmp(cu->attendance_status,b,4)!=0 && ((cu->att_downhour==17 && cu->att_downmin>30)||(cu->att_downhour>18 && cu->att_downhour<24)))
{
ih=cu->att_downhour - 17;
im=cu->att_downmin - 30;
if(im<0) {im+=60;ih--;}
cu->att_overtime=ih+(double)im/60;
}
printf("\n --->修改成功!\n");
printf(" 新的员工考勤信息 \n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
system("pause");
information_storage();
system("pause");
system("cls");
break;
}
case 5:
{
printf("\n");
while(1)
{
printf(" 请输入新的上岗时间(小时):");
ret=scanf("%d",&cu->att_uphour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_uphour<0 || cu->att_uphour>24))
{
printf(" 时间输入有误,请重新输入!\n");
flag=0;
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)!=0)
{
break;
}
//如果出勤状态为出差则
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_uphour<0 || cu->att_uphour>12))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_uphour>=0 && cu->att_uphour<=12))
{
break;
}
flag=1;
}
while(1)
{
printf(" 请输入新的上岗时间(分钟):");
ret=scanf("%d",&cu->att_upmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_upmin<0 || cu->att_upmin>60))
{
printf(" 时间输入有误,请重新输入!\n");
flag=0;
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)!=0)
{
break;
}
//如果出勤状态为出差
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_upmin<0||cu->att_upmin>=60))
{
printf(" 上班时间输入有误,请重新输入!\n");
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && cu->att_upmin>=0 && cu->att_upmin<60)
{
break;
}
flag=1;
}
while(1)
{
printf(" 请输入新的下岗时间(小时):");
ret=scanf("%d",&cu->att_downhour);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入\n");
}
if(ret!=0 && (cu->att_downhour<0 || cu->att_downhour>24))
{
printf(" 时间输入有误,请重新输入!\n");
flag=0;
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)!=0)
{
break;
}
//如果出勤状况是出差则
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downhour<=12 || cu->att_downhour>24))
{
printf(" 下班时间输入有误,请重新输入!\n");
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downhour>12 || cu->att_downhour<24))
{
break;
}
flag=1;
}
while(1)
{
printf(" 请输入新的下岗时间(分钟):");
ret=scanf("%d",&cu->att_downmin);
fflush(stdin); //清除缓冲区
if(ret==0)
{
printf(" 时间应为数字,请重新输入!\n");
}
if(ret!=0 && (cu->att_downmin<0 || cu->att_downmin>60))
{
printf(" 时间输入有误,请重新输入!\n");
flag=0;
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)!=0)
{
break;
}
//如果出勤状况为出差
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downmin<0 || cu->att_downmin>=60))
{
printf("下班时间输入有误,请重新输入!");
}
if(ret!=0 && flag==1 && strncmp(cu->attendance_status,b,4)==0 && (cu->att_downmin>=0 || cu->att_downmin<60))
{
break;
}
flag=1;
}
//8:30上班,17:30下班,则出勤状态改为出勤
if(strncmp(cu->attendance_status,b,4)!=0 && cu->att_uphour==8 && cu->att_upmin==30 && cu->att_downhour==17 && cu->att_downmin==30)
{
strcpy(cu->attendance_status,a);
cu->att_traveltime=0;
cu->att_latetime=0;
cu->att_overtime=0;
}
//8:30以后上班,17:30下班,则出勤状态改为迟到
if(strncmp(cu->attendance_status,b,4)!=0 && cu->att_uphour==8 && (cu->att_upmin>30 && cu->att_upmin<60) && cu->att_downhour==17 && cu->att_downmin==30)
{
strcpy(cu->attendance_status,c);
cu->att_traveltime=0;
cu->att_overtime=0;
}
if(strncmp(cu->attendance_status,b,4)!=0 && (cu->att_uphour>8 && cu->att_uphour<12) && (cu->att_upmin>0 && cu->att_upmin<60) && cu->att_downhour==17 && cu->att_downmin==30)
{
strcpy(cu->attendance_status,c);
cu->att_traveltime=0;
cu->att_overtime=0;
}
//8:30上班,17:30以后下班,则出勤状态改为加班
if(strncmp(cu->attendance_status,b,4)!=0 && cu->att_uphour==8 && cu->att_upmin==30 && cu->att_downhour==17 && (cu->att_downmin>30 && cu->att_downmin<60))
{
strcpy(cu->attendance_status,d);
cu->att_traveltime=0;
cu->att_latetime=0;
}
if(strncmp(cu->attendance_status,b,4)!=0 && cu->att_uphour==8 && cu->att_upmin==30 && (cu->att_downhour>17 && cu->att_downhour<24) && (cu->att_downmin>0 && cu->att_downmin<60))
{
strcpy(cu->attendance_status,d);
cu->att_traveltime=0;
cu->att_latetime=0;
}
//计算当天在岗,迟到,加班 ,出差时间
//总上岗时间
ih=cu->att_downhour - cu->att_uphour;
im=cu->att_downmin - cu->att_upmin;
if(im<0) {im+=60;ih--;}
cu->att_intime=ih+(double)im/60;
if(strncmp(cu->attendance_status,b,4)==0) {cu->att_traveltime=ih+(double)im/60;}//如果上班时间为0点并且下班时间为24点则视为该员工出差
//如果该员工早上八点上班并且超过了8.30,则视为迟到
if((cu->att_uphour==8 && cu->att_upmin>30)||(cu->att_uphour>8 && cu->att_uphour<12))
{
ih=cu->att_uphour - 8;
im=cu->att_upmin - 30;
if(im<0) {im+=60;ih--;}
cu->att_latetime=ih+(double)im/60;
}
//如果该员工下班时间并且超过了17.30,则视为加班,出差不认为加班
if(strncmp(cu->attendance_status,b,4)!=0 && ((cu->att_downhour==17 && cu->att_downmin>30)||(cu->att_downhour>18 && cu->att_downhour<24)))
{
ih=cu->att_downhour - 17;
im=cu->att_downmin - 30;
if(im<0) {im+=60;ih--;}
cu->att_overtime=ih+(double)im/60;
}
if(strncmp(cu->attendance_status,b,4)==0)
{
cu->att_overtime=0;
}
printf("\n --->修改成功!\n");
printf(" 新的员工考勤信息 \n");
puts(" 考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间\n");
printf(" ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
printf(" %d %d %d %s %s %s %d %d %d %d\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin);
system("pause");
information_storage();
system("pause");
system("cls");
break;
}
}
}
printf("\n\n");
}while(choice!=0);
printf(" 将返回到上一个菜单!\n");
return;
}
void att_information_read()
{
char a[200]; //存放读取的汉字
FILE *fp;
char ch;
fp=fopen("att_information.txt","a+"); //进入程序时打开/建立该文件
fclose(fp);
if((fp=fopen("att_information.txt","r+"))==NULL)
{
printf("\n --->没有找到文件!\n");
return ;
}
ch=fgetc(fp); //从指定的文件读取一个字符
if(ch==EOF)
{
return;
}
else
rewind(fp); //如果文件有内容,则把文件读写指针移动到文件的开头
fgets(a,200,fp); //读取第一行汉字信息
while(!feof(fp)) //未到文件末尾继续循环
{
cu=cnewnode(cu);
fscanf(fp,"%d %d %d %s %s %s %d %d %d %d %lf %lf %lf %lf\n",&cu->att_year,&cu->att_mon,&cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,&cu->att_uphour,&cu->att_upmin,&cu->att_downhour,&cu->att_downmin,&cu->att_intime,&cu->att_traveltime,&cu->att_latetime,&cu->att_overtime);
cu->next=chead->next; //头插法建立链表
chead->next=cu;
}
fclose(fp);
}
void information_storage()
{
char a[20];
FILE *fp;
printf("\n 确认保存(y/n)? ");
while(1)
{
scanf("%s",a);
fflush(stdin); //清除缓冲区
if( (strcmp(a,"n")!=0)&& (strcmp(a,"y")!=0))
{
printf(" 输入的数据有误,请重新输入!");
fflush(stdin); //清除缓冲区
}
if( (strcmp(a,"n")==0)||(strcmp(a,"y")==0))
{
break; //如果满足条件则结束循环
}
}
if((strcmp(a,"n")==0))
{
printf(" 不保存喔\n");
return ;
}
if((fp=fopen("att_information.txt","w+"))==NULL)
{
printf("\n --->att_information.txt文件打开失败!\n");
return ;
}
fputs("考勤日期 职工编号 所属部门 出勤状态 到岗时间 下岗时间 在岗 出差 迟到 加班\n",fp);
//从头节点开始依次写入文件
for(cu=chead->next;cu!=NULL;cu=cu->next)
{
fprintf(fp,"%d %d %d %s %s %s %d %d %d %d %lf %lf %lf %lf\n",cu->att_year,cu->att_mon,cu->att_day,cu->att_number,cu->att_department,cu->attendance_status,cu->att_uphour,cu->att_upmin,cu->att_downhour,cu->att_downmin,cu->att_intime,cu->att_traveltime,cu->att_latetime,cu->att_overtime);
}
fflush(stdin); //清除缓冲区
fclose(fp);
printf("\n --->信息成功存入\n");
}
考勤管理系统(考勤员函数与管理员部分相同)
于 2022-05-10 23:17:14 首次发布