//考勤员登陆函数
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(" ");}//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0if(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(" ");}//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0if(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(" ");}//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0if(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(" ");}//如果出勤状态为事假,休假,病假,旷工,则上班时间和下班时间都为0if(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;}elserewind(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");
}

考勤管理系统(考勤员函数与管理员部分相同)相关推荐

  1. JSP学生考勤管理系统考勤管理系统jsp学生迟到早退考勤查询系统(考勤管理系统源码)

    常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线招标房,屋租赁,教务管理,医院管理,餐厅收银,来访咨询,兼职论坛,桌面聊天室,酒店管理,民宿管理,车位租赁,音 ...

  2. C#语言 Asp.net学生考勤管理系统考勤管理系统.net学生迟到早退考勤查询系统(asp考勤管理系统源码)

  3. (附源码)ssm学生考勤管理系统 毕业设计 260952

    摘  要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准 ...

  4. (附源码)php学生考勤管理系统-计算机毕设080900

    PHP学生考勤管理系统 摘  要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化 ...

  5. PHP学生考勤管理系统毕业设计-附源码080900

    摘  要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准 ...

  6. 课程设计------学生考勤管理系统

    题目:学生考勤管理系统 考勤信息记录了学生的缺课情况,它包括:缺课日期.第几节课(连续多节课用 begin-end 的形式表示).课程名称(课程名称中不会出现空格).学生姓名.缺课类型(迟到.早退.请 ...

  7. 考勤管理系统需要安装服务器吗,选择考勤管理软件看规模,这些误区要避开

    企业选择考勤管理软件要重视是否基于云服务器处理数据,同时要确保考勤系统兼容计算机手机等设备,这样才能给用户更好的使用体验,同时确保各部门考勤数据的智能聚合. 很多工程企业和服务企业都离不开考勤管理系统 ...

  8. 基于QT的人脸识别考勤管理系统【一】

    前言: 上篇我们已经用opencv实现了人脸识别https://blog.csdn.net/qq_42449351/article/details/99052241,现在我们就用人脸识别来做一个考勤管 ...

  9. 人事管理系统——考勤系统需求分析

    需求分析说明书   一.引言 1.1编写目的 随着企业的信息化和体制改革的步伐,人才竞争使企业的人力资源面临前所未有的挑战.越来越多的企业不断地加大对员工的投资,从而更好地吸引.保留和发展所需要人才, ...

最新文章

  1. linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4)
  2. noip模拟赛 遭遇
  3. CSP2020洛谷P7076:动物园(位运算)
  4. 视图编辑php,PhpStorm视图模式
  5. 403 forbidden nginx_linux搭建nginx服务
  6. StateListDrawable 动态更换背景
  7. 安卓异常总结---GestureBuilder] Re-installation failed due to different application signatures
  8. Spring Boot Maven 打包可执行Jar文件!
  9. pfSense添加子网的几种方式
  10. iOS10 Safari不识别viewport禁用缩放的暴力解决方案
  11. 冲动是魔鬼——4.25
  12. 江西单招主计算机学校,2019年江西单招学校,江西单招信息技术试题,2019江西单招综合素质...
  13. 新版电力系统决策支持系统开发告一段落
  14. 微信小程序开发(3.选项卡)
  15. SQLI-LABS——Page-2 Advanced Injections Less21~Less37
  16. 车间生产管理(二)· 设备综合利用率 OEE 解决方案-可部署在 Power BI 上的设备 OEE 解决方案
  17. 努比亚手机计算机颜色怎么设置,努比亚手机需要掌握的小技巧,提升您的玩机体验...
  18. 星星之火-52:6G十大领域关键技术
  19. html如何制作悬浮窗,使用js实现悬浮窗效果方法
  20. 通俗讲解MOSFET

热门文章

  1. 3DGS脚本教程翻译(11)-指针
  2. 避免NullPointException
  3. MacbookAir下载速度慢的解决方法(转载)
  4. vue 踩坑--父组件调用子组件方法,报错
  5. 服务器坏了无法开机,svn数据需要迁移
  6. JAVA初学下(仅做笔记)
  7. 二、在元件库里画元件
  8. python语言求商品的总价_计算商品总价?
  9. [系统设计] 可扩展性--Scalability Harvard Web Development David Malan
  10. 知识服务是知识付费的价值回归