企业员工管理系统 c语言版

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>

#define N 100;


/********************************************结构体部分*******************************************************/
//构建员工的结构体
struct employee
{
    int num;//编号
    char name[8];//姓名
    char sex[2];//性别
    int   Csrq;//出生日期
    char  Jrsj[5];//进入时间
    char Sfzh[20];//身份证号
    int Ssbm;//所属部门
    int Zw;//职位
    int state;
    char phone[15];//电话号码
    char mail[15];//电子邮件
    char Qita[20];//其他w

};
struct employee em[100];

typedef struct loginUser
{
    char userName[20];//登陆用户账号
    char userPWD[20];//登陆密码
    int userRole;//用户角色,0--未审核用户,1--普通用户,2--超级管理员(审核新注册用户)
    struct loginUser *next;
} LoginUser;
typedef struct zwInfo//职务
{
    int zwId;
    char zwName[20];
    char zwBZ[50];
} ZwInfo;

typedef struct bminfo//定义结构体数组,并自定义命名Bminfo
{
    int bmid;//部门编号
    char bmname[10];//部门名称
    char bmphone[13];//部门电话
    char bmCZphone[13];//部门传真电话
    char bmaddress[50];//部门地址
    char bmQTSM[50];//其他说明
    struct bminfo *next;
} BmInfo;
/***************************************************************************************************/


LoginUser inUser;//已登陆用户,全局变量


/********************************************函数声明部分*******************************************************/
//函数声明
void showend(void);
void search();
void allshow();
void PrintZwTr();
void part();
void change();
void add();
void Fanhui();
void del();
void save(int);
void Tjzjinfo();
void Tjljinfo();
//void Tjage();

void tjinfo(int a);

int password(char *str,int size);//密码输入,“*”显示, p指向存储用户输入密码的数组,size为限制输入数
int StringLength(char *str,int max,int THEMAX,const int a);//限制输入字符长度,str为用于存储字符串的指针,max为自定义限制长度,THEMAX为自定义容错范围,a为选择超长是否截取(0:不截取即重新输入;1:截取即只取max长度)
int Login();//登陆系统函数,按ESC键退出,失败返回0,成功返回1,ESC退出返回2
int Logon();//用户注册函数,按ESC键退出,失败返回0,成功返回1,ESC退出返回2
void MainMenu();//主菜单函数
void Welcome();//登陆成功后,选择:进入系统、修改密码
void userManage();//用户管理
void PrintUserTr(int a ,char *userName,char *userPWD,char *userRole);//显示用户列表行,职务管理
void AddUser();//管理员添加用户
void AduUser();//管理员审核用户
void DelUser();//管理员删除用户
void ModifyPWD();//用户登陆后修改密码
void mainpage();//进入系统后主界面
void ExitSys();//退出系统,<Y/N>
void PrintZwTr(int a ,char *zwName,char *zwBZ);//显示职务列表行,职务管理
void ZwManage();//职务管理
void AddZW();//添加职务
void ModifyZW();//修改职务
void DelZW();//删除职务信息,假删除,将职务编号置为零
void BmManage(int a);//部门管理
void AddBM();//添加部门
void ModifyBM();//修改部门
void DelBM();//删除部门
void getZW(char *str,int a);//根据id获取职务名称
void getBM(char *str,int a);//根据id获取部门名称
void showZW();//显示职务名称
void showBM();//显示部门名称

/***********************************************************************************************************/
void main()
{
    system("color 3F");   
    MainMenu(1);
}
/***********************************************************************************************************/

/********************************************魏凡设计部分*******************************************************/

void MainMenu()//主菜单函数
{
    int a=1;
    while (1)
    {
        int num,i;
        char pointto[5];
        system("cls");
        for(i=0;i<5;i++)
        {
            pointto[i]='/0';
        }
        pointto[a-1]='<';
        printf("/t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/n");
        printf("/t ★●             欢迎使用            ●★/n");
        printf("/t    ★●                             ●★/n");
        printf("/t        ★★★★★★★★   XWL    ★★★★★★★★★/n");
        printf("/n");
        printf("/t/t  ┏─────────────────┓/n/n/n");
        printf("/t/t     1,输入密码         %c   /n/n",pointto[0]);
        printf("/t/t       2,用户注册       %c   /n/n",pointto[1]);
        printf("/t/t     3,退出系统 %c   /n/n/n",pointto[2]);
        printf("/t/t  ┗─────────────────┛/n");
        num=getch()-48;
        if(num==-35)
        {
            switch(a)
            {
            case 1:
                Login();
                break;
            case 2:
                Logon();
                break;
            case 3:
                printf("/t/t/t真的要退出吗?(Y/N)");
                if(getch()=='y')
                {
                    exit(0);   
                }
                break;
            }
        }
        else
        {
            if (num>0&&num<5)
            {
                a=num;
            }
        }

    }
}
int password(char *p,int size)//密码输入,“*”显示, p指向存储用户输入密码的数组,size为限制输入数
{
    //char p[20];
    char key;
    int i=0;
    //memset(p,0,20);
    //memset(str,0,20);

    while(1)
    {
        if(i>size)
        {
            key=_getch();
            if(key==8)
            {
                printf("/b /b");
                i--;
            }
            if(key==13)
            {
                p[i]='/0';
                //strcpy(str,p+1);
                break;
            }
            continue;
        }
        p[i]=_getch();
        if(p[i]==8)
        {
            if (i==0)
            {
                continue;
            }
            printf("/b /b");
            i--;
            continue;
        }
         else if(p[i]==13)
        {
            p[i]='/0';
            //strcpy(str,p+1);
            break;
        }
        printf("*");
        i++;
    }
    return 0;
}
int Login()//登陆系统函数,按ESC键退出,失败返回0,成功返回1,ESC退出返回2
{
    LoginUser user;
    char userName[20];
    char userPWD[20];
    FILE *fp;
    printf("/n/t/t/t/t账号:");
    //gets(userName);
    scanf("%s",userName);
     printf("/n/t/t/t/t密码:");
     //gets(userPWD);
    //scanf("%s",userPWD);
    password(userPWD,18);//密码输入函数,“*” 显示,限制18位
    if ((fp=fopen("login.txt","r"))==NULL)
    {
        return 0;
    }
    else
    {
        rewind(fp);
        while (!feof(fp))
        {
            fread(&user,sizeof(LoginUser),1,fp);
            if (strcmp(user.userName,userName)==0)
            {
                if (user.userRole==0)
                {
                    printf("/n该用户暂未经过审核/n请等待超级管理员审核……/n");
                    getch();
                    MainMenu();
                    return 0;
                }
                if (strcmp(user.userPWD,userPWD)==0)
                {
                    strcpy(inUser.userName,user.userName);
                    strcpy(inUser.userPWD,user.userPWD);
                    inUser.userRole=user.userRole;
                    Welcome();
                    break;
                }
                else
                {
                    printf("/n/n/t/t/t密码错误,登陆失败!按任意键返回!/n");
                    getch();
                    MainMenu();
                }
            }   
        }
        if (inUser.userName==NULL)
        {
            printf("/n/n/t/t/t该用户不存在,登陆失败!按任意键返回!");
            fclose(fp);
            getch();
        }   
        MainMenu();   
    }
}

int Logon()//用户注册函数,按ESC键退出,失败返回0,成功返回1,ESC退出返回2
{
    FILE *fp;
    char userName[20];
    char userPWD[20];
    LoginUser user;
    LoginUser user1;
    int usersCount=0;
    do
    {
        int isNameVil=1;//用户名是否通过,1--通过,0--未通过   
        do
        {
            printf("输入账号:");
            //gets(userName);
            //scanf("%s",userName);
            StringLength(userName,15,200,0);
            if (strlen(userName)==0)
            {
                printf("用户名不能为空/n/n按任意键重新输入/n按ESC返回/n");
                switch(_getch())
                {
                case 0x1b:
                    //fclose(fp);
                    return 2;
                default:
                    //fclose(fp);
                    break;
                }
            }
        } while(strlen(userName)==0);
        if ((fp=fopen("login.txt","r"))==NULL)
        {
            printf("Can not open file!");
        }
        else
        {
            while (!feof(fp))
            {
                usersCount+=fread(&user,sizeof(LoginUser),1,fp);
                if (strcmp(user.userName,userName)==0)
                {
                    isNameVil=0;//用户名已存在,未通过
                }
            }
            fclose(fp);
            if (isNameVil)
            {
                if ((fp=fopen("login.txt","a"))==NULL)
                {
                    printf("Can not open file!");
                }
                else
                {
                    do
                    {
                        strcpy(user1.userName,userName);
                        printf("/n输入密码(18位以内):");
                        //gets(user1.userPWD);
                        //scanf("%s",user1.userPWD);
                        password(user1.userPWD,18);//密码输入函数,“*” 显示,限制18位
                        printf("/n确认密码:");
                        //gets(userPWD);
                        //scanf("%s",userPWD);
                        password(userPWD,18);//密码输入函数,“*” 显示,限制18位
                        if (strcmp(user1.userPWD,userPWD)!=0)
                        {
                            printf("/n两次输入不一致/n");
                        }
                    } while(strcmp(user1.userPWD,userPWD)!=0);
                    if (usersCount==0)
                    {
                        user1.userRole=2;
                    }
                    else
                    {
                        user1.userRole=0;
                    }
                    fseek(fp,0,SEEK_END);
                    fwrite(&user1,sizeof(LoginUser),1,fp);
                    printf("/n成功!");
                    fclose(fp);
                    _getch();
                    MainMenu();
                    //return 1;
                }
            }
            else
            {
                printf("/n该用户名已存在/n按任意键重新输入/n按ESC返回/n");
                switch(_getch())
                {
                case 0x1b:
                    fclose(fp);
                    return 2;
                default:
                    break;
                }
            }
        }
    } while(1);   
}

