员工信息管理系统

一. 目的

C语言的课设选择了员工管理系统,处理的对象为员工的信息,分为3个端(管理员,普通员工,部门经理)登录。进入主函数首先读取文件内容,其次用户选择登录身份,验证登录密码,其次选择每个登录身份的各项功能。存在文件及文件之间的交互,*输入密码等。

二. 功能模块图

三.各功能简单描述

1.管理员模块:

密码验证成功后,进入管理员菜单选项,管理员可以进行:

1)采集信息(添加员工信息,添加部门经理信息):添加信息后选择是否保存,若保存将员工(部门经理)信息保存到存放员工(部门经理)信息的文件(staff.txt/manager.txt),其中添加员工信息时每种输入都有限制,如名字只能输入中文、工号只能输入小于等于8位的数字、电话只能输入11位的数字等,输入工号、电话的时候会有查重提示,输入部门和职位时只能输入公司机构文件存在的本公司现有的部门和职位,在公司机构文件里面查找,保证员工基本资金与职位对应。

2)管理员工信息(查找、修改、删除、排序):其中修改、删除后需要选择是否将改动信息保存到文件。

3)浏览员工信息,按照报表的格式输入公司所有员工的信息。

4)管理登录密码(管理员密码、员工密码、经理密码):若是管理管理员密码,因为管理员只有一个,所以直接将存放管理员密码文件的数据修改,若是管理员工和经理密码找到对应员工或经理修改其密码

5)管理公司机构:管理员为公司添加新的部门、职位、和职位对应的工资,添加时存在查重。

6)查看公司现有机构:输出该公司现存在部门、职位。

2.普通员工模块:

密码验证成功后,进入菜单选项,管理员可以进行:

1)查询员工信息:该公司是公开,所以员工可以查询公司每个员工的信息。

2)修改自己的信息:员工只能修改自己的基础信息(姓名,工号,电话),不能修改请假、迟到、加班信息。

3)查看加班信息:可以查看自己的部门经理给其分配的加班天数

4)发送请假请求:向经理发送请假请求,将发送请求的员工保存到另外一个文件,等待经理审核。

3.部门经理模块:

1)采集员工信息:经理有权利添加员工。

2)浏览所有员工信息:经理可以查看该公司所有员工的信息

3)查看本部门员工信息:将经理所在部门的员工信息以报表的形式输出

4)通知本部门员工加班信息:经理只能通知自己部门的员工加班,无权给其他部门员工给予加班信息,通知加班信息时加班时间不能(压榨员工)太长。

5)审核请假信息:经理读取需要请假的员工文件,进行审核,若批准将员工信息的请假次数修改,若不批准则不改动。

四.程序部分运行

