考勤管理系统(考勤员函数与管理员部分相同)
//考勤员登陆函数
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");
}
考勤管理系统(考勤员函数与管理员部分相同)相关推荐
- JSP学生考勤管理系统考勤管理系统jsp学生迟到早退考勤查询系统(考勤管理系统源码)
常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线招标房,屋租赁,教务管理,医院管理,餐厅收银,来访咨询,兼职论坛,桌面聊天室,酒店管理,民宿管理,车位租赁,音 ...
- C#语言 Asp.net学生考勤管理系统考勤管理系统.net学生迟到早退考勤查询系统(asp考勤管理系统源码)
- (附源码)ssm学生考勤管理系统 毕业设计 260952
摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准 ...
- (附源码)php学生考勤管理系统-计算机毕设080900
PHP学生考勤管理系统 摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化 ...
- PHP学生考勤管理系统毕业设计-附源码080900
摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准 ...
- 课程设计------学生考勤管理系统
题目:学生考勤管理系统 考勤信息记录了学生的缺课情况,它包括:缺课日期.第几节课(连续多节课用 begin-end 的形式表示).课程名称(课程名称中不会出现空格).学生姓名.缺课类型(迟到.早退.请 ...
- 考勤管理系统需要安装服务器吗,选择考勤管理软件看规模,这些误区要避开
企业选择考勤管理软件要重视是否基于云服务器处理数据,同时要确保考勤系统兼容计算机手机等设备,这样才能给用户更好的使用体验,同时确保各部门考勤数据的智能聚合. 很多工程企业和服务企业都离不开考勤管理系统 ...
- 基于QT的人脸识别考勤管理系统【一】
前言: 上篇我们已经用opencv实现了人脸识别https://blog.csdn.net/qq_42449351/article/details/99052241,现在我们就用人脸识别来做一个考勤管 ...
- 人事管理系统——考勤系统需求分析
需求分析说明书 一.引言 1.1编写目的 随着企业的信息化和体制改革的步伐,人才竞争使企业的人力资源面临前所未有的挑战.越来越多的企业不断地加大对员工的投资,从而更好地吸引.保留和发展所需要人才, ...
最新文章
- linux路由内核实现分析 四,linux路由内核实现分析(二)---FIB相关数据结构(4)
- noip模拟赛 遭遇
- CSP2020洛谷P7076:动物园(位运算)
- 视图编辑php,PhpStorm视图模式
- 403 forbidden nginx_linux搭建nginx服务
- StateListDrawable 动态更换背景
- 安卓异常总结---GestureBuilder] Re-installation failed due to different application signatures
- Spring Boot Maven 打包可执行Jar文件!
- pfSense添加子网的几种方式
- iOS10 Safari不识别viewport禁用缩放的暴力解决方案
- 冲动是魔鬼——4.25
- 江西单招主计算机学校,2019年江西单招学校,江西单招信息技术试题,2019江西单招综合素质...
- 新版电力系统决策支持系统开发告一段落
- 微信小程序开发(3.选项卡)
- SQLI-LABS——Page-2 Advanced Injections Less21~Less37
- 车间生产管理(二)· 设备综合利用率 OEE 解决方案-可部署在 Power BI 上的设备 OEE 解决方案
- 努比亚手机计算机颜色怎么设置,努比亚手机需要掌握的小技巧,提升您的玩机体验...
- 星星之火-52:6G十大领域关键技术
- html如何制作悬浮窗,使用js实现悬浮窗效果方法
- 通俗讲解MOSFET