int StringLength(char *str,int max,int THEMAX,const int a)//限制输入字符长度,str为用于存储字符串的指针,max为自定义限制长度,THEMAX为自定义容错范围,a为选择超长是否截取(0:不截取即重新输入;1:截取即只取max长度)
{
    char *p;
    memset(str,0,max);
    p=(char *)malloc(sizeof(char)*THEMAX);
    while (1)
    {
        fflush(stdin);
        gets(p);
        if (a==0)
        {
            if (strlen(p)>max)
            {
                printf("输入字符过长,重新输入/n");
                continue;
            }
            else
            {
                strcpy(str,p);
                break;
            }
        }
        else
        {
            strncpy(str,p,max);
            str[max]='/0';
            break;
        }
    }
    free(p);
    return 0;
}

void ExitSys()//退出系统,<Y/N>
{
    char key;
    printf("谢谢使用……/n");
    printf("是否退出<Y/N>/n");
    while (1)
    {
        scanf("%c",&key);
        switch(key)
        {
        case 'y':
        case 'Y':
            exit(0);
            break;
        case 'n':
        case 'N':
            return;
            break;
        }
    }
}
void Welcome()//登陆成功后,选择:进入系统、修改密码
{
    int a=1;
    while (1)
    {       
        int num,i;
        char pointto[5];
        system("cls");
        for(i=0;i<4;i++)
        {
            pointto[i]='/0';
        }
        pointto[a-1]='<';
        printf("/t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/n");
        printf("/t ★●             欢迎使用            ●★/n");
        printf("/t    ★●                             ●★/n");
        printf("/t        ★★★★★★★★   XWL    ★★★★★★★★★/n");
        printf("/n");
        printf("/t/t    ┏─────────┓        /n");
        printf("/t/t    │     主界面       │        /n");
        printf("/t/t┏───┴─────────┴───┓/n/n/n");
        printf("/t/t    1◆进入系统         %c   /n/n",pointto[0]);
        printf("/t/t      2◆修改密码       %c   /n/n",pointto[1]);
        if (inUser.userRole==2)
        {
            printf("/t/t    3◆用户管理 %c   /n/n",pointto[2]);
            printf("/t/t      4◆返    回         %c   /n/n/n",pointto[3]);
        }
        else
        {
            printf("/t/t      3◆返    回         %c   /n/n/n",pointto[2]);
        }
        printf("/t/t┗─────────────────┛/n");
        num=getch()-48;
        if(num==-35)
        {
            switch(a)
            {
            case 1:
                mainpage(1);
                return;
                break;
            case 2:
                ModifyPWD();
                break;
            case 3:
            case 4:
                if (inUser.userRole==2)
                {
                    if (a==3)
                    {
                        userManage();
                    }
                    else if (a==4)
                    {
                        return;
                    }
                }
                else
                {
                    if (a==3)
                    {
                        return;
                    }
                }
                break;
            }
        }
        else
        {
            if (num>0&&num<5)
            {
                a=num;
            }
        }
    }
}


void ModifyPWD()//用户登陆后修改密码
{
    FILE *fp;
    LoginUser user;
    LoginUser user1;
    fpos_t oldpos;
    char userPWD1[20];
    char userPWD2[20];
    printf("/n/t/t/t/t用户名:%s/n",inUser.userName);
    printf("/n/t/t/t/t原始密码:");
    //gets(userPWD1);
    //scanf("%s",userPWD1);
    password(userPWD1,18);
    if (strcmp(userPWD1,inUser.userPWD)!=0)
    {
        printf("/n/t/t/t密码错误!任意键返回/n");
        getch();
        Welcome(2);
        return;
    }
    printf("/n/t/t/t/t新密码:");
    //gets(userPWD2);
    //scanf("%s",userPWD2);
    password(userPWD2,18);
    printf("/n/t/t/t/t确认密码:");
    //gets(user.userPWD);
    //scanf("%s",user.userPWD);
    password(user.userPWD,18);
    if (strcmp(userPWD2,user.userPWD)!=0)
    {
        printf("/n/t/t/t两次输入密码不一致!任意键返回/n");
        getch();
        Welcome(2);
        return;
    }
    if ((fp=fopen("login.txt","r++"))==NULL)
    {
        printf("Can not open file");
    }
    else
    {
        while ((fread(&user1,sizeof(LoginUser),1,fp))==1)
        {
            fgetpos(fp,&oldpos);
            if (strcmp(inUser.userName,user1.userName)==0)
            {
                strcpy(user.userName,inUser.userName);
                user.userRole=inUser.userRole;
                fsetpos(fp,&oldpos);
                fseek(fp,-sizeof(LoginUser),SEEK_CUR);
                fwrite(&user,sizeof(LoginUser),1,fp);
                fclose(fp);
                printf("/n/t/t/t修改成功!任意键返回/n");
                getch();
                Welcome(2);
                return;
                break;
            }
//             fseek(fp,-sizeof(LoginUser),SEEK_CUR);
//             fwrite(&user,sizeof(LoginUser),1,fp);
        }
    }
}

void PrintUserTr(int a ,char *userName,char *userPWD,char *userRole)//显示用户列表行,职务管理
{
    printf("┃ %-7d┃%-22s┃%-22s┃%-16s┃/n",a,userName,userPWD,userRole);   
}
void userManage()
{
    FILE *fp;
    LoginUser user;
    LoginUser *h=NULL;
    LoginUser *p=NULL;
    LoginUser *s=NULL;
    LoginUser *c=NULL;
    char roleName[3][20]={{"未审核"},{"普通用户"},{"超级管理员"}};
    int count=0;
    int bh;
    if (inUser.userRole!=2)
    {
        return;
    }
    while (1)
    {
        system("cls");
        printf("/t/t/t/t用户管理/n/n");   
        if ((fp=fopen("login.txt","r"))==NULL)
        {
            printf("Can not open file!");
            exit(0);
        }
        else
        {
            h=(LoginUser *)malloc(sizeof(LoginUser));
            p=h;
            printf("┏━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┓/n");
            while (fread(&user,sizeof(LoginUser),1,fp)==1)
            {
                s=(LoginUser *)malloc(sizeof(LoginUser));
                s->userRole=user.userRole;
                strcpy(s->userName,user.userName);
                strcpy(s->userPWD,user.userPWD);
                p->next=s;
                p=s;
                count++;
            }
            p->next=NULL;
            bh=count;
            while(h->next!=NULL)
            {
                h=h->next;
                count--;
                PrintUserTr(bh-count,h->userName,h->userPWD,roleName[h->userRole]);
                if (count==0)
                {
                    continue;
                }
                printf("┣━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━┫/n");
            }                                              
            c=h;
            while (c!=NULL)
            {
                h=c->next;
                free(c);
                c=h;
            }
            printf("┗━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━┛/n");
        }

        printf("/t/t/t┌──────────┐/n");
         printf("/t/t/t│   1  → 添加用户   │/n");
        printf("/t/t/t│   2  → 审核用户   │/n");
        printf("/t/t/t│   3  → 删除用户   │/n");
         printf("/t/t/t│   4  → 返    回   │/n");
         printf("/t/t/t└──────────┘/n");
            switch(_getch())
            {
            case '1':
                AddUser();
                break;
            case '2':
                AduUser();
                break;
            case '3':
                DelUser();
                break;
            case '4':
                return;
            }
    }
}

