考勤管理系统(节点,主函数,管理员函数)

sta* newnode(sta* p)                      //构建员工节点函数     
{  
    p=(sta*)malloc(sizeof(sta));          //动态内存申请 
    p->next=NULL;                          //初始化为空 
    
    return p;  
}
att* cnewnode(att* p)                      //构建考勤信息节点函数 
{  
    p=(att*)malloc(sizeof(att));  
    p->next=NULL;  
    return p;  
}
void menu()                                //菜单函数 
{
    printf("\n");
    printf("   *****考勤信息管理系统*****\n");
    printf("   *                        *\n");
    printf("   *       1.管理员         *\n");
    printf("   *                        *\n");
    printf("   *       2.考勤员         *\n");
    printf("   *                        *\n");
    printf("   *       3.普通员工       *\n");
    printf("   *                        *\n");
    printf("   *       0.退出管理系统   *\n");
    printf("   **************************\n");
    printf("   请选择登陆身份:");
} 
main()
{
    int choice;
    head=av=newnode(head);                //av用于初始文件的读取 
    chead=cv=cnewnode(chead);
    staff_read();
    att_information_read(); 
    while(1)
    {
        menu();
        scanf("%d",&choice);    
        fflush(stdin);                        //清除缓冲区 
        if(choice==0||choice==1||choice==2||choice==3)
        {
            switch(choice)
            {
                case 1:        admin();
                break;
                case 2:        atten();
                break;
                case 3:        staff();
                break;
                case 0:        quit();        //退出程序函数 
                break;
            }    
        } 
        else
        {
            printf("   输入有误,将回到主菜单,请重新选择登陆身份:\n");
            fflush(stdin);        //清除缓冲区 
            //备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
            system("pause");
            system("cls");
        }
    }
    system("pause");
}
//退出程序函数 
void quit()
{
    char a[20];
    printf("   确定退出程序?请输入y/n:");
    while(1)
    {
        scanf("%s",a);
        fflush(stdin);            //清除缓冲区 
        if((strcmp(a,"y"))!=0&&(strcmp(a,"n")!=0))        //检验是否输入正确 
        {
            printf("   输入的数据有误,请重新输入!");
            fflush(stdin); //清除缓冲区 
        }
        if(strcmp(a,"y")==0||strcmp(a,"n")==0)            //若输入正确,则跳出整个循环 
        {
            break;
        } 
    }
    if(strcmp(a,"y")==0)
    {
        system("cls");
        printf("\n\n");
        printf("   感谢您的使用,谢谢");
        exit(0); 
    }
    else     
    {
        printf("   不退出喔,将回到上一个菜单\n"); 
        system("pause");
        system("cls");
    }
}
//管理员登陆函数 
int get_admin()
{
    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   密码正确,登陆成功!\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("你还不是管理员喔\n");
    }
    system("pause");
    system("cls");
}
void admin()
{
    int choice;
    system("cls");
    if(get_admin())            //调用密码函数,判断是否能够继续
    {
         system("cls");
         while(1)
         {
             printf("\n\n\n   尊敬的%s小主您好,欢迎进入考勤信息管理系统!\n\n",u->name);
             printf("        管理员模式\n\n\n");
             printf("   ***********************考勤信息管理系统********************\n");
            printf("   *                                                         *\n");
            printf("   *       1.管理员工基本信息                                *\n");     
            //职员信息添加staff_add()、删除staff_del()、查询staff_find()、修改staff_modify()、存储staff_storage()功能
            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 1:    adminxx();        break;
                case 2: admin_attend();    break;        //2,3,4功能考勤员与管理员共用 
                case 3:    admin_staff();    break;
                case 4:    admin_travel();    break;
                case 0:    quit();         break;        //退出程序函数 
                }    
            } 
            else
            {
                printf("   输入有误,请重新输入:\n");
                fflush(stdin);        //清除缓冲区 
                //备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
                choice=1;             //重新给choice赋值,防止跳出循环 
            }
            printf("\n\n");    
        }
    } 
    else 
    {
        return ;    //退出程序 
    }
}
void adminxx()
{
    system("cls");
    int choice;
    do
    {
        printf("\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||choice==5)
        {
            switch(choice)
            {
                case 1:    staff_add();            break;
                case 2: staff_del();            break;
                case 3: staff_find();            break;
                case 4:    staff_modify_find();    break;
                case 0:    quit();                 break;        //退出程序函数 
            }    
        } 
        else
        {
            printf("   输入有误,请重新选择:\n");
            fflush(stdin);        //清除缓冲区 
            //备注:VS2019可能无法使用fflush(stdin)函数消除缓冲区,可以使用rewind(stdin)函数替换
            choice=1;             //重新给choice赋值,防止跳出循环 
        }
    }while(choice!=0);
    return;
} 
void admin_attend()
{
    system("cls");
    char depart[20];
    int flag=0;
    printf("\n\n   根据部门查询信息\n");
    printf("   请输入您要查询部门的名称: ");
    scanf("%s",depart);
    fflush(stdin); //清除缓冲区
    for(cu=chead->next;cu!= NULL;cu=cu->next)  
    {  
        if(strcmp(cu->att_department,depart)==0)  
        {  
            flag++; 
            if(flag==1) 
            {
                printf("   查找成功!\n");
                printf("   该部门考勤信息\n"); 
                puts("      考勤日期    职工编号  所属部门  出勤状态   到岗时间   下岗时间\n");
                printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\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);
            continue;
        }
    }
    if(flag==0)
    {
        printf("   --->未查找到该部门的出勤信息!\n"); 
    }
    system("pause");
    system("cls");
}
void admin_staff()
{
    system("cls");
    char num[20];
    char a[20];
    int flag=0,year,mon;
    double sum_intime=0,sum_traveltime=0,sum_latetime=0,sum_overtime=0;
    printf("\n\n\n   根据月份查询信息\n");
    printf("   请输入您要查询的年月份: ");
    scanf("%d %d",&year,&mon);
    fflush(stdin); //清除缓冲区 
    while(1)
    {
        printf("   请输入你想要查询的职工编号: ");
        scanf("%s",num);
        fflush(stdin);        //清除缓冲区 
        for(cu=chead->next;cu!= NULL;cu=cu->next)  
        {  
            if(cu->att_year==year)
            {
                if(cu->att_mon==mon)  
                {  
                    if(strcmp(cu->att_number,num)==0) 
                    {
                        flag++;
                        sum_intime+=cu->att_intime;
                        sum_traveltime+=cu->att_traveltime;
                        sum_latetime+=cu->att_latetime;
                        sum_overtime+=cu->att_overtime;
                        continue;
                    }
                    else
                    {
                        continue;
                    }
                }
             } 
        }
        if(flag==0)
        {
            printf("   --->未找到此月该员工出勤的信息!\n"); 
        }
        if(flag>0)
        {
            printf("\n");
            printf("   考勤日期  职工编号  月在岗时间  月出差时间  月迟到时间  月加班时间\n");
            printf("   ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
            printf("   %d %d    %s   %lf   %lf   %lf    %lf\n",year,mon,num,sum_intime,sum_traveltime,sum_latetime,sum_overtime);
            sum_intime=0;
            sum_traveltime=0;
            sum_latetime=0;
            sum_latetime=0;
            printf("\n");
        }
        printf("   是否还要继续查询?请输入y/n:");
        while(1)
        {
            scanf("%s",a);
            fflush(stdin);            //清除缓冲区 
            if((strcmp(a,"y"))!=0&&(strcmp(a,"n")!=0))        //检验是否输入正确 
            {
                printf("   输入的数据有误,请重新输入!");
                fflush(stdin); //清除缓冲区 
            }
            if(strcmp(a,"y")==0||strcmp(a,"n")==0)        //若输入正确,则跳出整个循环 
            {
                break;
            } 
        } 
        if(strcmp(a,"n")==0)
        {
            printf("   将结束此次查询\n");
            system("pause");
            system("cls");
            return;
        }
        else     
        {
            printf("   不退出喔,将继续查询\n"); 
            flag=0;
        }
    }
    system("pause");
    system("cls");
}
void admin_travel()
{
    system("cls");
    char num[20]; 
    int flag=0,year;
    double sumtime=0; 
    printf("\n\n\n   根据员工编号查询年出差信息\n");
    printf("   请输入您要查询的员工编号: ");
    scanf("%s",num);
    fflush(stdin);        //清除缓冲区 
    printf("   请输入您要查询的年份: ");
    scanf("%d",&year);
    fflush(stdin); //清除缓冲区
    for(cu=chead->next;cu!= NULL;cu=cu->next)  
    {  
        if(strcmp(cu->att_number,num)==0)  
        {   
            if(cu->att_year==year)
            {
                flag++;
                sumtime+=cu->att_traveltime;
                continue;
            }
            else
            {
                continue;
            }
        }
    }
    if(flag==0)
    {
        printf("   --->未找到该年员工出差的信息!\n"); 
    }
    if(flag>0)
    {
        printf("   该员工%d年的出差时间为  %lf  小时\n",year,sumtime);
        
    }
    system("pause");
    system("cls");
}
void staff_add()
{
    system("cls");
    int i,k;
    int sign1,sign2=0;    //作为判断是否重复的一个标志 
    u=newnode(u);        //创建一个新节点 
    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("   *       7.权限:                                  *\n");
    printf("   *                                                *\n");
    printf("   *       8.密码:                                  *\n");
    printf("   *                                                *\n");
    printf("   **************************************************\n");
    while(1)
    {
        gotoxy(24,2);                                    //光标移动函数, 
        scanf("%s",u->employee_number);
        fflush(stdin);        //清除缓冲区 
        for(i=0;i<strlen(u->employee_number);i++)        //遍历输入的数据,判断是否满足要求 
        {
            if(u->employee_number[i]<'0'||u->employee_number[i]>'9')   
            {
                gotoxy(24,2);
                printf("编号应为数字,请重新输入");
                Sleep(600);
                gotoxy(24,2);
                for(k=0;k<=23;k++)    //把上一个printf显示的数据清空 
                printf(" ");
                break;                //结束整个for语句 
            }
            if(strlen(u->employee_number)!=7)
            {
                gotoxy(24,2);
                printf("编号应为7位,请重新输入");
                Sleep(600);
                gotoxy(24,2);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
        } 
        strcpy(check,u->employee_number);
        for(at=av->next;at!=NULL;at=at->next)            //定义一个中间变量,来遍历staff这个链表 
        {
            if(strcmp(at->employee_number,check)==0)
            {
                sign1=0;
                gotoxy(24,2); 
                printf("该编号已经存在,请重新输入");
                Sleep(600);
                gotoxy(24,2);
                for(k=0;k<=25;k++)
                printf(" ");
                break;
            }
            if(strcmp(at->employee_number,check)!=0)        //如果未找到,则结束此次循环 
            {
                continue;
            }
        }
        if(at==NULL) //表明此次输入的编号是新的,则置标志sign1=1 
        {
            sign1=1;
        }
        if(strlen(u->employee_number)==7 && i==strlen(u->employee_number) && sign1==1)
        {
            //若输入的编号为7位,且经过i次遍历,且标志sign1=1 
            break;
        }
    }
    while(1)
    {
        gotoxy(24,4);
        scanf("%s",u->name);
        fflush(stdin);        //清除缓冲区 
        for(i=0;i<strlen(u->name);i++)        //遍历输入的数据,判断是否满足要求
        {
            if(u->name[i]>=0&&u->name[i]<=255)    //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入 
            {
                gotoxy(24,4);
                printf("不是中文,请重新输入");
                Sleep(600);
                gotoxy(24,4);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
        } 
        if(i==strlen(u->name))
        {
            break;
        } 
    }
    while(1)
    {
        gotoxy(24,6);
        scanf("%s",u->department);
        fflush(stdin);        //清除缓冲区 
        for(i=0;i<strlen(u->department);i++)        //遍历输入的数据,判断是否满足要求
        {
            if(u->department[i]>=0&&u->department[i]<=255)    //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入 
            {
                gotoxy(24,6);
                printf("不是中文,请重新输入");
                Sleep(600);
                gotoxy(24,6);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
        } 
        if(i==strlen(u->department))
        {
            break;
        }
    }
    while(1)
    {
        gotoxy(24,8);
        scanf("%s",u->gender);
        fflush(stdin);        //清除缓冲区 
        for(i=0;i<strlen(u->gender);i++)        //遍历输入的数据,判断是否满足要求
        {
            if(u->gender[i]>=0&&u->gender[i]<=255)    //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入 
            {
                gotoxy(24,8);
                printf("不是中文,请重新输入");
                Sleep(600);
                gotoxy(24,8);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
        } 
        if(i==strlen(u->gender))
        {
            break;
        } 
    }
    while(1)
    {
        gotoxy(24,10);                                    //光标移动函数, 
        scanf("%s",u->IDnumber);
        fflush(stdin);        //清除缓冲区 
        for(i=0;i<strlen(u->IDnumber);i++)        //遍历输入的数据,判断是否满足要求 
        {
            if(u->IDnumber[i]<'0'||u->IDnumber[i]>'9')   
            {
                gotoxy(24,10);
                printf("身份证号应为数字,请重新输入");
                Sleep(600);
                gotoxy(24,10);
                for(k=0;k<=45;k++)    //把上一个printf显示的数据清空 
                printf(" ");
                break;                //结束整个for语句 
            }
            if(strlen(u->IDnumber)!=18)
            {
                gotoxy(24,10);
                printf("编号应为18位,请重新输入");
                Sleep(600);
                gotoxy(24,10);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
        } 
        strcpy(check,u->IDnumber);
        for(at=av->next;at!=NULL;at=at->next)            //定义一个中间变量,来遍历staff这个链表 
        {
            if(strcmp(at->IDnumber,check)==0)
            {
                sign1=0;
                gotoxy(24,10); 
                printf("该号码已经存在,请重新输入");
                Sleep(600);
                gotoxy(24,10);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
            if(strcmp(at->IDnumber,check)!=0)        //如果未找到,则结束此次循环 
            {
                continue;
            }
        }
        if(at=NULL) //表明此次输入的身份证号是新的,则置标志sign1=1 
        {
            sign1=1;
        }
        if(strlen(u->IDnumber)==18 && i==strlen(u->IDnumber) && sign1==1)
        {
            //若输入的身份证号为18位,且经过i次遍历,且标志sign1=1 
            break;
        }
    }
    while(1)
    {
        gotoxy(24,12);
        scanf("%s",u->duty);
        fflush(stdin);        //清除缓冲区 
        for(i=0;i<strlen(u->duty);i++)        //遍历输入的数据,判断是否满足要求
        {
            if(u->duty[i]>=0&&u->duty[i]<=255)    //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入 
            {
                gotoxy(24,12);
                printf("不是中文,请重新输入");
                Sleep(600);
                gotoxy(24,12);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
        } 
        
        if(i==strlen(u->duty))
        {
            break;
        }
    }
    while(1)
    {
        gotoxy(24,14);
        scanf("%s",u->jurisdiction);
        fflush(stdin);        //清除缓冲区 
        for(i=0;i<strlen(u->jurisdiction);i++)        //遍历输入的数据,判断是否满足要求
        {
            if(u->jurisdiction[i]>=0&&u->jurisdiction[i]<=255)    //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入 
            {
                gotoxy(24,14);
                printf("不是中文,请重新输入");
                Sleep(600);
                gotoxy(24,14);
                for(k=0;k<=23;k++)
                printf(" ");
                break;
            }
        } 
        if(i==strlen(u->jurisdiction))
        {
            break;
        } 
    }
    while(1)
    {
        gotoxy(24,16);
        scanf("%s",u->password);
        fflush(stdin);        //清除缓冲区 
        if(strlen(u->password)>15)
        {
            gotoxy(24,16);
            printf("密码输入过长 ^.^ 请重新输入");
            Sleep(600);
            gotoxy(24,16);
            for(k=0;k<23;k++)
            printf(" ");
        }
        if(strlen(u->password)<=15)
        {
            break;
        }
    } 
    u->next=head->next;  //采用头插法将新节点的尾指针指向第二个节点
    head->next=u;          //将新节点放在头节点后面
    printf("\n\n\n\n   --->采集成功!\n");
    staff_storage();
    printf("\n   ");
    system("pause");
    system("cls");
}
void staff_del()        //按员工的编号来删除
{
    system("cls");
    char num[20];
    int flag=0;
    printf("\n   请输入您要删除员工的编号: ");  
    scanf("%s",num);  
    fflush(stdin); //清除缓冲区 
    for(u=head;u!=NULL;u=u->next)                  //遍历这个链表 
    {  
        if(strcmp(u->employee_number,num)==0)      //找到相同的编号 
        {  
            flag=1; 
            printf("   查找成功!\n"); 
            printf("   员工信息 \n");
            puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
            printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
            printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
            p->next=u->next;  
            free(u);  
            printf("\n   --->删除成功!\n");
            staff_storage();
            break; 
        }  
        p=u;              //p指向u当前的节点,后u又指向下一个节点 
    }  
    if(flag==0)  
    printf("\n   --->没有这个员工的信息!\n");  
    system("pause");
    system("cls");
}
void staff_find()
{
    system("cls");
    int choice;
    do
    {
        printf("\n\n\n");
        printf("   **********************************\n");
         printf("   *        1.按编号查找            *\n");
         printf("   *                                *\n");
         printf("   *        2.按姓名查找            *\n");
        printf("   *                                *\n");
         printf("   *        3.按身份证号查找        *\n");
         printf("   *                                *\n");
        printf("   *        0.退出,返回上一个菜单  *\n");
        printf("   *                                *\n");
        printf("   **********************************\n");
          printf("   请选择:");
          scanf("%d",&choice);
          fflush(stdin);        //清除缓冲区 
          if(choice==0||choice==1||choice==2||choice==3||choice==4)
        {
            switch(choice)
            {
            case 1:    staff_find_num();    break;
            case 2: staff_find_name();    break;
            case 3:    staff_find_IDnum();    break;
            }    
        } 
        else
        {
            printf("   输入有误,请重新输入:\n");
            fflush(stdin);        //清除缓冲区 
            system("cls");
            choice=1;             //重新给choice赋值,防止跳出循环 
        }
        printf("\n\n");    
    }while(choice!=0);
    printf("   将返回到上一个菜单!\n");
    system("pause");
    system("cls");
    return; 
}
void staff_find_num()
{
    char num[20];
    int flag=0;
    printf("   根据编号查询信息\n");
    printf("   请输入您要查询员工的编号: ");
    scanf("%s",num);
    fflush(stdin); //清除缓冲区 
    for(u=head->next;u!= NULL;u=u->next)  
    {  
        if(strcmp(u->employee_number,num)==0)  
        {  
            flag=1; 
            printf("   查找成功!\n");  
               puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
            printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
            printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
            break;
        }
    }
    if(flag==0)
    {
        printf("   --->未找到该员工!\n"); 
    }
    system("pause");
    system("cls");
}
void staff_find_name()
{
    char staffname[20];
    int flag=0;
    printf("   根据姓名查询信息\n");
    printf("   请输入您要查询员工的姓名: ");
    scanf("%s",staffname);
    fflush(stdin); //清除缓冲区 
    for(u=head->next;u!= NULL;u=u->next)  
    {  
        if(strcmp(u->name,staffname)==0)  
        {  
            flag=1;  
            printf("   查找成功!\n"); 
               puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
            printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
            printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
            break;
        }
    }
    if(flag==0)
    {
        printf("   --->未找到该员工!\n"); 
    }
    system("pause");
    system("cls");
}
void staff_find_IDnum()
{
    char num[20];
    int flag=0;
    printf("   根据身份证号查询信息\n");
    printf("   请输入您要查询员工的身份证号: ");
    scanf("%s",num);
    fflush(stdin); //清除缓冲区 
    for(u=head->next;u!= NULL;u=u->next)  
    {  
        if(strcmp(u->IDnumber,num)==0)  
        {  
            flag=1;  
            printf("   查找成功!\n"); 
               puts("      职工编号     姓名     所属部门     性别     身份证号码      职务     权限\n");    
               printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
            printf("    %-8s %-8s %-8s %-8s %-8s %-8s %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
            break;
        }
    }
    if(flag==0)
    {
        printf("   --->未找到该员工!\n"); 
    }
    system("pause");
    system("cls");
}
void staff_modify_find()    //按照编号查找员工信息 
{
    system("cls");
    int flag=0;
    printf("\n   请输入您要修改员工的编号: ");  
    scanf("%s",number);  
    fflush(stdin);                                     //清除缓冲区 
    for(u=head->next;u!= NULL;u=u->next)              //遍历这个链表 
    {  
        if(strcmp(u->employee_number,number)==0)      //找到相同的编号 
        {  
            flag=1; 
            printf("   查找成功!\n"); 
            printf("   员工信息 \n");
            puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
            printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
            printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
            system("pause");
            staff_modify();
            break; 
        }  
    }  
    if(flag==0)  
    printf("\n   --->没有这个员工的信息!\n");  
    system("pause");
    system("cls");
}
void staff_modify()
{
    system("cls");
    int choice;    
    int i;
    do
    {
        //因为在储存时u所指向的节点已经发生变化,故再次遍历链表, 找到上次修改的节点 
        for(p=head->next;p!= NULL;p=p->next)
        {
            if(strcmp(p->employee_number,number)==0)
            {
                u=p;
            }
        }
        printf("\n");
        printf("   *******************修改员工信息**********************\n");
         printf("   *        1.修改编号        2.修改姓名             *\n");
         printf("   *                                                   *\n"); 
         printf("   *        3.修改部门        4.修改身份证号         *\n");
        printf("   *                                                   *\n");
         printf("   *        5.修改职务       6.修改权限             *\n");
         printf("   *                                                   *\n");
         printf("   *        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||choice==6)
        {
            switch(choice)
              {
                  case 1:
                {
                      while(1)
                    {
                        printf("    请输入新的编号:");
                        scanf("%s",u->employee_number);
                        fflush(stdin);        //清除缓冲区 
                        for(i=0;i<strlen(u->employee_number);i++) //遍历输入的数据,判断是否满足要求
                        {
                            if(u->employee_number[i]<'0'||u->employee_number[i]>'9')
                            {
                                printf("   编号必须是数字  请重新输入\n");
                                break;
                            }
                            if(strlen(u->employee_number)!=7)
                            {
                                printf("  编号必须为7位  请重新输入\n");
                                break;
                            }
                        }
                        if(strlen(u->employee_number)==7&&i==strlen(u->employee_number))
                        {
                            strcpy(number,u->employee_number);
                            break;
                        }
                    }
                    printf("\n   --->修改成功!\n");
                    printf("    新的员工信息 \n");
                    puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
                    printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
                    printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
                    system("pause");
                    staff_storage();
                    system("pause");
                    system("cls");
                    break;
                }    
                case 2:
                {
                    while(1)
                    {
                        printf("   请输入新的名字: ");
                        scanf("%s",u->name);
                        fflush(stdin);        //清除缓冲区 
                        for(i=0;i<strlen(u->name);i++)        //遍历输入的数据,判断是否满足要求
                        {
                            if(u->name[i]>=0&&u->name[i]<=255)    //如果在ascll表,符号,数组,英文的范围内,证明输入的不是中文,则重新输入 
                            {
                            printf("   不是中文,请重新输入\n");
                            break;
                            }
                        } 
                        if(i==strlen(u->name))
                        {
                            break;
                        } 
                    }
                    printf("\n   --->修改成功!\n");
                    printf("    新的员工信息 \n");
                    puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
                    printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
                    printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
                    system("pause");
                    staff_storage();
                    system("pause");
                    system("cls");
                    break;
                }
                case 3:
                {
                    while(1)
                    {
                        printf("   *请输入新的部门: ");
                        scanf("%s",u->department);
                        fflush(stdin);        //清除缓冲区 
                        for(i=0;i<strlen(u->department);i++) 
                        {
                            if(u->department[i]>=0&&u->department[i]<=255)
                            {
                                printf("   不是中文 , 请重新输入\n");
                                break;
                            }
                        }
                        if(i==strlen(u->department))
                        {
                            break;
                        }
                    }
                    printf("\n   --->修改成功!\n");
                    printf("    新的员工信息 \n");
                    puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
                    printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
                    printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
                    system("pause");
                    staff_storage();
                    system("pause");
                    system("cls");
                    break;
                }
                case 4:
                {
                    while(1)
                    {
                        printf("   请输入新的身份证号: ");
                        scanf("%s",u->IDnumber);
                        fflush(stdin);        //清除缓冲区 
                        for(i=0;i<strlen(u->IDnumber);i++)        //遍历输入的数据,判断是否满足要求 
                        {
                            if(u->IDnumber[i]<'0'||u->IDnumber[i]>'9')   
                            {
                                printf("身份证号应为数字,请重新输入\n");
                                break;                //结束整个for语句 
                            }
                            if(strlen(u->IDnumber)!=18)
                            {
                                printf("编号应为18位,请重新输入\n");
                                break;
                            }
                        } 
                        if(strlen(u->IDnumber)==18&&i==strlen(u->IDnumber))
                        {
                            break;
                        }
                    }
                    printf("\n   --->修改成功!\n");
                    printf("    新的员工信息 \n");
                    puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
                    printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
                    printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
                    system("pause");
                    staff_storage();
                    system("pause");
                    system("cls");
                    break;
                }
                case 5:
                {
                    while(1)
                    {
                        printf("   *请输入新的职务: ");
                        scanf("%s",u->duty);
                        fflush(stdin);        //清除缓冲区 
                        for(i=0;i<strlen(u->duty);i++) 
                        {
                            if(u->duty[i]>=0&&u->duty[i]<=255)
                            {
                                printf("   不是中文 , 请重新输入\n");
                                break;
                            }
                        }
                        if(i==strlen(u->duty))
                        {
                            break;
                        }
                    }
                    printf("\n   --->修改成功!\n");
                    printf("    新的员工信息 \n");
                    puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
                    printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
                    printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
                    system("pause");
                    staff_storage();
                    system("pause");
                    system("cls");
                    break;
                }
                case 6:
                {
                    while(1)
                    {
                        printf("   *请输入新的权限: ");
                        scanf("%s",u->duty);
                        fflush(stdin);        //清除缓冲区 
                        for(i=0;i<strlen(u->jurisdiction);i++) 
                        {
                            if(u->jurisdiction[i]>=0&&u->jurisdiction[i]<=255)
                            {
                                printf("   不是中文 , 请重新输入\n");
                                break;
                            }
                        }
                        if(i==strlen(u->jurisdiction))
                        {
                            break;
                        }
                    }
                    printf("\n   --->修改成功!\n");
                    printf("    新的员工信息 \n");
                    puts("      职工编号     姓名     所属部门     性别     身份证号码            职务       权限\n");    
                    printf("      ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  
                    printf("      %-8s     %-8s  %-8s    %-8s %-8s    %-8s   %-8s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction);
                    system("pause");
                    staff_storage();
                    system("pause");
                    system("cls");
                    break;
                }
            }
        }
    printf("\n\n");
    }while(choice!=0);
    printf("   将返回到上一个菜单!\n");
    system("pause");
    system("cls");
    return;
}
void staff_read()
{
    char a[160];                        //存放读取的汉字
    FILE *fp;
    char ch;
    fp=fopen("staff.txt","a+");          //进入程序时打开/建立该文件
    fclose(fp);
    if((fp=fopen("staff.txt","r+"))==NULL)  
    {  
        printf("\n   --->没有找到文件!\n");  
        return ;  
    }
    ch=fgetc(fp);                        //从指定的文件读取一个字符 
    if(ch==EOF)
    {
        return;
    }
    else
    rewind(fp);                            //如果文件有内容,则把文件读写指针移动到文件的开头 
    fgets(a,140,fp);                    //读取第一行汉字信息
    while(!feof(fp))                      //未到文件末尾继续循环 
    {   
        u=newnode(u);
        fscanf(fp,"%s %s %s %s %s %s %s %s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction,u->password);  
        u->next=head->next;            //头插法建立链表 
        head->next=u;  
    }
    fclose(fp);
}
void staff_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("staff.txt","w+"))==NULL)  /*以w+的方式写入,每次写入数据时先把原来的内容清空,这里不用担心数据丢失,因为数据已经从文件中读取,存入程序的链表里面了*/
    {  
        printf("\n   --->staff.txt文件打开失败!\n");
        return ;  
    }
    fputs("职工编号  姓名  所属部门  性别  身份证号码                    职务        权限          密码\n",fp);
    //从头节点开始依次写入文件 
    for(u=head->next;u!=NULL;u=u->next)  
    { 
        fprintf(fp,"%s %s  %s         %s     %s %s     %s   %s\n",u->employee_number,u->name,u->department,u->gender,u->IDnumber,u->duty,u->jurisdiction,u->password);  
    }  
    fflush(stdin);            //清除缓冲区 
    fclose(fp);  
    printf("\n   --->信息成功存入\n");
}

                    flag++; 
                    if(flag==1)
                    {
                        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);
                    printf("\n"); 
                    sum_intime+=cu->att_intime;
                    sum_traveltime+=cu->att_traveltime;
                    sum_latetime+=cu->att_latetime;
                    sum_overtime+=cu->att_overtime;
                    continue;
                }
            }
        }        
    }
    if(flag>0)
        {
            printf("\n\n\n");
            printf("   考勤日期  月在岗时间  月出差时间  月迟到时间  月加班时间\n");
            printf("   ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");
            printf("   %d %d    %lf   %lf   %lf    %lf\n",year,mon,sum_intime,sum_traveltime,sum_latetime,sum_overtime);
            sum_intime=0;
            sum_traveltime=0;
            sum_latetime=0;
            sum_latetime=0;
            printf("\n");
        }
    if(flag==0)
    {
        printf("   --->未找到此月你的出勤的信息!\n"); 
    }
    system("pause");
    system("cls");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值