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

//考勤员登陆函数 
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");  
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值