void AddUser()
{
    char userName[25];
    LoginUser user;
     FILE *fp;
    int isNameVil=1;
    if ((fp=fopen("login.txt","r+"))==NULL)
    {
         printf("Can not open file!");
        getch();
         return;
     }
    printf("添加用户/n/n");   
    do
    {
        isNameVil=1;
        rewind(fp);
        printf("输入用户名:");
        StringLength(userName,20,200,0);
        if (strlen(userName)==0)
        {
            isNameVil=0;
            printf("/n用户名不能为空/n按任意键重新输入/n按ESC返回/n");
        }
        do
        {
            fread(&user,sizeof(LoginUser),1,fp);
            if (strcmp(user.userName,userName)==0)
            {
                isNameVil=0;//用户名已存在,未通过
                printf("/n该用户名已存在/n按任意键重新输入/n按ESC返回/n");
                break;
            }
        } while(!feof(fp));
        if (isNameVil==0)
        {
            switch(_getch())
            {
            case 0x1b:
                fclose(fp);
                return;
            default:
                break;
            }
        }   
    }while (isNameVil==0);
    strcpy(user.userName,userName);
    strcpy(user.userPWD,"123");
    user.userRole=1;
     fwrite(&user,sizeof(LoginUser),1,fp);
     printf("/n添加成功!初始密码为123/n");
    fclose(fp);
    getch();
    return;
}

void AduUser()
{
    char roleName[3][20]={{"未审核"},{"普通用户"},{"超级管理员"}};
    char userName[20];
    LoginUser user;
    char key;
     FILE *fp;
    fpos_t oldpos;
    int isNameVil=1;
    if ((fp=fopen("login.txt","r+"))==NULL)
    {
         printf("Can not open file!");
        getch();
         return;
     }
    printf("审核用户/n/n");
    printf("请输入用户名:");
    StringLength(userName,20,300,0);
    while (fread(&user,sizeof(LoginUser),1,fp)==1)
    {
        fgetpos(fp,&oldpos);
        if (strcmp(user.userName,userName)==0)
        {
            if (user.userRole==2)
            {
                printf("/n不能审核超级管理员!!!/n");
                getch();
                return;
            }
            printf("/n用户名:%s",user.userName);
            printf("/n密  码:%s",user.userPWD);
            printf("/n权  限:%s/n/n",roleName[user.userRole]);
            printf("审核是否通过?<Y/N>……");

            scanf("%c",&key);
            switch(key)
            {
            case 'y':
            case 'Y':
                user.userRole=1;
                break;
            }

            fsetpos(fp,&oldpos);
            fseek(fp,-sizeof(LoginUser),SEEK_CUR);
            fwrite(&user,sizeof(LoginUser),1,fp);
            fclose(fp);
            printf("已保存/n任意键返回/n");
            _getch();
            return;
        }
    }
    fclose(fp);
    printf("未找到!/n任意键返回/n");
    _getch();
    return;
}

void DelUser()
{
    LoginUser *h=NULL;
    LoginUser *p=NULL;
    LoginUser *s=NULL;
    LoginUser *c=NULL;
    LoginUser *theUser=NULL;
    char roleName[3][20]={{"未审核"},{"普通用户"},{"超级管理员"}};
    char userName[20];
    LoginUser user;
    char key;
     FILE *fp;
    if ((fp=fopen("login.txt","r+"))==NULL)
    {
         printf("Can not open file!");
        getch();
         return;
     }
    printf("删除用户/n/n");
    printf("请输入用户名:");
    StringLength(userName,20,300,0);
    h=(LoginUser *)malloc(sizeof(LoginUser));
    p=h;
    while (fread(&user,sizeof(LoginUser),1,fp)==1)
    {
        s=(LoginUser *)malloc(sizeof(LoginUser));
        s->userRole=user.userRole;
        strcpy(s->userName,user.userName);
        strcpy(s->userPWD,user.userPWD);
        if (strcmp(user.userName,userName)==0)
        {
            theUser=s;
        }
        p->next=s;
        p=s;
    }
    fclose(fp);
    p->next=NULL;
    if (theUser!=NULL)
    {   
        if (theUser->userRole==2)
        {
            printf("/n不能删除超级管理员!!!/n");
            getch();
            while (c!=NULL)
            {
                h=c->next;
                free(c);
                c=h;
            }
            return;
        }
        printf("/n用户名:%s",theUser->userName);
        printf("/n密  码:%s",theUser->userPWD);
        printf("/n权  限:%s/n/n",roleName[theUser->userRole]);
        printf("是否删除?<Y/N>……");

        scanf("%c",&key);
        if (key=='Y'||key=='y')
        {
            if ((fp=fopen("login.txt","w"))==NULL)
            {
                 printf("Can not open file!");
                getch();
                 return;
             }
            while (h->next!=NULL)
            {
                h=h->next;
                if (h==theUser)
                {
                    continue;
                }
                printf("%d",fwrite(h,sizeof(LoginUser),1,fp));
            }
            fclose(fp);
            printf("删除成功/n任意键返回/n");
            getch();
        }
        while (c!=NULL)
        {
            h=c->next;
            free(c);
            c=h;
        }
        return;
    }
    else
    {   
        fclose(fp);
        printf("未找到!/n任意键返回/n");
        while (c!=NULL)
        {
            h=c->next;
            free(c);
            c=h;
        }
        _getch();
        return;
    }
}
/*******************************************************************************************************************/


/********************************************王强设计部分***********************************************************/
void mainpage(int a)//主页面选择菜单
{   
    int num,i;
    char pointto[6]="";
    system("cls");
    for(i=0;i<6;i++)
    {
        pointto[i]='/0';
    }
    pointto[a-1]='<';
    printf("/t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/n");
    printf("/t ★●             欢迎使用            ●★/n");
    printf("/t    ★●            XwL                 ●★/n");
    printf("/t     ★★★★★★★★★★~~~^_^~~~★★★★★★★★★★/n");
    printf("/n");
    printf("/t/t/t   ┏─────────┓/n");
    printf("/t/t/t   │  企业员工管理系统│ /n");
    printf("       ┏─────────┴─────────┴────────┓/n/n/n");
    printf("/t/t 1,企业员工信息管理     %c   /n/n",pointto[0]);
    printf("/t/t    2,部门信息管理       %c   /n/n",pointto[1]);
    printf("/t/t 3,职务管理    %c   /n/n",pointto[2]);
    printf("/t/t 4,员工信息统计    %c   /n/n",pointto[3]);
    printf("/t/t 5,返回            %c   /n/n",pointto[4]);
    printf("/t/t 6,退出    %c   /n/n/n",pointto[5]);
    printf("/t┗────────┬─────────┬────────┛/n");
    printf("/t     *************│  /1X    /1w   /1L   │ *************/n");
    printf("     *********************┗─────────┛**********************/n");
    printf("╭︿︿︿╮/n");
    printf("{/ o  o /} /n");
    printf(" ( (oo) )/n");
    printf(" ︶ ︶︶    /n");

   
    num=getch()-48;
    if(num==-35)
    {
        switch(a)
        {
        case 1:
            search();
            return;
            break;
        case 2:
            BmManage(1);
            return;
            break;
        case 3:
            ZwManage();
            return;
            break;
        case 4:
            tjinfo(1);
            return;
            break;
        case 5:
            Welcome(1);
            return;
            break;
        case 0:
            printf("/t/t/t真的要退出吗?(Y/N)");
            if(getch()=='y')
            {
                system("exit");   
            }
            else
            {
                mainpage(a);
            }
        }
    }
    else
    {
        mainpage(num);
    }
}  

/*****************************************************************************************************************/

/********************************************肖雄设计部分*******************************************************/
//员工信息管理

void search()
{
        int key=0;
        system("cls");
        system("color 3F");
        printf("/t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/n");
        printf("/t ★●             欢迎使用            ●★/n");
        printf("/t    ★●                             ●★/n");
        printf("/t        ★★★★★★★★   XWL    ★★★★★★★★★/n");
        printf("/n");


   
        printf("/t/t/t      /1/1员工信息查询/1/1  /n");
   

        printf("/t/t   ┌────────────────┐");
        printf("/t/t/t/t/t       │      1 → 查看全部              │/n");
        printf("/t/t   │                     │/n");
        printf("/t/t   │     2 → 输入编号查询         │/n");
        printf("/t/t   │                     │/n");
        printf("/t/t   │      3 → 修改信息             │/n");
        printf("/t/t   │                     │/n");
        printf("/t/t   │      4 → 删除员工信息         │/n");
        printf("/t/t   │                     │/n");
        printf("/t/t   │      5 → 添加员工信息         │/n");
        printf("/t/t   │                     │/n");
        printf("/t/t   │      0 → 退出             │/n");
        printf("/t/t   └────────────────┘/n");
            printf("/n/t/t请选择(0~5):");

        flushall();    
        scanf("%d",&key);
        //system("cls");  

        switch(key)
        {
            case 1:
                allshow();
            break;
            case 2:
                part();
            break;
            case 3:
                change();
            break;
            case 4:
                del();
            break;
            case 5:
                add();
            break;
            case 0:
                mainpage(3);
            return;
            break;
        }
}