大一结束了,C语言也学完了,为了课设第一次写这么长的代码,下面是我的课设代码,在vc++6.0运行的,如果要复制查看的换运行程序后会出现多个.txt ( 其中manage.txt存放管理员密码,刚开始要手动打开.txt给里面添加密码,不然无法进行之后的程序 ), 刚开始程序有有点low....之后改了好多,输入也加了好多限制,不过应该有没发现的bug,希望大佬们别吐槽。

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <malloc.h>
//员工:姓名 工号 电话 部门 职位 密码 工资(实际工资,基本工资,扣款(迟到/请假) ,奖金(加班天数))
struct wage
{  int real;//实际工资int base;//基本工资int cut;//扣款( 迟到-10,请假-5 )int bonus;//奖金( 加班60 )
};
typedef struct staff
{char name[20];char number[20];char phone[20];char depart[20];//部门  char post[20];//职位char password[20];int late;//迟到次数int leave;//请假次数int over;//加班天数struct wage z;struct staff *next;
}sta;
sta *head,*u,*p,*q,*wj,*t;//头指针
//部门经理:  姓名 工号 所管部门 密码
typedef struct manager
{char mname[20];char mnumber[20];char mdepart[20];//所管部门char mpassword[20];struct manager *next;
}mana;
mana *mhead,*mu,*mp,*mq,*mwj,*mt;
//*************************************************************************************************************
typedef struct begin//管理员输入的初始部门
{char bdepart[20];char bpost[20];int bbase;struct begin *next;
}beg;
beg *bhead,*bu,*bp,*bq,*bwj,*bt;
typedef struct gobye
{char gnumber[20];int gleave;//请假次数struct gobye *next;
}gob;
//员工个数
int n;
char nei;
//员工登录工号 员工查找自己信息
char sdl[100];
char ddepart[100];//登录经理所管的部门
char look[100];//查找重复的时候使用
//*********************************************函数声明*****************************************
sta* new_node(sta* uu);
mana* mnew_node(mana* uu);
void add();void s_add();void m_add();
void modify();  void modi_all();void modi_num();void modi_name();  void modi_phone();
void del(); void del_name(); void del_num(); void del_phone();
void sort();void sort_name();void sort_num();void sort_real();void sort_late();void sort_leave();void sort_over();
void find();void find_sta();void find_depart();void find_name();void find_num();void find_phone();void find_namenum();
void lookover();void callover();void overday();int overname();//关于加班
void askleave();void giveleave();//关于请假
void display();void adminxx();
void save();void read();void msave();void mread();gob* learead();void leasave();
void exi();void admin();void staff();void manager();void mjinru();
void mmgl();void stam();void manam();void adminm();
void welcome();void gotoxy(int x, int y);//光标移动
void begin();void begread();void begsave();void beg_show();void beg_add();//公司机构
//**********************************************************************************************
//构造员工结点函数   没有头结点
sta* new_node(sta* uu)
{  uu = (sta*)malloc(sizeof(sta));  uu->next = NULL;  return uu;
}
//构造部门经理结点函数   没有头结点mana* mnew_node(mana* uu)
{  uu = (mana*)malloc(sizeof(mana));  uu->next = NULL;  return uu;
}
//构造公司机构结点函数   没有头结点
beg* bnew_node(beg* uu)
{  uu = (beg*)malloc(sizeof(beg));  uu->next = NULL;  return uu;
}
//构造请假结点函数   没有头结点
gob* gnew_node(gob* uu)
{  uu = (gob*)malloc(sizeof(gob));  uu->next = NULL;  return uu;
}void askleave()
{char c[20];FILE *fp;for(u = head; u != NULL;u = u->next) {  if(strcmp(u->number,sdl) == 0)  {  printf("\t\t\t☆ 你可以向你所在部门的经理申请一次请假\n");printf("\t\t\t☆ 友情提示: 请假太多一定不会被批准的\n");printf("\t\t\t☆ 你在这个月已经请了%d次假(被批准的)\n",u->leave);printf("\t\t\t☆ 你是否还要请假(y/n):"); while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t☆请输入合法字符!\n");printf("\t\t\t☆请重新输入: ");fflush(stdin); //清除缓冲区 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t☆你这次选择了不请假,此次操作不会告诉上级 ^.^\n");return ;}if((strcmp(c,"y")==0)){printf("\t\t\t☆你这次选择了请假,此次操作将反馈给上级,请等待批准\n");//fp=fopen("leave.txt","a+");          //进入程序时打开/建立该文件//fclose(fp); fp=fopen("leave.txt","a+");printf("\t\t\t☆你此次的请假信息将被记录\n");fprintf(fp,"%s ",u->number);  fprintf(fp,"%d\n",u->leave); fclose(fp);  }}  }
}
//读取请假文件
gob * learead()
{  FILE *fp;gob *ghead,*gu,*gr;ghead  = gr= (gob*)malloc(sizeof(gob));ghead ->next=NULL;//fp=fopen("leave.txt","a");          //进入程序时打开/建立该文件//fclose(fp);if((fp=fopen("leave.txt","r"))==NULL)  {  return NULL;  }nei=fgetc(fp);if(nei==EOF)//文件内没东西时{ return NULL;}  else{rewind(fp);}while(!feof(fp))  {   gu= (gob*)malloc(sizeof(gob));fscanf(fp,"%s ",gu->gnumber);  fscanf(fp,"%d\n",&gu->gleave);gr->next=gu;gu->next=NULL;gr=gu;}fclose(fp);return ghead;
}
void giveleave()
{ FILE *fp;char c[20];int m=0;gob *ghead,*gu;ghead=learead();//读入if(nei==EOF)//文件内没东西时{ printf("\n\n\t\t\t☆ 暂时还没有员工需要请假\n");return;}  for(gu = ghead->next; gu!= NULL;gu = gu->next)  {  m++;  printf("\t\t\t☆ 第%d个代批准员工的请假记录\n",m);printf("\t\t\t☆ 工号\t请假次数\n");printf("\t\t\t☆ %s\t%d\n",gu->gnumber,gu->gleave);printf("\t\t\t☆ 你是否批准?(y/n)");while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t☆请输入合法字符!\n");printf("\t\t\t☆请重新输入: ");fflush(stdin); //清除缓冲区 }if( (strcmp(c,"n")==0)|| (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t☆ 你狠心的拒绝了该员工此次的请假申请\n");continue;}if((strcmp(c,"y")==0)){printf("\t\t\t☆ 你通过了该员工的请假申请\n");//请假次数加1for(u = head; u != NULL;u = u->next) {  if(strcmp(u->number,gu->gnumber) == 0)  {  printf("\t\t\t☆ 你将给员工记录这请假\n");u->leave=gu->gleave+1;u->z.cut=u->late*10+u->leave*5;   //扣款:迟到-10 请假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;save();break;   }  } }}   fp=fopen("leave.txt","w");          //进入程序时打开直接关闭相当于清空文件fclose(fp);return;
}void lookover()//员工查看加班时间   员工登录工号全局变量char sdl[20];
{for(u = head; u != NULL;u = u->next) {  if(strcmp(u->number,sdl) == 0)  {  printf("\t\t\t☆ 你所在部门给你分配下来的本月加班%d天☆\n",u->over);printf("\t\t\t☆ 小提示: 若时间不充足,你也可以返回上一步申请请假,等待批准\n");break;   }  }
}
void overday()
{int j;printf("\t\t\t☆ 输入你准备给分配本月的加班天数:");//匹配时输入加班时间while(1){j=scanf("%d",&u->over);if(j!=1){printf("\t\t\t☆ 加班天数是数字哦 ^.^ 请重新输入:");fflush(stdin); //清除缓冲区 u->over=1; //防止跳出循环 }else{if(u->over>32){printf("\t\t\t☆ 哇,加班天数有点都多哦,经理也不能这么压榨劳苦人民吧\n");printf("\t\t\tSo...^.^ 请你重新输入:");}if(j==1 && u->over<32){u->z.bonus=u->over*60;      //奖金:加班60 u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}}}
}
int overname()//经理通知加班时间*********************************
{ int k,m,j,l;//控制char overname[20];k=m=l=0;printf("\t\t\t☆ 经理特权: 你可以让自己部门的员工进行加班哦\n ");printf("\t\t\t☆ 小提示: 你可以先退回上一步查看自己部门的员工哦\n");printf("\t\t\t☆ 输入你准备给分配加班员工的姓名:");while(1){scanf("%s",overname);for(j=0;(size_t)j<strlen(overname);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(overname[j]>=0 && overname[j]<=255){printf("\t\t\t☆ 不是中文 ^.^ 请重新输入:");break;}if(strlen(overname)>15){printf("\t\t\t☆ 姓名过长了 ^.^ 请重新输入:");break;}else k=1;}if(k==1){for(u = head->next; u != NULL;u = u->next)  {                                         if( strcmp(u->depart,ddepart)==0 && strcmp(u->name,overname)==0)//不是该部门的员工则跳过;{l=1;return 1; }}if(l==0){printf("\t\t\t☆ 哇,你不能让其他部门的员工加班 ");return 0;}if(u==NULL && l==0)  {  printf("\t\t\t☆ 哇,你的部门还木有员工,怎么让别人加班呢(T▽T)!\n");printf("\t\t\t☆ 小提示: 你可以退回上一步雇佣员工给你的部门增加人气哦");return 0;  }}}return 0;
}
void callover()
{if(overname()){overday();}elsereturn;
}
//打印该公司机构
void beg_show()
{  if(bhead->next == NULL)  {  printf("\t\t\t--->该公司的公司机构还没有录入!\n");  return;  }printf("☆友情提示:该公司现有部门和职位\n");puts("部门            职位            \n");  for(bu = bhead->next; bu!= NULL;bu = bu->next)  {    printf("%-15s %-15s ",bu->bdepart,bu->bpost);printf("\n");}
}
//添加公司机构********************************************************8888
void beg_add()
{ int j,m;//控制char c[20];bu = bnew_node(bu);  //新建一个节点printf("\t\t\t****************采集公司机构信息***************\n");while(1){printf("\t\t\t*部门:__\b\b");//查重*********************************************************scanf("%s",bu->bdepart);for(j=0;(size_t)j<strlen(bu->bdepart);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(bu->bdepart[j]>=0 && bu->bdepart[j]<=255){printf("\t\t\t不是中文呢 ^.^\t请重新输入\n");break;}if(strlen(bu->bdepart)>15){printf("\t\t\t部门输入过长 ^.^\t请重新输入\n");break;}}strcpy(look,bu->bdepart);//查重for(bt = bwj->next; bt != NULL;bt = bt->next)  {  if(strcmp(bt->bdepart,look) == 0)  {m=0;printf("\t\t\t该公司已经存在该部门了呦 ^.^\n ");printf("\t\t\t您是否要新建部门? (y/n)");while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t请输入合法字符!\n");printf("\t\t\t请重新输入: ");fflush(stdin); //清除缓冲区 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不新建部门 ^.^\n");m=1 ;break;}printf("\t\t\t新建部门请重新命名 ^.^\n");break;} if(strcmp(bt->bdepart,look) != 0)  { continue;}}if(bt==NULL)//新的工号时{m=1;}if(strlen(bu->bdepart)<=15 && (size_t)j==strlen(bu->bdepart)&&m==1){break;}}while(1){printf("\t\t\t*职位:__\b\b");//查重***********************************************************scanf("%s",bu->bpost);for(j=0;(size_t)j<strlen(bu->bpost);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(bu->bpost[j]>=0 && bu->bpost[j]<=255){printf("\t\t\t不是中文呢 ^.^ 请重新输入\n");break;}if(strlen(bu->bpost)>15){printf("\t\t\t职位输入过长 ^.^ 请重新输入\n");}}strcpy(look,bu->bpost);//查重for(bt = bwj->next; bt != NULL;bt = bt->next)  {  if(strcmp(bt->bpost,look) == 0)  {m=0;printf("\t\t\t该公司已经存在该职位了呦 ^.^ 新建职位请重新命名\n ");break;} if(strcmp(bt->bpost,look) != 0)  { continue;}}if(bt==NULL)//新的工号时{m=1;}if(strlen(bu->bpost)<=15 && (size_t)j==strlen(bu->bpost) && m==1){break;}}while(1){printf("\t\t\t*基本工资:");j=scanf("%d",&bu->bbase);if(j!=1){printf("\t\t\t工资是数字哦 ^.^\t请重新输入\n");fflush(stdin); //清除缓冲区 bu->bbase=1; //防止跳出循环 }if(j==1){if(bu->bbase>20000){printf("\t\t\t亲,这个工资有点高哦,请检查是不是手误啦\n");printf("\t\t\t ^.^请重新输入\n");}if(j==1 && bu->bbase<=20000){break;}}}bu->next = bhead->next;  //采用头插法将新节点的尾指针指向第二个节点bhead->next = bu;  //将新节点放在头节点后面printf("\n\t\t\t--->采集成功!\n"); begsave();printf("\n\t\t\t");system("pause");system("cls");
}//读取公司机构文件
void begread()
{  char a[100];//存放读取的汉字FILE *fp;char ch;fp=fopen("begin.txt","a+");          //进入程序时打开/建立该文件fclose(fp);if((fp=fopen("begin.txt","r"))==NULL)  {  printf("\n\t\t\t--->没有找到文件!\n");  return ;  }ch=fgetc(fp);if(ch==EOF){return;}elserewind(fp);fgets(a,20,fp);//读取第一行汉字信息while(!feof(fp))  {   bu = bnew_node(bu);fscanf(fp,"%s %s ",bu->bdepart,bu->bpost);  fscanf(fp," %d\n",&bu->bbase);bu->next = bhead->next; //头插法建立链表 bhead->next = bu;  }fclose(fp);
}
//保存公司机构信息
void begsave()
{char c[20];FILE *fp;printf("\n\t\t\t确认保存?(y/n): ");  while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t请输入合法字符!\n");printf("\t\t\t请重新输入: ");fflush(stdin); //清除缓冲区 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;}if((fp=fopen("begin.txt","w+"))==NULL)  {  printf("\n\t\t\t--->begin.txt文件打开失败!\n");return ;  }fputs("部门 职位 基本工资\n",fp);
//从头节点开始依次写入文件;for(bu = bhead->next; bu != NULL;bu = bu->next)  { fprintf(fp,"%s %s ",bu->bdepart,bu->bpost);  fprintf(fp,"%d\n",bu->bbase);}  fclose(fp);  printf("\n\t\t\t--->信息成功存入\n");
}
//添加员工信息
void s_add()
{ int j;int m,k,l=0;//控制u = new_node(u);  //新建一个节点printf("\t\t\t┏━━━━━━━━━━━━━━采集员工信息━━━━━━━━━━━━━━━┓\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃姓名:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃工号:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃电话:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃部门:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃职位:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃密码:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃迟到次数:                                                             ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");while(1){gotoxy(32,2);scanf("%s",u->name);for(j=0;(size_t)j<strlen(u->name);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->name[j]>=0 && u->name[j]<=255){gotoxy(32,2);printf("不是中文 ^.^ 请重新输入");Sleep(400);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->name)>15){gotoxy(32,2);printf("姓名过长了 ^.^ 请重新输入");Sleep(400);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}}if(strlen(u->name)<=15&&(size_t)j==strlen(u->name)){break;}}while(1){gotoxy(32,4);scanf("%s",u->number);for(j=0;(size_t)j<strlen(u->number);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->number[j]<'0' || u->number[j]>'9')   {gotoxy(32,4);printf("工号是数字哦 ^.^ 请重新输入");Sleep(400);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->number)>8){gotoxy(32,4);printf("工号控制在8位以内哦 ^.^ 请重新输入");Sleep(400);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}}strcpy(look,u->number);//查重for(t = wj->next; t != NULL;t = t->next)  {  if(strcmp(t->number,look) == 0)  {m=0;gotoxy(32,4);printf("该工号已经存在了哦 ^.^ 请重新给予一个工号 ");Sleep(400);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;} if(strcmp(t->number,look) != 0)  { continue;}}if(t==NULL)//新的工号时{m=1;}if(strlen(u->number)<=8&& (size_t)j==strlen(u->number) && m==1){break;}}while(1){gotoxy(32,6);scanf("%s",u->phone);for(j=0;(size_t)j<strlen(u->phone);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->phone[j]<'0' || u->phone[j]>'9'){gotoxy(32,6);printf("电话是数字 ^.^ 请重新输入");Sleep(400);gotoxy(32,6);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->phone)!=11){gotoxy(32,6);printf("电话是11位 ^.^ 请重新输入");Sleep(400);gotoxy(32,6);for(k=0;k<55;k++)printf(" ");break;}}strcpy(look,u->phone);//查重for(t = wj->next; t != NULL;t = t->next)  {  if(strcmp(t->phone,look) == 0) {m=0;gotoxy(32,6);printf("已经存在员工为电话了哦,不可能重复呀  ^.^ 请重新输入");Sleep(400);gotoxy(32,6);for(k=0;k<55;k++)printf(" ");break;} if(strcmp(t->phone,look) != 0)  { continue;}}if(t==NULL)//新的电话时{m=1;}if(strlen(u->phone)==11&& (size_t)j==strlen(u->phone) && m==1){break;}}while(1)//应该输入公司之前存在的部门{gotoxy(32,8);scanf("%s",u->depart);for(j=0;(size_t)j<strlen(u->depart);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->depart[j]>=0 && u->depart[j]<=255){gotoxy(32,8);printf("不是中文 ^.^ 请重新输入");Sleep(400);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->depart)>15){gotoxy(32,8);printf("部门输入过长 ^.^ 请重新输入");Sleep(400);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");break;}l=1;//输入符合 接下来判断是否存在}if(l==1){strcpy(look,u->depart);//检查输入的部门是否为公司机构文件之前存在的for(bt = bwj->next; bt != NULL;bt = bt->next)  {  if(strcmp(bt->bdepart,look) == 0)  //存在时满足{m=1;break;} if(strcmp(bt->bdepart,look) != 0)  { m=0;continue;}}if(m==0)// 请重新输入或者回到机构管理添加{gotoxy(32,8);printf("该公司还没有此部门,^.^ 请重新输入");Sleep(400);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");}if(strlen(u->depart)<=15 && (size_t)j==strlen(u->depart)&& m==1){break;}}}while(1){gotoxy(32,10);scanf("%s",u->post);for(j=0;(size_t)j<strlen(u->post);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->post[j]>=0 && u->post[j]<=255){gotoxy(32,10);printf("不是中文呢 ^.^ 请重新输入");Sleep(400);gotoxy(32,10);for(k=0;k<55;k++)printf(" ");break;}if(strlen(u->post)>15){gotoxy(32,10);printf("职位输入过长 ^.^ 请重新输入");Sleep(400);gotoxy(32,10);for(k=0;k<55;k++)printf(" ");break;}l=1;}if(l==1){strcpy(look,u->post);//检查输入的职位是否为公司机构文件之前存在的for(bt = bwj->next; bt != NULL;bt = bt->next)  {  if(strcmp(bt->bpost,look) == 0)  //存在时满足{m=1;break;} if(strcmp(bt->bpost,look) != 0)  { m=0;continue;}}if(m==0)// 请重新输入或者回到机构管理添加{gotoxy(32,10);printf("该公司还没有此职位,^.^ 请重新输入");Sleep(400);gotoxy(32,10);for(k=0;k<55;k++)printf(" ");}}if(strlen(u->post)<=15 && (size_t)j==strlen(u->post) && m==1){break;}}while(1){gotoxy(32,12);scanf("%s",u->password);if(strlen(u->password)>15){gotoxy(32,12);printf("密码输入过长 ^.^ 请重新输入");Sleep(400);gotoxy(32,12);for(k=0;k<55;k++)printf(" ");}if(strlen(u->password)<=15){break;}}while(1)//迟到次数是输入的{gotoxy(35,14);j=scanf("%d",&u->late);if(j!=1){gotoxy(35,14);printf("迟到次数是数字哦 ^.^ 请重新输入");Sleep(400);gotoxy(35,14);for(k=0;k<55;k++)printf(" ");fflush(stdin); //清除缓冲区 u->late=1; //防止跳出循环 }else{if(u->late>100){gotoxy(35,14);printf("亲,迟到次数有点多哦,手误了吧 ^.^请重新输入");Sleep(300);gotoxy(35,14);for(k=0;k<55;k++)printf(" ");}if(j==1 && u->late<=100){break;}}}u->leave=u->over=0;u->z.base=bt->bbase;u->z.bonus=u->z.real=u->z.cut=0;u->z.bonus=u->over*60;      //奖金:加班60u->z.cut=u->late*10+u->leave*5;   //扣款:迟到-10 请假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;u->next = head->next;  //采用头插法将新节点的尾指针指向第二个节点head->next = u;  //将新节点放在头节点后面printf("\n\t\t\t--->采集成功!\n"); save();printf("\n\t\t\t");system("pause");system("cls");
}//添加部门经理信息
void m_add()
{int j;int m,k,l=0;//控制mu = mnew_node(mu);  //新建一个节点printf("\t\t\t┏━━━━━━━━━━━━━━采集经理信息━━━━━━━━━━━━━━━┓\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃姓名:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃工号:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃所管部门:                                                             ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┃密码:                                                                 ┃\n");printf("\t\t\t┃                                                                      ┃\n");printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");while(1){gotoxy(32,2);scanf("%s",mu->mname);for(j=0;(size_t)j<strlen(mu->mname);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(mu->mname[j]>=0 && mu->mname[j]<=255){gotoxy(32,2);printf("不是中文 ^.^ 请重新输入");Sleep(300);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}if(strlen(mu->mname)>15){gotoxy(32,2);printf("姓名过长了 ^.^ 请重新输入");Sleep(300);gotoxy(32,2);for(k=0;k<55;k++)printf(" ");break;}}if(strlen(mu->mname)<=15 && (size_t)j==strlen(mu->mname)){break;}}while(1){gotoxy(32,4);scanf("%s",mu->mnumber);for(j=0;(size_t)j<strlen(mu->mnumber);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(mu->mnumber[j]<'0' || mu->mnumber[j]>'9'){gotoxy(32,4);printf("工号是数字哦 ^.^ 请重新输入");Sleep(300);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}if(strlen(mu->mnumber)>8){gotoxy(32,4);printf("工号控制在8位以内哦 ^.^ 请重新输入");Sleep(300);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;}}strcpy(look,mu->mnumber);//查重for(mt = mwj->next; mt != NULL;mt = mt->next)  {  if(strcmp(mt->mnumber,look) == 0)  {m=0;gotoxy(32,4);printf("该工号已经存在了哦 ^.^ 请重新给予一个工号 ");Sleep(300);gotoxy(32,4);for(k=0;k<55;k++)printf(" ");break;} if(strcmp(mt->mnumber,look) != 0)  { continue;}}if(mt==NULL)//新的工号时{m=1;}if(strlen(mu->mnumber)<=8 && (size_t)j==strlen(mu->mnumber) && m==1){break;}}while(1){gotoxy(35,6);scanf("%s",mu->mdepart);for(j=0;(size_t)j<strlen(mu->mdepart);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(mu->mdepart[j]>=0 && mu->mdepart[j]<=255){gotoxy(35,6);printf("不是中文 ^.^ 请重新输入");Sleep(300);gotoxy(35,6);for(k=0;k<55;k++)printf(" ");break;}if(strlen(mu->mdepart)>20){gotoxy(35,6);printf("部门输入过长 ^.^ 请重新输入");Sleep(300);gotoxy(35,6);for(k=0;k<55;k++)printf(" ");break;}l=1;}if(l==1){strcpy(look,mu->mdepart);//检查输入的部门是否为公司机构文件之前存在的for(bt = bwj->next; bt != NULL;bt = bt->next)  {  if(strcmp(bt->bdepart,look) == 0)  //存在时满足{m=1;break;} if(strcmp(bt->bdepart,look) != 0)  { m=0;continue;}}if(m==0)// 请重新输入或者回到机构管理添加{gotoxy(35,6);printf("该公司还没有此部门,^.^ 请重新输入");Sleep(300);gotoxy(35,6);for(k=0;k<55;k++)printf(" ");}if(strlen(mu->mdepart)<=20 && (size_t)j==strlen(mu->mdepart) && m==1){break;}}}while(1){gotoxy(32,8);scanf("%s",mu->mpassword);if(strlen(mu->mpassword)>15){gotoxy(32,8);printf("密码输入过长 ^.^ 请重新输入");Sleep(300);gotoxy(32,8);for(k=0;k<55;k++)printf(" ");}if(strlen(mu->mpassword)<=20){break;}}mu->next = mhead->next;  //采用头插法将新节点的尾指针指向第二个节点(掰开)mhead->next = mu;  //将新节点放在头节点后面printf("\n\t\t\t--->添加成功!\n"); msave();
}
void add()
{int chioce;do{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*        0.退出                   *\n");printf("\t\t\t***********************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){system("cls");switch(chioce){  case 1:s_add();break;case 2:m_add();break;case 3:return;case 0:exi(); break;default:printf("\n\t\t\t--->没有该选项!\n"); }}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}
//修改函数  也可再里面弄一个整体修改小函数
void modify()
{int chioce;if(head->next == NULL)  {  printf("\t\t\t--->没有员工信息!");  return ;  }do{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*        0.退出                *\n");printf("\t\t\t********************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){system("cls");switch(chioce){  case 1:modi_name();break;case 2:modi_num();break;case 3:modi_phone();break;case 4:return;default:printf("\n--->无效的指令!\n");}}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}void modi_all()
{                       int chioce; int j;do{printf("\n");printf("\t\t\t*********************修改信息*********************\n");printf("\t\t\t*        1.修改姓名         2.修改工号           *\n");printf("\t\t\t*        3.修改电话         4.调动部门           *\n");printf("\t\t\t*        5.调动职位         6.修改基本工资       *\n");printf("\t\t\t*        7.修改加班天数     8.修改迟到次数       *\n");printf("\t\t\t*        9.修改请假次数     10.返回上一步        *\n");printf("\t\t\t*        0.退出                                  *\n");printf("\t\t\t**************************************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){system("cls");switch(chioce){  case 1:{  while(1){printf("\t\t\t*请输入新的姓名: ");  scanf("%s",u->name);for(j=0;(size_t)j<strlen(u->name);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->name[j]>=0 && u->name[j]<=255){printf("\t\t\t不是中文呢 ^.^\t请重新输入\n");break;}if(strlen(u->name)>15){printf("\t\t\t姓名过长 ^.^\t请重新输入\n");break;}}if(strlen(u->name)<=15&&(size_t)j==strlen(u->name)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 2:{while(1){printf("\t\t\t*请输入新的工号(8位以内):__\b\b");scanf("%s",u->number);for(j=0;(size_t)j<strlen(u->number);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->number[j]<'1' || u->number[j]>'9'){printf("\t\t\t工号是数字 ^.^\t请重新输入\n");break;}if(strlen(u->number)>=8){printf("\t\t\t工号控制在8位以内 ^.^\t请重新输入\n");break;}}if(strlen(u->number)<8 && (size_t)j==strlen(u->number)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 3:{while(1){printf("\t\t\t*请输入新的电话(11位):__\b\b");scanf("%s",u->phone);for(j=0;(size_t)j<strlen(u->phone);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->phone[j]<'1' || u->phone[j]>'9'){printf("\t\t\t电话是数字 ^.^\t请重新输入\n");break;}if(strlen(u->phone)!=11){printf("\t\t\t电话是11位 ^.^\t请重新输入\n");break;}}if(strlen(u->phone)==11&& (size_t)j==strlen(u->phone)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 4:{while(1){printf("\t\t\t*请输入新的部门:__\b\b");scanf("%s",u->depart);for(j=0;(size_t)j<strlen(u->depart);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->depart[j]>=0 && u->depart[j]<=255){printf("\t\t\t不是中文呢 ^.^\t请重新输入\n");break;}if(strlen(u->depart)>20){printf("\t\t\t部门输入过长 ^.^\t请重新输入\n");break;}}if(strlen(u->depart)<=20 && (size_t)j==strlen(u->depart)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 5:{while(1){printf("\t\t\t*请输入新的职位:__\b\b");scanf("%s",u->post);for(j=0;(size_t)j<strlen(u->post);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->post[j]>=0 && u->post[j]<=255){printf("\t\t\t不是中文呢 ^.^\t请重新输入\n");break;}if(strlen(u->post)>20){printf("\t\t\t职位输入过长 ^.^\t请重新输入\n");}}if(strlen(u->post)<=20 && (size_t)j==strlen(u->post)){break;}}printf("\n\t\t\t--->修改成功!\n");save();break;}case 6:{while(1){printf("\t\t\t*请输入新的基本工资:");j=scanf("%d",&u->z.base);if(j!=1){printf("\t\t\t工资是数字哦 ^.^\t请重新输入\n");fflush(stdin); //清除缓冲区 u->z.base=1; //防止跳出循环 }if(j==1){if(u->z.base>20000){printf("\t\t\t亲,这个工资有点高哦,请检查是不是手误啦\n");printf("\t\t\t ^.^请重新输入\n");}if(j==1 && u->z.base<=20000){break;}}}u->z.bonus=u->over*60;      //奖金:加班60 补贴20%u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}case 7:{while(1){printf("\t\t\t*请输入新的加班天数:");j=scanf("%d",&u->over);if(j!=1){printf("\t\t\t加班天数是数字哦 ^.^\t请重新输入\n");fflush(stdin); //清除缓冲区 u->over=1; //防止跳出循环 }else{if(u->over>32){printf("\t\t\t亲,加班天数比每月天数都多哦,请检查是不是手误啦\n");printf("\t\t\t^.^请重新输入\n");}if(j==1 && u->over<32){break;}}}u->z.bonus=u->over*60;      //奖金:加班60 u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}case 8:{while(1){printf("\t\t\t*请输入新的迟到次数: ");j=scanf("%d",&u->late);if(j!=1){printf("\t\t\t迟到次数是数字哦 ^.^\t请重新输入\n");fflush(stdin); //清除缓冲区 u->late=1; //防止跳出循环 }else{if(u->late>100){printf("\t\t\t亲,这个迟到次数有点多哦,请检查是不是手误啦\n");printf("\t\t\t^.^请重新输入\n");}if(j==1 && u->late<=100){break;}}}u->z.cut=u->late*10+u->leave*5;   //扣款:迟到-10 请假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;printf("\n\t\t\t--->修改成功!\n");save();break;}case 9:{while(1){printf("\t\t\t*请输入新的请假次数::");j=scanf("%d",&u->leave);if(j!=1){printf("\t\t\t请假次数是数字哦 ^.^\t请重新输入\n");fflush(stdin); //清除缓冲区 u->leave=1; //防止跳出循环 }else{if(u->leave>100){printf("\t\t\t亲,这个请假次数有点多哦,请检查是不是手误啦\n");printf("\t\t\t^.^请重新输入\n");}if(j==1 && u->leave<=100){break;}}}u->z.cut=u->late*10+u->leave*5;   //扣款:迟到-10 请假-5 u->z.real=u->z.base + u->z.bonus - u->z.cut;save();printf("\n\t\t\t--->修改成功!\n");break;}case 10:return;default:printf("\n\t\t\t--->无效的指令!\n");}}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}
//根据员工姓名修改信息
void modi_name()
{  char xname[100];n = 0;printf("\n\t\t\t请输入您要修改的员工姓名: ");  scanf("%s",xname);  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->name,xname) == 0)  {  n = 1;printf("\t\t\t\t*员工初始信息*\n");puts("      姓名          工号     电话        部门              职位      实际工资 基本工资 迟到 请假 加班 罚款 奖金\n");    printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_all();break;  }  }  if(!n)  printf("\n\t\t\t--->没有这个学生的信息!\n");
}
//根据员工工号修改信息
void modi_num()
{  char xnum[20];n = 0;printf("\n\t\t\t请输入您要修改员工的工号: ");  scanf("%s",xnum);  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->number,xnum) == 0)  {  n = 1;printf("\t\t\t\t*员工初始信息*\n");puts("      姓名          工号     电话        部门              职位      实际工资 基本工资 迟到 请假 加班 罚款 奖金\n");    printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_all();save();break;   }  }  if(!n)  printf("\n\t\t\t--->没有这个学生的信息!\n");
}
//根据员工电话修改信息
void modi_phone()
{  char xphone[20];n = 0;printf("\n\t\t\t请输入您要修改员工的电话: ");  scanf("%s",xphone);  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->number,xphone) == 0)  {  n = 1;printf("\t\t\t\t*员工初始信息*\n");puts("      姓名          工号     电话        部门              职位      实际工资 基本工资 迟到 请假 加班 罚款 奖金\n");    printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_all();save();break;    }  }  if(!n)  printf("\n\t\t\t--->没有这个学生的信息!\n");
}
void del()
{int chioce;if(head->next == NULL)  {  printf("--->\t\t\t没有员工信息!");  return ;  }do{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*        0.退出                *\n");printf("\t\t\t********************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){switch(chioce){  case 1:del_name();break;case 2:del_num();break;case 3:del_phone();break;case 4:return;default:printf("\n\t\t\t--->无效的指令!\n");}}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}
//根据姓名删除信息
void del_name()
{  char dname[100];n = 0;printf("\n\t\t\t请输入您要删除员工的姓名: ");  scanf("%s",dname);  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->name,dname) == 0)  {  n = 1;printf("\t\t\t\t*员工信息*\n");puts("      姓名          工号     电话        部门              职位      实际工资 基本工资 迟到 请假 加班 罚款 奖金\n");    printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);p->next = u->next;  free(u);  printf("\n\t\t\t--->删除成功!\n");save();break;  }  p = u;  }  if(!n)  printf("\n\t\t\t--->没有这个员工的信息!\n");
}
//根据工号删除信息
void del_num()
{  char dnum[20];n = 0;printf("\n\t\t\t请输入您要删除员工的工号: ");  scanf("%s",dnum);  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->number,dnum) == 0)  {  n = 1; printf("\t\t\t\t*员工信息*\n");puts("      姓名          工号     电话        部门              职位      实际工资 基本工资 迟到 请假 加班 罚款 奖金\n");    printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);p->next = u->next;  free(u);  printf("\t\t\t\n--->删除成功!\n");save();break; }  p = u;  }  if(!n)  printf("\n\t\t\t--->没有这个员工的信息!\n");
}
//根据电话删除信息
void del_phone()
{  char dphone[20];n = 0;printf("\n\t\t\t请输入您要删除员工的电话: ");  scanf("%s",dphone);  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->number,dphone) == 0)  {  n = 1; printf("\t\t\t\t*员工信息*\n");puts("      姓名          工号     电话        部门              职位      实际工资 基本工资 迟到 请假 加班 罚款 奖金\n");    printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);p->next = u->next;  free(u);  printf("\n\t\t\t--->删除成功!\n");save();break; }  p = u;  }  if(!n)  printf("\n\t\t\t--->没有这个员工的信息!\n");
}
void sort()
{int chioce;if(head->next == NULL)  {  printf("\t\t\t--->没有员工信息!");  return ;  }do{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*        5.按加班天数排序          *\n");printf("\t\t\t*        6.返回上一步              *\n");printf("\t\t\t*        0.退出                    *\n");printf("\t\t\t************************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){system("cls");switch(chioce){        case 1:sort_num();break;            case 2:sort_real();break;case 3:sort_late();break;case 4:sort_leave();break;case 5:sort_over();break;case 6:return;default:printf("\n\t\t\t--->无效的指令!\n");}}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}
//按工号排序
void sort_num()
{  int i,j;  n = 0;  //记录员工总数;for(u = head->next; u != NULL;u = u->next)  n++;
//采用冒泡法对各个节点按工号升序for(i=1;i<=n;i++)  {  u = head;  for(j=0;j<n-i;j++)  {  p = u->next;  q = p->next;  if(strcmp(p->number,q->number) > 0 || strcmp(p->number,q->number) == 0)  {  u->next = q;  p->next = q->next;  q->next = p;  }  u = u->next;}  } printf("\t\t\t\t工号排序后员工信息\n");display();return;
}
//按实际工资排序
void sort_real()
{  int i,j;  n = 0;  for(u = head->next; u != NULL;u = u->next)  n++;
//采用冒泡法对各个节点按工资升序for(i=1;i<=n;i++)  {  u = head;  for(j=0;j<n-i;j++)  {  p = u->next;  q = p->next;  if(p->z.real >= q->z.real)  {  u->next = q;  p->next = q->next;  q->next = p;  }  u = u->next;  }  } printf("\t\t\t\t实际工资升序后员工信息\n");display();return;
}
//按请假次数排序
void sort_leave()
{  int i,j;
//记录学生总数;n = 0;  for(u = head->next; u != NULL;u = u->next)  n++;
//采用冒泡法对各个节点按请假次数降序排列for(i=1;i<=n;i++)  {  u = head;  for(j=0;j<n-i;j++)  {  p = u->next;  q = p->next;  if(p->leave < q->leave)  {  u->next = q;  p->next = q->next;  q->next = p;  }  u = u->next;  }  } printf("\t\t\t\t请假次数降序后员工信息\n");display();return;
}
//按迟到次数排序
void sort_late()
{  int i,j;
//记录学生总数;n = 0;  for(u = head->next; u != NULL;u = u->next)  n++;
//采用冒泡法对各个节点按迟到次数降序排列for(i=1;i<=n;i++)  {  u = head;  for(j=0;j<n-i;j++)  {  p = u->next;  q = p->next;  if(p->late< q->late)  {  u->next = q;  p->next = q->next;  q->next = p;  }  u = u->next;  }  } printf("\t\t\t\t迟到次数降序后员工信息\n");display();return;
}  //按加班天数排序
void sort_over()
{  int i,j;
//记录学生总数;n = 0;  for(u = head->next; u != NULL;u = u->next)  n++;
//采用冒泡法对各个节点按加班天数降序排列for(i=1;i<=n;i++)  {  u = head;  for(j=0;j<n-i;j++)  {  p = u->next;  q = p->next;  if(p->over < q->over)  {  u->next = q;  p->next = q->next;  q->next = p;  }  u = u->next;  }  } printf("\t\t\t\t加班天数降序后员工信息\n");display();return;
}
void find()
{int chioce;do{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*        5.返回上一步          *\n");printf("\t\t\t*        0.退出                *\n");printf("\t\t\t********************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){system("cls");switch(chioce)         {  case 1:find_name();break;case 2:find_num();break;case 3:find_phone();break;case 4:find_namenum();break;case 5:return;default:printf("\n\t\t\t--->无效的指令!\n");}}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}
//按姓名查找某一员工
void find_name()
{  char cname[20];//标志变量,记录是否查找成功;n = 0;printf("\t\t\t\t\t根据姓名查询信息\n");printf("\t\t\t请输入您要查询员工的姓名: ");  scanf("%s",cname);  for(u = head->next; u != NULL;u = u->next)  {  if(strcmp(u->name,cname) == 0)  {  n = 1;  puts("☆\t  姓名        工号      电话        部门             职位          实际工资  基本工资 迟到 请假 加班 罚款 奖金\n");  printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  printf("\t  ┊%-10s %-8s  %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break;  }  }  if(!n)  printf("\t\t\t--->该员工不存在哦(⊙o⊙)!\n");
}
//按工号查找某一学生成绩
void find_num()
{
//标志变量,记录是否查找成功;char cnum[20];n = 0;printf("\t\t\t\t\t根据工号查询信息\n");printf("\t\t\t请输入您要查询员工的工号: ");  scanf("%s",cnum);  for(u = head->next; u != NULL;u = u->next)  {  if(strcmp(u->number,cnum) == 0)  {  n = 1;  puts("☆\t  姓名        工号      电话        部门             职位          实际工资  基本工资 迟到 请假 加班 罚款 奖金\n");  printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  printf("\t  ┊%-10s %-8s  %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break;  }  }  if(!n)  printf("\t\t\t--->该员工不存在哦(⊙o⊙)!\n");
}//按电话查找某一员工
void find_phone()
{
//标志变量,记录是否查找成功;char cphone[20];n = 0;printf("\t\t\t\t\t根据电话查询信息\n");printf("\t\t\t请输入您要查询员工的电话: "); scanf("%s",cphone);  for(u = head->next; u != NULL;u = u->next)  {  if(strcmp(u->phone,cphone) == 0)  {  n = 1;  printf("\n");  puts("☆\t  姓名        工号      电话        部门             职位          实际工资  基本工资 迟到 请假 加班 罚款 奖金\n");  printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  printf("\t  ┊%-10s %-8s  %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break;  }  }  if(!n)  printf("\t\t\t--->该员工不存在哦(⊙o⊙)!\n");
}
//按姓名和工号查找某一员工
void find_namenum()
{
//标志变量,记录是否查找成功;char ch[20];n = 0;printf("\t\t\t\t\t根据姓名和工号查询信息\n");printf("\t\t\t请输入您要查询员工的姓名: "); scanf("%s",ch);  for(u = head->next; u != NULL;u = u->next)  {  if(strcmp(u->name,ch) == 0)  { printf("\t\t\t请输入工号:");while(1){scanf("%s",ch);if(strcmp(u->number,ch) == 0){n = 1;  printf("\n");  puts("☆\t  姓名        工号      电话        部门             职位          实际工资  基本工资 迟到 请假 加班 罚款 奖金\n");  printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  printf("\t  ┊%-10s %-8s  %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); break;}else{printf("\t\t\t工号与姓名不匹配!请重新输入工号:");fflush(stdin);}}}  }  if(!n)  printf("\t\t\t--->该员工不存在哦(⊙o⊙)!\n");
}
//打印该公司所以员工的信息
void display()
{   n=0;  if(head->next == NULL)  {  printf("--->没有员工信息!\n");  return ;  }  puts("☆\t  姓名        工号      电话        部门             职位          实际工资  基本工资 迟到 请假 加班 罚款 奖金\n");  printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");for(u = head->next; u!= NULL;u = u->next)  {  n++;  printf("\t  ┊%-10s %-8s  %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");}  printf("\n该公司共有 %d个员工.\n\n",n);
}
//保存员工文件;
void save()
{  char c[20];FILE *fp;printf("\n\t\t\t确认保存?(y/n): ");  while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t请输入合法字符!\n");printf("\t\t\t请重新输入: ");fflush(stdin); //清除缓冲区 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;}if((fp=fopen("staff.txt","w+"))==NULL)  {  printf("\n\t\t\t--->staff.txt文件打开失败!\n");return ;  }fputs("姓名 工号 电话 部门 职位 密码 实际工资 基本工资 迟到  请假 加班 扣款 奖金\n",fp);
//从头节点开始依次写入文件;for(u = head->next; u != NULL;u = u->next)  { fprintf(fp,"%s %s %s %s %s %s ",u->name,u->number,u->phone,u->depart,u->post,u->password);  fprintf(fp,"%d %d %d %d %d %d %d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);}  fclose(fp);  printf("\n\t\t\t--->信息成功存入\n");
}
//读取员工文件
void read()
{  char a[100];//存放读取的汉字FILE *fp;char ch;fp=fopen("staff.txt","a+");          //进入程序时打开/建立该文件fclose(fp);if((fp=fopen("staff.txt","r"))==NULL)  {  printf("\n\t\t\t--->没有找到文件!\n");  return ;  }ch=fgetc(fp);if(ch==EOF){return;}elserewind(fp);fgets(a,74,fp);//读取第一行汉字信息while(!feof(fp))  {   u = new_node(u);fscanf(fp,"%s %s %s %s %s %s ",u->name,u->number,u->phone,u->depart,u->post,u->password);  fscanf(fp,"%d %d %d %d %d %d %d\n",&u->z.real,&u->z.base,&u->late,&u->leave,&u->over,&u->z.cut,&u->z.bonus);u->next = head->next; //头插法建立链表 head->next = u;  }fclose(fp);}
//保存经理文件;
void msave()
{  char c[20];FILE *fp;printf("\n\t\t\t确认保存?(y/n): ");  while(1){scanf("%s",c);if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t请输入合法字符!\n");printf("\t\t\t请重新输入: ");fflush(stdin); //清除缓冲区 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;}  if((fp=fopen("manage.txt","w+"))==NULL)  {  printf("\n--->无法打开文件\n");  return ;  } fputs("姓名 工号 所管部门 密码\n",fp);
//从头节点开始依次写入文件;
//部门经理:  姓名 工号 所管部门 密码for(mu = mhead->next; mu != NULL;mu = mu->next)  {  fprintf(fp,"%s %s %s %s\n",mu->mname,mu->mnumber,mu->mdepart,mu->mpassword);  }  fclose(fp);  printf("\n\t\t\t--->经理信息成功存入\n");
}
//读取经理文件
void mread()
{  FILE *fp;char ch,a[100];fp=fopen("manage.txt","a");fclose(fp);if((fp=fopen("manage.txt","r"))==NULL)  {  printf("\n--->没有找到文件!\n");  return ;  }ch=fgetc(fp);if(ch==EOF){return;}elserewind(fp);fgets(a,25,fp);//读取第一行汉字信息while(!feof(fp))  {  mu = mnew_node(mu); fscanf(fp,"%s %s %s %s\n",mu->mname,mu->mnumber,mu->mdepart,mu->mpassword);  mu->next = mhead->next; //头插法建立链表 mhead->next = mu;  }fclose(fp);
}
//退出程序
void exi()
{  char c[100];printf("\n\t\t\t确定退出?(y/n): ");while(1){scanf("%s",c); if( (strcmp(c,"n")!=0) && (strcmp(c,"y")!=0)){printf("\t\t\t请输入合法字符!\n");printf("\t\t\t请重新输入: ");fflush(stdin); //清除缓冲区 }if( (strcmp(c,"n")==0) || (strcmp(c,"y")==0)){break;}}if((strcmp(c,"n")==0)){printf("\t\t\t不保存哦 ^.^\n");return ;}  system("cls");  printf("\n\n");  printf("\t\t\t     ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷\n");  printf("\t\t\t     ∷ 谢谢使用 ∷\n");  printf("\t\t\t     ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷ ∷\n");  printf("\t\t\t                          Thank you! ( ̄▽ ̄) \n");  exit(0);
}
void gotoxy(int x, int y)//位置函数
{COORD coord = {x, y};   /*COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。其定义为:typedef struct _COORD {SHORT X; // horizontal coordinateSHORT Y; // vertical coordinate} COORD;*/SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void welcome()
{int i;system("color 0B");printf("\n\n\n\t\t\t(* ̄︶ ̄)~*  欢 迎 进 入  FengRong's  员 工 管 理 系 统");printf("\n\n\n\n\n\n\n\n\n\n");printf("\t\t\t\t┌───────────┐\n\n\n");printf("\n\t\t\t\t└───────────┘\n");gotoxy(33,15);for(i=0;i<5;i++){printf("██");Sleep(400);}system("cls");
}
int main()
{  int chioce;head = wj = new_node(head);//wj,mwj用于初始文件的读取mhead = mwj = mnew_node(mhead);bhead = bwj = bnew_node(bhead);//welcome();system("color 3f");read();mread();begread();do{                            printf("\t\t\t┏━━━━━员工管理系统━━━━━┓\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         1. 管理员              ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         2.普通员工             ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         3.部门经理             ┃\n"); printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         0.退出管理系统         ┃\n");  printf("\t\t\t┃                                ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━━┛\n"); printf("\t\t\t请选择登陆身份:");if(scanf("%d",&chioce)){switch(chioce){  case 0:exi(); case 1:admin();break;case 2:staff();break;case 3:manager();default:printf("\n\t\t\t请重新选择登录身份:\n");break;}}else{printf("\n\t\t\t不能输入非整型,请重新选择登录身份:\n");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 } }while(chioce!=0);system("pause");
}
void mmgl()
{int chioce;do{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*        0.退出                    *\n");printf("\t\t\t************************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){system("cls");switch(chioce){  case 1:stam();break;case 2:manam();break;case 3:adminm();break;case 4:return;default:printf("\n--->无效的指令!\n");}}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}
void stam()   // 管理员修改密码--找到要修改员工的工号
{  char mm[100];    //变量:修改密码的工号,输入旧密码,修改的新密码n = 0;printf("\n\t\t\t请输入要您要修改密码的工号");  scanf("%s",mm);  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->number,mm) == 0){  n = 1; printf("\n\t\t\t请输入旧的密码: ");scanf("%s",mm);if(strcmp(u->password,mm) != 0){printf("\t\t\t旧密码输入错误哦\n");printf("\t\t\t请谨慎输入 ^.^ 重新输入旧密码\n");scanf("%s",mm);if(strcmp(u->password,mm) != 0){printf("\t\t\t两次输入错误了!\n");printf("\t\t\t您已经没有权利修改密码了 =_= 将返回上一步\n");}else{printf("\t\t\t旧密码验证成功!\n");printf("\t\t\t请输入新的密码: ");  while(1){scanf("%s",u->password);if(strlen(u->password)>15){printf("\t\t\t密码输入过长 ^.^\t请重新输入\n");}if(strlen(u->password)<=15){break;}}printf("\n\t\t\t--->修改成功!\n");save();break; } }else{printf("\t\t\t旧密码验证成功!\n");printf("\t\t\t请输入新的密码: ");  while(1){scanf("%s",u->password);if(strlen(u->password)>15){printf("\t\t\t密码输入过长 ^.^\t请重新输入\n");}if(strlen(u->password)<=15){break;}} printf("\n\t\t\t--->修改成功!\n");save();break; }   }  }  if(!n)  printf("\n\t\t\t--->没有这个员工!\n");
}
void manam()
{  char mm[100];n = 0;printf("\n\t\t\t请输入要修改经理密码的工号 ");  scanf("%s",mm);  for(mu = mhead; mu != NULL;mu = mu->next)  {  if(strcmp(mu->mnumber,mm) == 0)  {  n = 1;printf("\n\t\t\t请输入旧的密码: ");scanf("%s",mm);if(strcmp(mu->mpassword,mm) != 0){printf("\t\t\t旧密码输入错误哦\n");printf("\t\t\t请谨慎输入 ^.^ 重新输入旧密码\n");scanf("%s",mm);if(strcmp(mu->mpassword,mm) != 0){printf("\t\t\t两次输入错误了!\n");printf("\t\t\t您已经没有权利修改密码了 =_= 将返回上一步\n");}else{printf("\t\t\t旧密码验证成功!");printf("\n\t\t\t请输入新的密码: ");  scanf("%s",mu->mpassword); printf("\n\t\t\t--->修改成功!\n");msave();break; } }else{printf("\t\t\t旧密码验证成功!");printf("\n\t\t\t请输入新的密码: ");  scanf("%s",mu->mpassword); printf("\n\t\t\t--->修改成功!\n");msave();break; } }}  if(!n)  printf("\n\t\t\t--->没有这个经理!\n");
}void adminm()
{FILE *fp;unsigned i;char ch[100];char ps[100];fp=fopen("admin.txt","rt"); fscanf(fp,"%s",ps);//读取管理员密码fclose(fp);if((fp=fopen("admin.txt","w+"))==NULL)  {  printf("\n\t\t\t--->无法打开文件\n");  return;  }printf("\n\t\t\t请输入旧密码:");scanf("%s",ch);if(strcmp(ps,ch)!=0){printf("\t\t\t旧密码输入错误哦\n");printf("\t\t\t请谨慎输入 ^.^ 重新输入旧密码\n");scanf("%s",ch);if(strcmp(mu->mpassword,ch) != 0){printf("\t\t\t两次输入错误了!\n");printf("\t\t\t您已经没有权利修改密码了 =_= 将返回上一步\n");}else{printf("\n\t\t\t请输入新的管理员密码:\n");scanf("%s",ch);for(i=0;i<(strlen(ch));i++){fputc(ch[i],fp);}fclose(fp);return;}}else{printf("\n\t\t\t请输入新的管理员密码:\n");scanf("%s",ch);for(i=0;i<(strlen(ch));i++){fputc(ch[i],fp);}fclose(fp);return;}
}
int getadmin()
{int i=0;FILE *fp;char password[100],password1[100];char c;fp=fopen("admin.txt","a");fclose(fp);fp=fopen("admin.txt","rt"); fscanf(fp,"%s",password);//读取管理员密码fclose(fp);printf("\n\n\n\n\t\t\t请输入管理员密码:");//scanf("%s",password1);while((c=getch())!=13){if(c==8){printf("\b \b");i--;continue;}password1[i++]=c;putchar('*');}password1[i]='\0';if(strcmp(password1,password)==0){printf("\n\t\t\t登录中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t密码输入错误!密码在admin.txt中\n\t\t\t请重新输入密码:");fflush(stdin);scanf("%s",password1);if(strcmp(password1,password)==0){printf("\n\t\t\t登录中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t你已经两次密码输入错误!\n\t\t\t将返回上一步,请重新选择登录身份!\n");system("pause");system("cls");return 0;}}
}
void adminxx()
{int chioce;do{printf("\t\t\t┏━━━━━━━━━━━━━━━━┓\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         1. 查询员工信息        ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         2. 修改员工信息        ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         3. 删除员工信息        ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         4. 排序员工信息        ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         5. 返回上一步          ┃\n");  printf("\t\t\t┃                                ┃\n"); printf("\t\t\t┃         0.退出管理系统         ┃\n");  printf("\t\t\t┃                                ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━━┛\n");  printf("\t\t\t请选择:");if(scanf("%d",&chioce)){system("cls");switch(chioce)  {   case 1:find();break;case 2:modify();break;case 3:del();break; case 4:sort();break;case 5:return;case 0:exi(); break;default:printf("\n--->无效的指令!\n");  }}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}
void admin()
{int choice;   system("color 0a");system("cls");if(getadmin()){system("cls");//*****while(1)  {  printf("\t\t\t\t\t\t\t\t管理员模式\n\n\n\n");printf("\t\t\t┏━━━━━员工管理系统━━━━━┓\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         1. 采集信息            ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         2. 管理员工信息        ┃\n");//查询find()  修改modify() 删除del() 排序sort();printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         3. 浏览员工信息        ┃\n");//display()printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         4. 管理密码            ┃\n");printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         5. 管理公司机构        ┃\n"); //beg_add()printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         6. 查看公司机构        ┃\n"); //beg_show()printf("\t\t\t┃                                ┃\n");printf("\t\t\t┃         7. 返回上一步          ┃\n");  printf("\t\t\t┃                                ┃\n"); printf("\t\t\t┃         0.退出管理系统         ┃\n");  printf("\t\t\t┃                                ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━━┛\n");    printf("\t\t\t       请选择功能:");if(scanf("%d",&choice))   {system("cls");switch(choice)  {   case 1:add();break;case 2:adminxx();break;case 3:display();break; case 4:mmgl();break;case 5:beg_add();break;case 6:beg_show();break;case 7:return;case 0:exi(); break;default:printf("\n--->无效的指令!\n");  }}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 choice=1; //防止跳出循环 }printf("\n");    }    }else return ;
}
int sgetmima()
{int m,i=0;//控制char smima[20];char c;m=0;printf("\t\t\t请输入工号:");scanf("%s",sdl);if(head->next==NULL){printf("\t\t\t没有员工信息\n");return 0;}for(u=head->next;u!=NULL;u=u->next){if(strcmp(u->number,sdl)==0){printf("\t\t\t请输入密码:");//scanf("%s",smima);while((c=getch())!=13){if(c==8){printf("\b \b");i--;continue;}smima[i++]=c;putchar('*');}smima[i]='\0';if(strcmp(u->password,smima)==0){m=1;printf("\n\t\t\t登录中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t请再次输入密码:");scanf("%s",smima);if(strcmp(u->password,smima)==0){m=1;printf("\n\t\t\t登录中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\t\t\t密码输入错误!\n");return 0;}}}}if(!m){printf("\n\t\t\t没有此工号的员工!\n");return 0;}return 0;
}void modi_self()//员工修改自己基本信息
{int chioce;    int j;do{printf("\n");printf("\t\t\t*********************修改信息*********************\n");printf("\t\t\t*        1.修改姓名         2.修改电话           *\n");printf("\t\t\t*        3.修改密码         4.返回上一步         *\n");printf("\t\t\t*        0.退出                                  *\n");printf("\t\t\t**************************************************\n");printf("\t\t\t请选择:");if(scanf("%d",&chioce)){switch(chioce){  case 1:{   while(1){printf("\t\t\t*请输入新的姓名: ");  scanf("%s",u->name);for(j=0;(size_t)j<strlen(u->name);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->name[j]<'a' || u->name[j]>'z'){printf("\t\t\t姓名不符合常规 ^.^\t请重新输入\n");break;}if(strlen(u->name)>15){printf("\t\t\t姓名过长 ^.^\t请重新输入\n");break;}}if(strlen(u->name)<=15&&(size_t)j==strlen(u->name)){break;}}printf("\n--->修改成功!\n");save();break;}case 2:{while(1){printf("\t\t\t*请输入新的电话(11位):__\b\b");scanf("%s",u->phone);for(j=0;(size_t)j<strlen(u->phone);j++) //strlen函数返回的类型是size_t 实质是无符号整型{if(u->phone[j]<'1' || u->phone[j]>'9'){printf("\t\t\t电话是数字 ^.^\t请重新输入\n");break;}if(strlen(u->phone)!=11){printf("\t\t\t电话是11位 ^.^\t请重新输入\n");break;}}if(strlen(u->phone)==11&& (size_t)j==strlen(u->phone)){break;}}printf("\n--->修改成功!\n");save();break;}case 3:{printf("\t\t\t请输入新的密码: ");  while(1){scanf("%s",u->password);if(strlen(u->password)>15){printf("\t\t\t密码输入过长 ^.^\t请重新输入\n");}if(strlen(u->password)<=15){break;}}printf("\n\t\t\t--->修改成功!\n");save();break; }case 4:return;default:printf("\n\t\t\t--->无效的指令!\n");}}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 chioce=1; //防止跳出循环 }}while(chioce!=0);return;
}//员工修改自己的基本信息    员工登录工号全局变量char sdl[20];
void mself()
{  for(u = head; u != NULL;u = u->next)  {  if(strcmp(u->number,sdl) == 0)  {  printf("\t\t\t\t\t*员工初始信息*\n");puts("      姓名          工号     电话        部门              职位      实际工资 基本工资 迟到 请假 加班 罚款 奖金\n");    printf("%-15s %-8s %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);modi_self();break;   }  }
}
void sjinru()
{int choice;system("color 3f");system("cls");while(1)  {   printf("\t\t\t\t\t\t\t\t\t\t\t员工模式\n\n\n\n");printf("\t\t\t┏━━━━━━━━━━━━━━━┓\n");         printf("\t\t\t┃       1.查询信息             ┃ \n"); //员工可以查询自己和别人的信息 printf("\t\t\t┃                              ┃\n");  printf("\t\t\t┃       2.修改信息             ┃\n");  //该工号员工只能修改自己的基本信息(姓名 电话 密码)printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       3.查看加班信息         ┃\n");  //员工查看经理发布的加班时间printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       4.发送请假信息         ┃\n");printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       5.返回上一步           ┃\n"); printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       0.退出管理系统         ┃\n");  printf("\t\t\t┃                              ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n"); printf("\t\t\t请选择功能: ");if(scanf("%d",&choice)){system("cls");switch(choice)  {  case 1:find();break;  case 2:mself();break; case 3:lookover();break;case 4:askleave();break;case 5:return;case 0:exi();break;  default:printf("\n\t\t\t--->无效的指令!\n");  }}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 choice=1; //防止跳出循环 }printf("\n"); system("pause");  system("cls");  }
}
void staff()
{system("color 0b");//while(1)// {if(sgetmima()) //工号和密码{system("cls");sjinru();}elsereturn;//}}
int mgetmima()
{int m,i=0;//控制char mmima[20];char mnumber[20];char c;m=0;printf("\t\t\t请输入部门经理工号:");scanf("%s",mnumber);if(mhead->next==NULL){printf("\t\t\t没有经理\n");return 0;}for(mu=mhead->next;mu!=NULL;mu=mu->next){if(strcmp(mu->mnumber,mnumber)==0){printf("\n\t\t\t请输入密码:");//scanf("%s",mmima);while((c=getch())!=13){if(c==8){printf("\b \b");i--;continue;}mmima[i++]=c;putchar('*');}mmima[i]='\0';if(strcmp(mu->mpassword,mmima)==0){m=1;strcpy(ddepart,mu->mdepart);//查看自己部门员工的信息printf("\n\t\t\t登录中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\n\t\t\t请再次输入密码:");scanf("%s",mmima);if(strcmp(mu->mpassword,mmima)==0){m=1;strcpy(ddepart,mu->mdepart);printf("\n\t\t\t登录中");for(i=1;i<6;i++){printf("★");Sleep(100);}printf("\n");return 1;}else{printf("\t\t\t密码输入错误!\n");return 0;}}}}if(!m){printf("\n\t\t\t没有此工号的经理!\n");return 0;}return 0;
}//查找自己部门所有员工的信息;
void find_depart()
{   n=0; for(u = head->next; u != NULL;u = u->next)  {  //不是该部门的员工则跳过;if(strcmp(u->depart,ddepart))  continue;                                 //如果是第一个员工则打印头信息if(!n)  puts("☆\t  姓名        工号      电话        部门             职位          实际工资  基本工资 迟到 请假 加班 罚款 奖金\n");  printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n");  n++;printf("\t  ┊%-10s %-8s  %-11s %-15s %-15s ",u->name,u->number,u->phone,u->depart,u->post);printf("%-8d %-8d %-4d %-4d %-4d %-4d %-4d┊\n",u->z.real,u->z.base,u->late,u->leave,u->over,u->z.cut,u->z.bonus);printf("┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈\n"); }  if(!n)  {  printf("没有这个部门员工的信息!\n");  return ;  }  printf("\n该部门共有 %d个员工.\n\n",n);
}
void mjinru()
{int choice;system("color 2f");system("cls");while(1)  {  printf("\t\t\t\t\t\t\t\t\t\t\t>经理模式\n\n\n\n");printf("\t\t\t┏━━━━━━━━━━━━━━━┓\n");   printf("\t\t\t┃       1.采集员工信息         ┃\n");printf("\t\t\t┃                              ┃\n");   printf("\t\t\t┃       2.浏览信息             ┃\n");printf("\t\t\t┃                              ┃\n"); printf("\t\t\t┃       3.查看本部门信息       ┃\n"); printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       4.通知加班信息         ┃\n"); printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       5.审核请假信息         ┃\n"); printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       6.返回上一步           ┃\n");printf("\t\t\t┃                              ┃\n");printf("\t\t\t┃       0.退出管理系统         ┃\n");printf("\t\t\t┃                              ┃\n"); printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n"); printf("\t\t       请选择功能:");  if(scanf("%d",&choice)){system("cls");switch(choice)  {       case 1:s_add();break;  case 2:display();break;case 3:find_depart();break;case 4:callover();break;case 5:giveleave();break;case 6:return;case 0:exi(); break;default :system("cls");printf("\n--->请重新输入!\n");  }}else{printf("\n\t\t\t不能输入非整型,请重新输入:");fflush(stdin); //清除缓冲区 choice=1; //防止跳出循环 }printf("\n"); system("pause");  system("cls");  }
}
void manager()
{system("color 0b");//while(1)// {if(mgetmima()){system("cls");mjinru();}elsereturn;// }
}

员工信息管理系统--C语言相关推荐

  1. c语言编程员工信息排序,员工工资管理系统(c语言编程)

    <员工工资管理系统(c语言编程)>由会员分享,可在线阅读,更多相关<员工工资管理系统(c语言编程)(6页珍藏版)>请在人人文库网上搜索. 1.include #include# ...

  2. 企业员工信息管理系统(C语言编程)

    C语言课综合实验 #include<stdlib.h> #include<stdio.h> #include <windows.h> #include<str ...

  3. 统计员工信息c语言设计,工资信息管理系统C语言设计

    <工资信息管理系统C语言设计>由会员分享,可在线阅读,更多相关<工资信息管理系统C语言设计(17页珍藏版)>请在人人文库网上搜索. 1.c语言课程实习报告学校:工程学院专业:岩 ...

  4. 【java毕业设计】基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计与实现(毕业论文+程序源码)——企业员工信息管理系统

    基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生Servlet+MySql的企业员工信息管理系统设计 ...

  5. Javaweb实现员工信息管理系统

    员工信息管理系统 一.项目介绍 1.项目用到的技术栈 开发工具:idea 语言:java.js.html+ajax 数据库:MySQL 服务器:Tomcat 框架:mybatis.jQuery.lay ...

  6. 职员信息管理系统php,员工信息管理系统(含附源代码).doc

    员工信息管理系统(含附源代码) 西安郵電學院 目: 员 工 信 息 管 理 系 统 系部名称:电信系专业名称:电子科学与技术班 级:科技0701班内序号:33学生姓名 :贾 春 阳指导教师:黄茹时间: ...

  7. C#+MySQL+VS开发《企业员工信息管理系统》

    C#+MySQL+VS开发<企业员工信息管理系统> 手把手教你如何开发一套员工信息管理系统Windows应用程序,通过此次窗体应用开发,希望读者能够掌握相应的面向对象编程方法,学会项目构建 ...

  8. (附源码)基于java的员工信息管理系统 毕业设计201524

    Springboot员工信息管理系统 摘 要 由于数据库和数据仓库技术的快速发展,企业员工信管理建设越来越向模块化.智能化.自我服务和管理科学化的方向发展.员工信息管理对处理对象和服务对象,自身的系统 ...

  9. 基于JAVA员工信息管理系统计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA员工信息管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA员工信息管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  10. java毕业生设计员工信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计员工信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计员工信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

最新文章

  1. centos6.5下载卸载mysql,centos 6.5卸载Mysql
  2. 组策略管理——软件限制策略(5)
  3. Python 动态生成多维数组
  4. Nginx、LVS及HAProxy负载均衡软件的优缺点详解
  5. RHS333-5 Kerberized NFSv4
  6. Vue.js 3 Step 创建一个组件
  7. CentOS7 搭建基于DPDK的FD.io VPP环境-1
  8. numpy教程:基本输入输出和文件输入输出Input and output
  9. python 回溯法 子集树模板 系列 —— 4、数字组合问题
  10. 阿阿斯顿发沙发是地方撒旦法
  11. 观自在菩萨,行深般若波罗蜜多时,照见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色,色即是空,空即是色,受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故空中无色,无受想行识
  12. QTreeWidget实现搜索子节点功能
  13. JAVA程序包装成桌面应用程序
  14. 支持多种视频格式的html网页视频播放器代码
  15. Deep Learning Based Registration文章阅读(五)《Anatomy-guided Multimodal Registration by Learning Segment 》
  16. [bzoj3073]Journeys
  17. 深圳电信isp劫持www.google-analytics.com的ga.js来弹出广告窗口分析
  18. CUDA out of memory(CUDA显存不足)
  19. 用c#实现一个鼠标连点器
  20. window批量合并txt文档

热门文章

  1. 前端优秀框架jQuery weui推荐
  2. 物联网LoRa系列-2:LoRa系统架构与协议栈详解
  3. android 分享小程序到微信,微信小程序-分享到朋友圈初体验
  4. 下载sqlserver2012 试用_大肥虫助手下载-大肥虫助手 安卓版v7.0.4
  5. 使用ToStringBuilder.reflectionToString重写toString方法
  6. TextWatcher学习
  7. python解题工程力学_工程力学学习指导与解题指南(普通高等教育十三五规划教材)...
  8. 商用密码数字证书合格检测工具
  9. linux 音频转换工具,Linux 音频格式转换初探
  10. 常用术语中英简繁对照- -