void creatdata()
{
    FILE *fp;
    int i;
    int num;
    fp=fopen("em","wb");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        exit(0);
    }   
    else
    {
       
        for(i=0;i<3;i++)
        {

            printf("第%d个员工/n",i);
            printf("/n");
            printf("编号/n");
            scanf("%d",&em[i].num);
            printf("/n");
            printf("姓名/n");
            scanf("%s",&em[i].name);
            printf("/n");
            printf("请你输入性别以m为男f为女:/n");
            scanf("%s",&em[i].sex);
            printf("/n");
            printf("出生日期/n");
            scanf("%d",&em[i].Csrq);
            printf("/n");
            printf("进入时间/n");
            scanf("%s",&em[i].Jrsj);
            printf("/n");
            printf("身份证号/n");
            scanf("%s",&em[i].Sfzh);
            printf("/n");
            printf("部门/n");
            showBM();
            printf("/n");
            scanf("%d",&em[i].Ssbm);
            printf("/n");
            printf("职位/n");
            showZW();
            printf("/n");
            scanf("%d",&em[i].Zw);
            printf("状态/n");
            scanf("%d",&em[i].state);
            printf("/n");
            printf("电话号码/n");
            scanf("%s",&em[i].phone);
            printf("/n");
            printf("电子邮件/n");
            scanf("%s",&em[i].mail);
                printf("/n");
            printf("其他/n");
                scanf("%s",&em[i].Qita);
            printf("/n");
            fwrite(&em[i],sizeof(struct employee),1,fp);
            //fprintf(fp,"/n");
           
            //fprintf(fp,"%d %s %s %s %s %d %d %d %d %d %d %d",em[i].num,em[i].name,em[i].sex,em[i].Csrq,em[i].Jrsj,em[i].Sfzh,em[i].Zw,em[i].state,em[i].phone,em[i].mail,em[i].Qita);
          
            system("pause");
        }
    }
}

//显示全部的员工信息
void allshow()
{
    FILE *fp;
    int key;
    int i;
    int m;
    char bm[5];
    char zw[5];
    char sdt[5];
    long length;
    long length1;
    system("cls");

    //以读写的方式打开指定的文件
    fp=fopen("em","r+");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        //exit(0);
    }   
    else
    {
        //rewind(fp);

        /*下面的3句话动态的显示了
        文件中有多少条的员工信息,
        基本原理是首先通过把文件
        的内部指针指到文件的末尾
        再来算文件的总长度,然后
        用总的长度来除以每个结构
        体的长度lenth1*/

            fseek(fp,0L,SEEK_END);
            length=ftell(fp);
            length1=sizeof(struct employee);
            m=length/length1;

        //调试用的代码
        //printf("%d/n",m);
        //rewind(fp);   
       
        //通过for循环查找文件中的全部数据
        for (i=0;i<m;i++)
        {
            fseek(fp,i*sizeof(struct employee),0);
            fread(&em[i],sizeof(struct employee),1,fp);
               
            //这里不从0开始,是为后面的删除做准备
            if(em[i].num!=0)
            {
                //a=em[i].Ssbm
                //b=display_bm(a);   
                getZW(zw,em[i].Zw);   
                getBM(bm,em[i].Ssbm);
                switch(em[i].state)
                    {
                        case 1:
                            strcpy(sdt, "在职");
                        break;
                        case 2:
                            strcpy(sdt, "离职");
                        break;
                        default:
                            strcpy(sdt, "离职");
                        break;
                    }
               

           
                    printf("┌─┬───┬──┬───┬───┬────────┬────┬───┐/n");
                    printf("│  │姓名  │性别│出生日│进入日│ 电话号码       │  职位  │ 部门 │   /n");
                    printf("├─┼───┼──┼───┼───┼────────┼────┼───┤/n");
                    printf("│%-1d │%-5s │ %-2s │ %-5d│ %-5s│ %-15s│ %-3s   │%-3s  │/n",em[i].num,em[i].name,em[i].sex,em[i].Csrq,em[i].Jrsj,em[i].phone,zw,bm);
                    printf("├─┴───┴──┴───┼───┴────────┼────┼───┤/n");
                    printf("│      身份证号          │         邮箱        │  状态  │ 其他 │/n");
                    printf("├────────────┼────────────┼────┼───┤/n");
                    printf("│%-24s│%-24s│  %-6s│%-6s│/n",em[i].Sfzh,em[i].mail,sdt,em[i].Qita);
                    printf("└────────────┴────────────┴────┴───┘/n");
            }   
       
        }
            Fanhui();
    }



   
}


void part()
{

    FILE *fp;
    int key=0;
    int i;
    int m;
    int b;
    int a;
    int num2;
    char bm[5];
    char zw[5];
    char sdt[5];
    long length;
    long length1;


    printf("┌─────┐/n");
    printf("│用户编号:│/n");
    printf("└─────┘/n");

    scanf("%d",&num2);

    fp=fopen("em","r+");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        //exit(0);
    }   
    else
    {
        rewind(fp);
        fseek(fp,0L,SEEK_END);
        length=ftell(fp);
        length1=sizeof(struct employee);
        b=length/length1;
        //printf("*************%d******************/n",b);

        rewind(fp);   
        for (i=0;i<b;i++)
        {
            system("cls");
            fseek(fp,i*sizeof(struct employee),0);
            fread(&em[i],sizeof(struct employee),1,fp);

            /*这里通过引入变量m和a成功的判断了
            在文件中有没有员工的编号和要查找的
            编号相同,若相同则给m赋值,再把其
            对应的结构体数组的编号赋给a方便下
            面要进行显示数据的步骤*/

            if (num2==em[i].num)
            {
                m=1;
                a=i;
       
            }
        }

        //printf("******yyyyy*****/n");
        //m=0;
        //printf("%d****/n",m);
        //    printf("%d********/n",a);

        if (m==1)
        {
            fread(&em[a],sizeof(struct employee),1,fp);

            //注意这里给字符数组的赋值的方式
            getZW(zw,em[a].Zw);   
            getBM(bm,em[a].Ssbm);
           
            switch(em[a].state)
            {
                case 1:
                    strcpy(sdt, "在职");
                break;
                case 2:
                    strcpy(sdt, "离职");
                break;
                default:
                    strcpy(sdt, "离职");
                break;
            }
       
                printf("┌─┬───┬──┬───┬───┬────────┬────┬───┐/n");
                printf("│  │姓名  │性别│出生日│进入日│ 电话号码       │  职位  │ 部门 │   /n");
                printf("├─┼───┼──┼───┼───┼────────┼────┼───┤/n");
                printf("│%-1d │%-5s │ %-2s │ %-5d│ %-5s│ %-15s│ %-3s   │%-3s  │/n",em[a].num,em[a].name,em[a].sex,em[a].Csrq,em[a].Jrsj,em[a].phone,zw,bm);
                printf("├─┴───┴──┴───┼───┴────────┼────┼───┤/n");
                printf("│      身份证号          │         邮箱        │  状态  │ 其他 │/n");
                printf("├────────────┼────────────┼────┼───┤/n");
                printf("│%-24s│%-24s│  %-6s│%-6s│/n",em[a].Sfzh,em[a].mail,sdt,em[a].Qita);
                printf("└────────────┴────────────┴────┴───┘/n");
       
            Fanhui();

        }
        else
        {
            printf("┌─────┐/n");
            printf("│无此用户哦│/n");
            printf("└─────┘/n");

            Fanhui();
   
        }
    }
}


void change()
{
   
    FILE *fp;
   

    int key=0;
    int keys=0;
    int i;
    int m;
    int a;
    int b;
    int num2;
    char bm[5];
    char zw[5];
    char sdt[5];
    long length;
    long length1;
    printf("┌─────┐/n");
    printf("│用户编号:│/n");
    printf("└─────┘/n");

   
    scanf("%d",&num2);

    fp=fopen("em","r+");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        //exit(0);
    }   
    else
    {
        rewind(fp);
        fseek(fp,0L,SEEK_END);
        length=ftell(fp);
        length1=sizeof(struct employee);
        b=length/length1;
        //printf("%d********",b);

        for (i=0;i<b;i++)
        {
            system("cls");
            fseek(fp,i*sizeof(struct employee),0);
            fread(&em[i],sizeof(struct employee),1,fp);
            if (num2==em[i].num)
            {
                m=1;
                a=i;
            }
   
        }
        //printf("%d********/n",m);
        //printf("%d*****************/n",a);

        if (m==1)
        {
            fread(&em[a],sizeof(struct employee),1,fp);
            getZW(zw,em[a].Zw);   
            getBM(bm,em[a].Ssbm);

   
            fseek(fp,-sizeof(struct employee),1);//*****************

            switch(em[a].state)
            {
                case 1:
                    strcpy(sdt, "在职");
                break;
                case 2:
                    strcpy(sdt, "离职");
                break;
                default:
                    strcpy(sdt, "离职");
                break;
            }

                printf("┌─┬───┬──┬───┬───┬────────┬────┬───┐/n");
                printf("│  │姓名  │性别│出生日│进入日│ 电话号码       │  职位  │ 部门 │   /n");
                printf("├─┼───┼──┼───┼───┼────────┼────┼───┤/n");
                printf("│%-1d │%-5s │ %-2s │ %-5d│ %-5s│ %-15s│ %-3s   │%-3s  │/n",em[a].num,em[a].name,em[a].sex,em[a].Csrq,em[a].Jrsj,em[a].phone,zw,bm);
                printf("├─┴───┴──┴───┼───┴────────┼────┼───┤/n");
                printf("│      身份证号          │         邮箱        │  状态  │ 其他 │/n");
                printf("├────────────┼────────────┼────┼───┤/n");
                printf("│%-24s│%-24s│  %-6s│%-6s│/n",em[a].Sfzh,em[a].mail,sdt,em[a].Qita);
                printf("└────────────┴────────────┴────┴───┘/n");
               
                printf("┌─────────────┐/n");
                printf("│    修改用户信息          │/n");
                printf("└─────────────┘/n");
                printf("1修改编号/n");
                printf("2修改名称/n");
                printf("3修改性别/n");
                printf("4修改出生日期/n");
                printf("5修改进入日期/n");
                printf("6修改职位/n");
                printf("7修改部门/n");
                printf("8修改状态/n");
                printf("9修改邮箱/n");
                printf("10修改其他/n");

                scanf("%d",&key);
                    switch (key)
                    {
                        case 1:
                            printf("请你输入新的编号:/n");
                            scanf("%d",&em[a].num);
                        break;
                        case 2:
                            printf("请你输入新的名称:/n");
                            scanf("%s",&em[a].name);
                        break;
                        case 3:
                            printf("请你输入新的性别:/n");
                            scanf("%s",&em[a].sex);
                        break;
                        case 4:
                            printf("请你输入新的出生日期:/n");
                            scanf("%s",&em[a].Csrq);
                        break;
                        case 5:
                            printf("请你输入新的进入日期:/n");
                            scanf("%s",&em[a].Jrsj);
                        break;
                        case 6:
                            printf("请你输入新的职位:/n");
                            showZW();
                            printf("/n");
                            scanf("%s",&em[a].Zw);
                        break;
                        case 7:
                            printf("请你输入新的部门:/n");
                            showBM();
                            printf("/n");
                            scanf("%s",&em[a].Ssbm);
                        break;
                        case 8:
                            printf("请你输入新的状态:/n");
                            scanf("%s",&em[a].state);
                        break;
                        case 9:
                            printf("请你输入新的邮箱:/n");
                            scanf("%s",&em[a].mail);
                        break;
                        case 10:
                            printf("请你输入新的其他:/n");
                            scanf("%s",&em[a].Qita);
                        break;
                        case 0:
                            search();
                        break;
                    }
       
           
                //fwrite(&em[a],sizeof(struct employee),1,fp);
                fclose(fp);
                    save(b);
                Fanhui();
        }
        else
        {
            printf("┌─────┐/n");
            printf("│无此用户哦│/n");
            printf("└─────┘/n");
            Fanhui();
        }

    }
}

void add()
{
 
    FILE *fp;
    int i;
    int b;
    int num;
    int key;
    long length;
    long length1;
    fp=fopen("em","a+");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        exit(0);
    }   
    else
    {
       
        rewind(fp);
        fseek(fp,0L,SEEK_END);
        length=ftell(fp);
        length1=sizeof(struct employee);
        b=length/length1;
        i=b+1;

            printf("第%d个员工/n",i);
            printf("/n");
            printf("编号/n");
            scanf("%d",&em[i].num);
            printf("/n");
            printf("姓名/n");
            scanf("%s",&em[i].name);
            printf("/n");
            printf("请你输入性别以m为男f为女:/n");
            scanf("%s",&em[i].sex);
            printf("/n");
            printf("出生日期/n");
            scanf("%d",&em[i].Csrq);
            printf("/n");
            printf("进入时间/n");
            scanf("%s",&em[i].Jrsj);
            printf("/n");
            printf("身份证号/n");
            scanf("%s",&em[i].Sfzh);
            printf("/n");
            printf("部门(");
            showBM();
            printf(")/n");
            scanf("%d",&em[i].Ssbm);
            printf("/n");
            printf("职位(");
            showZW();
            printf(")/n");
            printf("/n");
            scanf("%d",&em[i].Zw);
            printf("状态(1为在职,2为离职)/n");
            scanf("%d",&em[i].state);
            printf("/n");
            printf("电话号码/n");
            scanf("%s",&em[i].phone);
            printf("/n");
            printf("电子邮件/n");
            scanf("%s",&em[i].mail);
            printf("/n");
            printf("其他/n");
            scanf("%s",&em[i].Qita);
            printf("/n");
            fwrite(&em[i],sizeof(struct employee),1,fp);
            Fanhui();
            //fprintf(fp,"/n");
           
            //fprintf(fp,"%d %s %s %s %s %d %d %d %d %d %d %d",em[i].num,em[i].name,em[i].sex,em[i].Csrq,em[i].Jrsj,em[i].Sfzh,em[i].Zw,em[i].state,em[i].phone,em[i].mail,em[i].Qita);
          
            system("pause");
       
    }

}
void del()
{
    FILE *fp;
    int key=0;
    int keys=0;
    int c;
    int i;
    int m;
    int a;
    int b;
    int num2;
    char bm[5];
    char zw[5];
    char sdt[5];
    long length;
    long length1;

    printf("┌─────┐/n");
    printf("│用户编号:│/n");
    printf("└─────┘/n");

   
    scanf("%d",&num2);

    fp=fopen("em","r+");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        //exit(0);
    }   
    else
    {
        rewind(fp);
        fseek(fp,0L,SEEK_END);
        length=ftell(fp);
        length1=sizeof(struct employee);
        b=length/length1;
        //printf("%d**********",b);
           
        for (i=0;i<b;i++)
        {
            system("cls");
            fseek(fp,i*sizeof(struct employee),0);
            fread(&em[i],sizeof(struct employee),1,fp);
            if (num2==em[i].num)
            {
                m=1;
                a=i;
            }
   
        }
        //printf("%d**********",m);

        if (m==1)
        {
            fread(&em[a],sizeof(struct employee),1,fp);
            getZW(zw,em[a].Zw);   
            getBM(bm,em[a].Ssbm);

   
            fseek(fp,-sizeof(struct employee),1);//*****************

            switch(em[a].state)
            {
                case 1:
                    strcpy(sdt, "在职");
                break;
                case 2:
                    strcpy(sdt, "离职");
                break;
                default:
                    strcpy(sdt, "离职");
                break;
            }
       
                printf("┌─┬───┬──┬───┬───┬────────┬────┬───┐/n");
                printf("│  │姓名  │性别│出生日│进入日│ 电话号码       │  职位  │ 部门 │   /n");
                printf("├─┼───┼──┼───┼───┼────────┼────┼───┤/n");
                printf("│%-1d │%-5s │ %-2s │ %-5d│ %-5s│ %-15s│ %-3s   │%-3s  │/n",em[a].num,em[a].name,em[a].sex,em[a].Csrq,em[a].Jrsj,em[a].phone,zw,bm);
                printf("├─┴───┴──┴───┼───┴────────┼────┼───┤/n");
                printf("│      身份证号          │         邮箱        │  状态  │ 其他 │/n");
                printf("├────────────┼────────────┼────┼───┤/n");
                printf("│%-24s│%-24s│  %-6s│%-6s│/n",em[a].Sfzh,em[a].mail,sdt,em[a].Qita);
                printf("└────────────┴────────────┴────┴───┘/n");
       
                printf("┌───────────────┐/n");
                printf("│    确认删除用户信息?        │/n");
                printf("└───────────────┘/n");
                printf("确认请按1,退出请按2.");
                scanf("%d",&c);
                if (c==1)
                {
           
                em[a].num=0;
                fclose(fp);
                    save(b);
                    Fanhui();
                }
                else
                {
                    search();
                }
        }
        else
        {
            printf("┌─────┐/n");
            printf("│无此用户哦│/n");
            printf("└─────┘/n");
 
            Fanhui();
        }
    }
}

void save(int b)
{
    int i;
    FILE *fp;
    fp=fopen("em","r+");
    for (i=0;i<b;i++)
    {
        fwrite(&em[i],sizeof(struct employee),1,fp);
    }


}


void showend(void)
{
    char key;

    printf("/n/n/t/t谢谢使用!/n");
    printf("/n/t/t确定要退出?(y/n)");

//flushall(); 

    scanf("%c",&key);
    switch (key)
    {
    case 'y':
        exit (0);
    break;
    case 'n':    
        search();
    break;
    }
}




void Fanhui()
{
    int key;
    printf("┌─────────────┐/n");
    printf("│返回上一级请按1,退出请按2!│/n");
    printf("└─────────────┘/n");

    scanf("%d",&key);
    switch (key)
    {
        case 1:
            search();
        break;
        case 2:
            showend();
            exit (0);
            system("pause");
        break;
    }
}
void getZW(char *str,int a)//根据id获取职务名称
{
    FILE *fp;
    ZwInfo zw;
    if ((fp=fopen("zwinfo.txt","r"))==NULL)
    {
        printf("Can not open the file!");
        exit(0);
    }
    else
    {
        while (fread(&zw,sizeof(ZwInfo),1,fp)==1)
        {
            if (zw.zwId==a)
            {
                strcpy(str,zw.zwName);
                return;
            }
        }
        strcpy(str,"未分配");
        return;
    }
}

void getBM(char *str,int a)//根据id获取部门名称
{
    FILE *fp;
    BmInfo bm;
    if ((fp=fopen("bminfo.txt","r"))==NULL)
    {
        printf("Can not open the file!");
        exit(0);
    }
    else
    {
        while (fread(&bm,sizeof(BmInfo),1,fp)==1)
        {
            if (bm.bmid==a)
            {
                strcpy(str,bm.bmname);
                fclose(fp);
                return;
            }
        }
        strcpy(str,"未分配");
        fclose(fp);
        return;
    }
}
void showZW()//显示职务名称
{
    FILE *fp;
    ZwInfo zw;
    if ((fp=fopen("zwinfo.txt","r"))==NULL)
    {
        printf("Can not open the file!");
        exit(0);
    }
    else
    {
        while (fread(&zw,sizeof(ZwInfo),1,fp)==1)
        {
            if (zw.zwId!=0)
            {
                printf("  %d-%s  ",zw.zwId,zw.zwName);
            }
        }
        fclose(fp);
    }
}

void showBM()//显示部门名称
{
    FILE *fp;
    BmInfo bm;
    if ((fp=fopen("bminfo.txt","r"))==NULL)
    {
        printf("Can not open the file!");
        exit(0);
    }
    else
    {
        while (fread(&bm,sizeof(BmInfo),1,fp)==1)
        {
            if (bm.bmid!=0)
            {
                printf("  %d-%s  ",bm.bmid,bm.bmname);
            }
        }
        fclose(fp);
        return;
    }
}
/*******************************************************************************************************************/


/********************************************李文婷设计部分**********************************************************/

void PrintZwTr(int a ,char *zwName,char *zwBZ)//显示职务列表行,职务管理
{
    printf("┃ %-7d┃%-24s┃%-38s┃/n",a,zwName,zwBZ);   
}
void ZwManage()//职务管理
{
    ZwInfo zw[20];
    ZwInfo zw1;
    /*ZwInfo zwTest;*/
    int count=0;
    FILE *fp;
    int i;
    system("cls");
        printf("/t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/n");
        printf("/t ★●             欢迎使用            ●★/n");
        printf("/t    ★●                             ●★/n");
        printf("/t        ★★★★★★★★   XWL    ★★★★★★★★★/n");
        printf("/n");

    printf("/t/t/t/t职务管理/n/n");
    if ((fp=fopen("zwinfo.txt","r"))==NULL)
    {
        printf("Can not open file!");
        exit(0);
    }
    else
    {
        printf("┏━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓/n");
        while (fread(&zw1,sizeof(ZwInfo),1,fp)==1)
        {
            if (zw1.zwId!=0)
            {
                zw[count].zwId=zw1.zwId;
                strcpy(zw[count].zwName,zw1.zwName);
                strcpy(zw[count].zwBZ,zw1.zwBZ);
                count++;
            }
        }
        for (i=0;i<count;i++)
        {
            PrintZwTr(zw[i].zwId,zw[i].zwName,zw[i].zwBZ);
            if (i==count-1)
            {
                continue;
            }
                printf("┣━━━━╋━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━┫/n");
                fseek(fp,-sizeof(ZwInfo),SEEK_CUR);
        }
        //    count++;
        //}
        printf("┗━━━━┻━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━┛/n");
    }

     printf("/t/t/t┌──────────┐/n");
     printf("/t/t/t│   1  → 添加职务   │/n");
     printf("/t/t/t│   2  → 修改职务   │/n");
    printf("/t/t/t│   3  → 删除职务   │/n");
     printf("/t/t/t│   4  → 返    回   │/n");
     printf("/t/t/t└──────────┘/n");
    while (1)
    {
        switch(_getch())
        {
        case '1':
            AddZW();
            return;
            break;
        case '2':
            ModifyZW();
            return;
            break;
        case '3':
            DelZW();
            return;
            break;
        case '4':
            mainpage(3);
            return;
            break;
        }
    }
}
void AddZW()//添加职务
{
     ZwInfo zw;
     ZwInfo zwRead;
     int cout=0;
     FILE *fp;
    printf("添加职务/n/n");
     printf("输入职务名称:");
     //gets(zw.zwName);
    //scanf("%s",zw.zwName);
    StringLength(zw.zwName,20,200,0);
     printf("输入职务说明:");
     //gets(zw.zwBZ);
    //scanf("%s",zw.zwBZ);
    StringLength(zw.zwBZ,35,200,0);
     if ((fp=fopen("zwinfo.txt","r+"))==NULL)
    {
         printf("Can not open file!");
         exit(0);
     }
     else
     {
        while (!feof(fp))
         {
             fread(&zwRead,sizeof(ZwInfo),1,fp);
             cout++;
        }
         zw.zwId=cout;
         fwrite(&zw,sizeof(ZwInfo),1,fp);
         printf("添加成功!");
        fclose(fp);
        ZwManage();
        return;
     }
}
void ModifyZW()//修改职务,输入职务编号进行修改
{
    int a;
    ZwInfo zw;
     FILE *fp;
    fpos_t oldpos;
    printf("修改职务/n/n");
    printf("请输入职务编号:");
    scanf("%d",&a);
    if ((fp=fopen("zwinfo.txt","r+"))==NULL)
    {
         printf("Can not open file!");
         exit(0);
     }
     else
     {
        while (fread(&zw,sizeof(ZwInfo),1,fp)==1)
         {
            fgetpos(fp,&oldpos);
            if (zw.zwId==a)
            {
                if (a==0)
                {
                    break;
                }
                printf("输入职务名称(原:%s):",zw.zwName);
                StringLength(zw.zwName,20,200,0);
                printf("输入职务备注(原:%s):",zw.zwBZ);
                //gets(zw.zwBZ);
                //scanf("%s",zw.zwBZ);
                StringLength(zw.zwBZ,35,200,0);
                fsetpos(fp,&oldpos);
                fseek(fp,-sizeof(ZwInfo),SEEK_CUR);
                fwrite(&zw,sizeof(ZwInfo),1,fp);
                fclose(fp);
                printf("修改成功/n任意键返回/n");
                _getch();
                ZwManage();
                return;
            }
            //fwrite(&zw,sizeof(ZwInfo),1,fp);
        }
        fclose(fp);
        printf("未找到!/n任意键返回/n");
         //fwrite(&zw,sizeof(ZwInfo),1,fp);
        _getch();
        ZwManage();
        return;
     }
}
void DelZW()//删除职务信息,假删除,将职务编号置为零;
{
    int a;
    ZwInfo zw;
     FILE *fp;
    fpos_t oldpos;
    char key;
    printf("删除职务/n/n");
    printf("请输入职务编号:");
    scanf("%d",&a);
    if ((fp=fopen("zwinfo.txt","r+"))==NULL)
    {
         printf("Can not open file!");
         exit(0);
     }
     else
     {
        while (fread(&zw,sizeof(ZwInfo),1,fp)==1)
         {
            fgetpos(fp,&oldpos);
            if (zw.zwId==a)
            {
                if (a==0)
                {
                    break;
                }
                printf("职务名称:%s/n",zw.zwName);
                printf("职务备注:%s/n",zw.zwBZ);
                printf("确认删除?<Y/N>/n");
                while (1)
                {
                    scanf("%c",&key);
                    switch(key)
                    {
                    case 'y':
                    case 'Y':
                        break;
                    case 'n':
                    case 'N':
                        return;
                        break;
                    }
                    if (key=='y'||key=='Y')
                    {
                        break;
                    }
                }
                zw.zwId=0;
                fsetpos(fp,&oldpos);
                fseek(fp,-sizeof(ZwInfo),SEEK_CUR);
                fwrite(&zw,sizeof(ZwInfo),1,fp);
                fclose(fp);
                printf("修改成功/n任意键返回/n");
                _getch();
                ZwManage();
                return;
            }
            //fwrite(&zw,sizeof(ZwInfo),1,fp);
        }
        fclose(fp);
        printf("未找到!/n任意键返回/n");
        _getch();
        ZwManage();
        return;
     }
}
/*******************************************************************************************************************/



/********************************************梁芝芝设计部分*******************************************************/

void PrintBmTr(int a ,char *bmname,char *bmphone,char *bmCZphone,char *bmaddress,char *bmQTSM)//显示部门列表行,部门管理
{
    printf("┃%-4d┃%-10s┃%-12s┃%-12s┃%-12s┃%-14s┃/n",a,bmname,bmphone,bmCZphone,bmaddress,bmQTSM);   
}

void BmManage(int a)//部门管理
{
    struct bminfo bmTest;
    struct bminfo *h=NULL;
    struct bminfo *p=NULL;
    struct bminfo *s=NULL;
    struct bminfo *c=NULL;
    int count=0;
    int num,i;
    char pointto[4];
    FILE *fp;
    system("cls");//清屏
    printf("/t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/n");
        printf("/t ★●             欢迎使用            ●★/n");
        printf("/t    ★●                             ●★/n");
        printf("/t        ★★★★★★★★   XWL    ★★★★★★★★★/n");
        printf("/n");
    if ((fp=fopen("bminfo.txt","r"))==NULL)
    {
        printf("Can not open file!");
        exit(0);
    }
    else
    {
        h=(struct bminfo *)malloc(sizeof(struct bminfo));//分配内存空间并返回第一个字节地址赋给h
        p=h;//把h中所存的地址赋值给p
        printf("┏━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━┓/n");
        while (fread(&bmTest,sizeof(BmInfo),1,fp)==1)//遍历每一条数据
        {
            if (bmTest.bmid!=0)
            {
                s=(BmInfo *)malloc(sizeof(BmInfo));//分配内存空间并返回第一个字节地址赋给s
                s->bmid=bmTest.bmid;
                strcpy(s->bmname,bmTest.bmname);
                strcpy(s->bmphone,bmTest.bmphone);
                strcpy(s->bmCZphone,bmTest.bmCZphone);
                strcpy(s->bmaddress,bmTest.bmaddress);
                strcpy(s->bmQTSM,bmTest.bmQTSM);
                p->next=s;//将p所存的结构体数组指针中的的节点指向s
                p=s;//将s指向的地址赋给p
                count++;
            }
        }
        p->next=NULL;
        while (h->next!=NULL)
        {
            h=h->next;
            PrintBmTr(h->bmid,h->bmname,h->bmphone,h->bmCZphone,h->bmaddress,h->bmQTSM);
            if(count==1)
            {
                continue;
            }
            count--;
            printf("┣━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━━┫/n");
        }
        c=h;
        while (c!=NULL)
        {
            h=c->next;
            free(c);
            c=h;
        }
        printf("┗━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━━┛/n");
    }
    for(i=0;i<4;i++)
    {
        pointto[i]='/0';
    }
    pointto[a-1]='<';
       
    printf("/t/t/t ┏─────────┓        /n");
    printf("/t/t/t │     部门管理     │        /n");
    printf("/t/t/t┏──┴─────────┴──┓  /n");
    printf("/t/t/t    1→添加部门         %c   /n",pointto[0]);
    printf("/t/t/t      2→修改部门       %c   /n",pointto[1]);
    printf("/t/t/t    3→删除部门 %c   /n",pointto[2]);
    printf("/t/t/t    4→返    回 %c   /n",pointto[3]);
    printf("/t/t/t┗───────────────┛  /n");
    num=getch()-48;
    if(num==-35)
    {
        switch(a)
        {
        case 1:
            AddBM();
            return;
            break;
        case 2:
            ModifyBM();
            return;
            break;
        case 3:
            DelBM();
            return;
            break;
        case 4:
            mainpage(1);
            return;
            break;
        }
    }
    else
    {
        BmManage(num);
    }
}

void AddBM()//添加部门
{
     BmInfo BM;
     BmInfo BMRead;
    int cout=0;
     int i=0;
     FILE *fp;
    printf("添加部门/n/n");
     printf("请输入部门名称:/n");

    StringLength(BM.bmname,9,200,0);
    printf("请输入部门联系电话:/n");
    StringLength(BM.bmphone,11,200,0);
    printf("请输入部门传真电话:/n");
    //scanf("%s",BM.bmCZphone);
    StringLength(BM.bmCZphone,11,200,0);
    printf("请输入部门地址:/n");
    //scanf("%s",BM.bmaddress);
    StringLength(BM.bmaddress,11,200,0);
    printf("其他说明:/n");
    //scanf("%s",BM.bmQTSM);
    StringLength(BM.bmQTSM,13,200,0);
    /*fprintf(fp,"%d %s %s %s %s %s",BM[i].id,BM[i].name,BM[i].phone,BM[i].CZphone,BM[i].address,BM[i].QTSM);*/
    if ((fp=fopen("bminfo.txt","r+"))==NULL)
    {
         printf("Can not open file!");
         exit(0);
     }
     else
     {
        while (!feof(fp))
         {
             fread(&BMRead,sizeof(BmInfo),1,fp);
             cout++;
        }
         BM.bmid=cout;
         fwrite(&BM,sizeof(BmInfo),1,fp);
         printf("添加成功!/n任意键返回/n");
        fclose(fp);
        _getch();
        BmManage(1);
        return;
     }
 }

void ModifyBM()//修改部门,输入部门编号进行修改
{
    int a;
    BmInfo BM;
     FILE *fp;
    fpos_t oldpos;//定义文件位置指针
    printf("修改部门/n/n");
    printf("请输入部门编号:");
    scanf("%d",&a);
    if ((fp=fopen("bminfo.txt","r+"))==NULL)
    {
         printf("Can not open file!");
         exit(0);
     }
     else
     {
        while (fread(&BM,sizeof(BmInfo),1,fp)==1)
         {
            fgetpos(fp,&oldpos);
            if (BM.bmid==a)
            {
                if (a==0)
                {
                    break;
                }
                printf("输入部门名称(原:%s):",BM.bmname);
                //scanf("%s",BM.bmname);
                StringLength(BM.bmname,9,200,0);
                printf("输入部门电话(原:%s):",BM.bmphone);
                //scanf("%s",BM.bmphone);
                StringLength(BM.bmphone,11,200,0);
                printf("请输入部门传真电话(原:%s):",BM.bmCZphone);
                //scanf("%s",BM.bmCZphone);
                StringLength(BM.bmCZphone,11,200,0);
                printf("请输入部门地址(原:%s):",BM.bmaddress);
                //scanf("%s",BM.bmaddress);
                StringLength(BM.bmaddress,11,200,0);
                printf("其他说明(原:%s):",BM.bmQTSM);
                //scanf("%s",BM.bmQTSM);
                StringLength(BM.bmQTSM,13,200,0);
                fsetpos(fp,&oldpos);
                fseek(fp,-sizeof(BmInfo),1);
                fwrite(&BM,sizeof(BmInfo),1,fp);
                fclose(fp);
                printf("修改成功/n任意键返回/n");
                _getch();
                BmManage(1);
                return;
            }
        }
        printf("未找到!");
        fclose(fp);
        return;
     }
}
void DelBM()//删除部门信息,假删除,将部门编号置为零
{
    int a;
    BmInfo bm;
     FILE *fp;
    fpos_t oldpos;
    char key;
    printf("删除部门/n/n");
    printf("请输入部门编号:");
    scanf("%d",&a);
    if ((fp=fopen("bminfo.txt","r+"))==NULL)
    {
         printf("Can not open file!");
         exit(0);
     }
     else
     {
        while (fread(&bm,sizeof(BmInfo),1,fp)==1)
         {
            fgetpos(fp,&oldpos);
            if (bm.bmid==a)
            {
                if (a==0)
                {
                    break;
                }
                printf("部门名称:%s/n",bm.bmname);
                printf("部门地址:%s/n",bm.bmaddress);
                printf("确认删除?<Y/N>/n");
                while (1)
                {
                    scanf("%c",&key);
                    switch(key)
                    {
                    case 'y':
                    case 'Y':
                        break;
                    case 'n':
                    case 'N':
                        return;
                        break;
                    }
                    if (key=='y'||key=='Y')
                    {
                        break;
                    }
                }
                bm.bmid=0;
                fsetpos(fp,&oldpos);
                fseek(fp,-sizeof(BmInfo),SEEK_CUR);
                fwrite(&bm,sizeof(BmInfo),1,fp);
                fclose(fp);
                printf("修改成功/n任意键返回/n");
                _getch();
                BmManage(1);
                return;
            }
        }
        fclose(fp);
        printf("未找到!/n任意键返回/n");
        _getch();
        BmManage(1);
        return;
     }
}
/*******************************************************************************************************************/


/********************************************王强设计部分**********************************************************/
void tjinfo(int a)//显示员工统计信息选择菜单
{
    int b;
    int i,num;
    char pointto[3];
        system("cls");
   
    for(i=0;i<3;i++)
    {
        pointto[i]='/0';
    }
    pointto[a-1]='<';
    printf("/t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★/n");
    printf("/t ★●             欢迎使用            ●★/n");
    printf("/t    ★●                             ●★/n");
    printf("/t        ★★★★★★★★   XWL    ★★★★★★★★★/n");
    printf("/n");
    printf("/t/t    ┏─────────┓         /n");
    printf("/t/t    │  员工信息统计    │         /n");
    printf("/t/t┏───┴─────────┴───┓ /n/n/n");
    printf("/t/t 1,在职人员明细统计      %c   /n/n",pointto[0]);
    printf("/t/t    2,离职人员信息统计      %c   /n/n",pointto[1]);
    printf("/t/t 3,返回    %c   /n/n/n",pointto[2]);
    printf("/t/t┗─────────────────┛ /n");
    num=getch()-48;
    if(num==-35)
    {
        switch(a)
        {
        case 1:
            Tjzjinfo(1);
            return;
            break;
        case 2:
            Tjljinfo(2);
            break;
        case 3:
            mainpage(4);
        }
    }
    else
    {
         tjinfo(num);
    }
}

void Tjzjinfo()//统计在职人数信息
{
    FILE *fp;
    int key;
    int i;
    int m;
    int cot=0;
    char bm[5];
    char zw[5];
    char sdt[5];
    long length;
    long length1;
    system("cls");

    //以读写的方式打开指定的文件
    fp=fopen("em","r+");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        //exit(0);
    }   
    else
    {
        //rewind(fp);
            fseek(fp,0L,SEEK_END);
            length=ftell(fp);
            length1=sizeof(struct employee);
            m=length/length1;

        //调试用的代码
        //printf("%d/n",m);
        //rewind(fp);   
       
        //通过for循环查找文件中的全部数据
        for (i=0;i<m;i++)
        {
            fseek(fp,i*sizeof(struct employee),0);
            fread(&em[i],sizeof(struct employee),1,fp);
               
            //这里不从0开始,是为后面的删除做准备
            if(em[i].num!=0&&em[i].state==1)
            {
                cot++;
                getZW(zw,em[i].Zw);   
                getBM(bm,em[i].Ssbm);

                switch(em[i].state)
                    {
                        case 1:
                            strcpy(sdt, "在职");
                        break;
                        case 2:
                            strcpy(sdt, "离职");
                        break;
                        default:
                            strcpy(sdt, "离职");
                        break;
                    }
               

           
                    printf("┌─┬───┬──┬───┬───┬────────┬────┬───┐/n");
                    printf("│  │姓名  │性别│出生日│进入日│ 电话号码       │  职位  │ 部门 │   /n");
                    printf("├─┼───┼──┼───┼───┼────────┼────┼───┤/n");
                    printf("│%-1d │%-5s │ %-2s │ %-5d│ %-5s│ %-15s│ %-3s   │%-3s  │/n",em[i].num,em[i].name,em[i].sex,em[i].Csrq,em[i].Jrsj,em[i].phone,zw,bm);
                    printf("├─┴───┴──┴───┼───┴────────┼────┼───┤/n");
                    printf("│      身份证号          │         邮箱        │  状态  │ 其他 │/n");
                    printf("├────────────┼────────────┼────┼───┤/n");
                    printf("│%-24s│%-24s│  %-6s│%-6s│/n",em[i].Sfzh,em[i].mail,sdt,em[i].Qita);
                    printf("└────────────┴────────────┴────┴───┘/n");

            }   
           
                   
        }
    printf("──────────/n");
    printf("在职人数一共有:%d个/n",cot);
    printf("──────────/n");
    printf("/t/t/t/t/t/t/t┏────┓/n");
    printf("/t/t/t/t/t/t/t按任意键返回/n");
    printf("/t/t/t/t/t/t/t┗────┛/n");
    getch();
    tjinfo(1);
    }



   
}
void Tjljinfo()//统计离职员工信息
{
   
   
    FILE *fp;
    int cot=0;
    int key;
    int i;
    int m;
    char bm[5];
    char zw[5];
    char sdt[5];
    long length;
    long length1;
    system("cls");

    //以读写的方式打开指定的文件
    fp=fopen("em","r+");
   
    if(fp==NULL)
    {   
        printf("open error!!/n");
        //exit(0);
    }   
    else
    {
        //rewind(fp);
            fseek(fp,0L,SEEK_END);
            length=ftell(fp);
            length1=sizeof(struct employee);
            m=length/length1;
        //通过for循环查找文件中的全部数据
        for (i=0;i<m;i++)
        {
            fseek(fp,i*sizeof(struct employee),0);
            fread(&em[i],sizeof(struct employee),1,fp);
               
       
            if(em[i].num!=0&&em[i].state!=1)
            {
                cot++;
                getZW(zw,em[i].Zw);   
                getBM(bm,em[i].Ssbm);

                switch(em[i].state)
                    {
                        case 1:
                            strcpy(sdt, "在职");
                        break;
                        case 2:
                            strcpy(sdt, "离职");
                        break;
                        default:
                            strcpy(sdt, "离职");
                        break;
                    }
               

           
                    printf("┌─┬───┬──┬───┬───┬────────┬────┬───┐/n");
                    printf("│  │姓名  │性别│出生日│进入日│ 电话号码       │  职位  │ 部门 │   /n");
                    printf("├─┼───┼──┼───┼───┼────────┼────┼───┤/n");
                    printf("│%-1d │%-5s │ %-2s │ %-5d│ %-5s│ %-15s│ %-3s   │%-3s  │/n",em[i].num,em[i].name,em[i].sex,em[i].Csrq,em[i].Jrsj,em[i].phone,zw,bm);
                    printf("├─┴───┴──┴───┼───┴────────┼────┼───┤/n");
                    printf("│      身份证号          │         邮箱        │  状态  │ 其他 │/n");
                    printf("├────────────┼────────────┼────┼───┤/n");
                    printf("│%-24s│%-24s│  %-6s│%-6s│/n",em[i].Sfzh,em[i].mail,sdt,em[i].Qita);
                    printf("└────────────┴────────────┴────┴───┘/n");
               
            }   
       
        }
    printf("──────────/n");
    printf("离职人数一共有:%d个/n",cot);
    printf("──────────/n");
    printf("/t/t/t/t/t/t/t┏────┓/n");
    printf("/t/t/t/t/t/t/t按任意键返回/n");
    printf("/t/t/t/t/t/t/t┗────┛/n");
    getch();
    tjinfo(2);
    }

}
/*******************************************************************************************************************/





/*本系统相关详情

系统名称:企业员工管理系统
设计时间:2010年8月18日——2010年8月23日
设计地点:四川师范大学第一实验楼西403
设计团队:XWL【肖雄(组长),魏凡(主要编码人员),王强(编码人员),李文婷(测试和文档编写人员),梁芝芝(测试人员)】
美观设计:王强,梁芝芝,肖雄
合并人:肖雄
备注:团队人员全部参加编码阶段,只是每人侧重不同

*/



版权声明:本文为xiaoxionglishuang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。