#include //标准输入输出函数库
#include //strcmp函数使用的头文件
#include //标准库头文件system(cls)函数需用到
#include //Sleep函数使用的头文件
#include //getch函数使用的头文件
//宏定义
#define LEN_EMPLOYEE sizeof(struct employee)//employee结构体的长度
#define LEN_ADM sizeof(struct adm)//adm结构体的长度
#define EMPLOYEE_NUM 500//职工的数组大小
#define ADM_NUM 10//管理员的数组大小
#define EMPLOYEE_DATA employeer[i].num,employeer[i].name,employeer[i].sex,employeer[i].age,employeer[i].xueli,employeer[i].wage,employeer[i].addr,employeer[i].tel
#define ADM_DATA admer[i].account,admer[i].password
//结构体的定义
struct employee
{
int num; //职工号
char name[20]; //姓名
char sex[10]; //性别
int age; //年龄
char xueli[30]; //学历
int wage; //工资
char addr[30]; //家庭住址
char tel[20]; //联系电话
};
struct adm
{
int num; //管理员的编号
char account[20]; //管理员的账户
char password[20]; //管理员的密码
};
//全局变量
struct employee employeer[EMPLOYEE_NUM];
struct adm admer[ADM_NUM];
//函数声明部分
void showmainmenu();//显示主菜单
void manager_in();//主管登录
void adm_in();//管理员登录
void employee_in();//职工登录
void managermenu();//主管菜单
void employee_display();//浏览职工信息
int employee_search();//查找职工信息
void employee_del();//删除职工信息
void employee_add();//添加职工信息
void employee_xiugai();//修改职工信息
void adm_add();//添加管理员信息
void adm_display();//浏览管理员信息
void adm_del();//删去管理员信息
void adm_xiugai();//修改管理员信息
int employeefile(char * pcMode);//职工文件函数
void saveemployeefile(int employeeid);//保存职工信息文件函数
void showemployee_xiugaimenu();//显示职工修改菜单
int admfile(char * pcMode);//管理员文件
int adm_search();//管理员查找
void showadm_xiugaimenu();//显示管理员修改菜单
void saveadmfile(int admid);//管理员保存文件函数
void admmenu();//管理员菜单
//主函数
int main()
{
int n;
showmainmenu();/*调用showmainmenu函数绘制界面*/
scanf("%d",&n);/*提示用户输入数字*/
getchar();
while(n)/*当n为0时直接退出程序*/
{
switch(n)
{
case 1:
manager_in();
break;
case 2:
adm_in();
break;
case 3:
employee_in();
break;
default:
printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单");
Sleep(3000);
}
showmainmenu();
scanf("%d",&n);
getchar();
}
return 0;
}
void showmainmenu()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t|------------------欢迎进入-----------------------|\n");
printf("\t| 职工管理系统 |\n");
printf("\t| 主菜单 |\n");
printf("\t| 身份选择 |\n");
printf("\t| 1.manager |\n");
printf("\t| 2.administrator |\n");
printf("\t| 3.employee |\n");
printf("\t| 0.退出系统 |\n");
printf("\t|-------------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-3):");
}
void manager_in()
{
int n,i,j=0;
char managername[10];
char managerpassword[20];
printf("将于3秒后转至manager登录界面");
Sleep(3000);
system("cls");
for(i=0;i<3;i++)
{
printf("\n\t\t\t请输入你的用户名:");
scanf("%s",managername);
printf("\n\t\t\t请输入你的密码:");
scanf("%s",managerpassword);
if(strcmp(managername,"limengqi")==0&&strcmp(managerpassword,"123456")==0)
{
printf("\n\t\t\t登录成功!");
Sleep(1000);
j=1;
managermenu();
break;
}
else
printf("\t\t\t输入用户名或者密码错误!");
continue;
}
scanf("%d",&n);
getchar();
while(n)
{
switch(n)
{
case 1:
employee_display();
break;
case 2:
employee_search();
break;
case 3:
employee_del();
break;
case 4:
employee_add();
break;
case 5:
employee_xiugai();
break;
case 6:
adm_add();
break;
case 7:
adm_display();
break;
case 8:
adm_del();
break;
case 9:
adm_xiugai();
break;
default:
printf("\t\t请输入正确的数字!");
}
printf("|按任意键返回子菜单|");
getch();
managermenu();
scanf("%d",&n);
getchar();
}
}
void managermenu()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t|------------------欢迎进入-----------------------|\n");
printf("\t| 职工管理系统 |\n");
printf("\t| 子菜单 |\n");
printf("\t| 1.浏览职工信息 |\n");
printf("\t| 2.查询职工信息 |\n");
printf("\t| 3.删除职工信息 |\n");
printf("\t| 4.添加职工信息 |\n");
printf("\t| 5.修改职工信息 |\n");
printf("\t| 6.添加管理员信息 |\n");
printf("\t| 7.浏览管理员信息 |\n");
printf("\t| 8.删除管理员信息 |\n");
printf("\t| 9.修改管理员信息 |\n");
printf("\t| 0.返回主菜单 |\n");
printf("\t|-------------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-9):");
}
void employee_display()
{
int i,employee_record;
system("cls");
employee_record=employeefile("rb");
if(employee_record==-1)
printf("文件打开失败,请先添加职工信息!\n");
else if(employee_record==0)
printf("文件中没有职工信息!\n");
else
{
printf("\t|----------------------------------------------------------|\n");
printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话");
for(i=0;i<employee_record;i++)
printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n",EMPLOYEE_DATA);
printf("\t|----------------------------------------------------------|\n");
}
}
void employee_add()
{
FILE *pfemployee;//文件指针
int employee_record,iflagexist,i;
char cFlag;
system("cls");
employee_record=employeefile("ab+");//ab+追加方式打开或重建二进制文件
if(employee_record==-1)
{
printf("文件打开失败!\n");
return;
}
else if(employee_record==0)
printf("文件中没有职工信息!\n");
else
employee_display();//如果职工信息不为0则显示所有职工信息
/*以下代码为循环录入职工信息*/
printf("请选择是否要输入职工信息(y/n):");
cFlag=getchar();
getchar();
if(cFlag=='n')
return;
pfemployee=fopen("employee.txt","ab+");
if( pfemployee==NULL)
{
printf("文件打开失败!\n");
return;
}
while(cFlag=='y')
{
if(employee_record>=EMPLOYEE_NUM)//超过容量范围不能继续写入
{
printf("记录已满!");
fclose(pfemployee);
return;
}
printf("请输入职工编号:");
do{
iflagexist=0;
scanf("%d",&employeer[employee_record].num);
getchar();
for(i=0;i<employee_record;i++)
{
if(employeer[i].num==employeer[employee_record].num)
{
iflagexist=1;
printf("该职工编号已存在,请重新输入:");
break;
}
}
}while( iflagexist==1);
//新增的职工基本信息
printf("请输入职工号:");
scanf("%-6d",&employeer[employee_record].num);
getchar();
printf("请输入姓名:");
gets(employeer[employee_record].name);
printf("请输入性别:");
scanf("%-10s",&employeer[employee_record].sex);
getchar();
printf("请输入年龄:");
scanf("%-6d",&employeer[employee_record].age);
getchar();
printf("请输入学历:");
gets(employeer[employee_record].xueli);
printf("请输入工资:");
scanf("%-16d",&employeer[employee_record].wage);
getchar();
printf("请输入住址:");
gets(employeer[employee_record].addr);
printf("请输入电话:");
gets(employeer[employee_record].tel);
/*将新增的职工信息写入文件中*/
if(fwrite(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee)!=1)
{
printf("无法保存该信息!\n");
return;
}
else
{
printf("%d号职工信息已保存!\n",employeer[employee_record].num);
employee_record++;
}
printf("继续输入信息吗(y/n)");
cFlag=getchar();
getchar();
}
fclose(pfemployee);
printf("添加职工信息执行完毕\n");
}
int employee_search()
{
int employeenum,employee_record,employeeid,i;
system("cls");
employee_record=employeefile("rb");//以"rb"形式打开文件,如果失败则返回
if(employee_record==-1)
{
printf("文件打开失败!\n");
printf("|按任意键返回子菜单|");
getch();
return -2;//文件打开失败,返回-2
}
else if(employee_record==0)
{
printf("文件中没有职工信息!\n");
printf("|按任意键返回子菜单|");
getch();
return -3;//文件打开失败,返回-3
}
//以下进入查找程序
printf("请输入职工号:");
scanf("%d",&employeenum);
getchar();
for(i=0;i<employee_record;i++)
{
if(employeenum==employeer[i].num )
{
employeeid=i;//找到职工记录,返回记录号
printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话");
printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",EMPLOYEE_DATA);
printf("\t|----------------------------------------------------------|\n");
break;
}
}
if(i==employee_record)//遍历循环,没有找到记录,提示用户
{
printf("找不到%d号职工信息!\n",employeenum);
employeeid=-1;
}
return employeeid;
}
void employee_del()
{
FILE *pfemployee;
int employeeid,employee_record,i;
char cFlag;//字符型变量用于选择
system("cls");
employeeid=employee_search();//调用查找函数获得职工记录号
if(employeeid==-1)
return;
employee_record=employeefile("rb");
printf("已找到该职工,是否删除?(y/n)");
cFlag=getchar();
getchar();
if(cFlag=='n')
return;
else if(cFlag=='y')
{
for(i=employeeid;i<employee_record-1;i++)
employeer[i]=employeer[i+1];//数组依次前移
employee_record--;
}
pfemployee=fopen("employee.txt","wb");
if(pfemployee!=NULL)
{
for(i=0;i<employee_record;i++)
{
if(fwrite(&employeer[i],LEN_EMPLOYEE,1,pfemployee)!=1)
{
printf("无法保存该信息!\n");
return;
}
}
fclose(pfemployee);
printf("该职工信息已删除!\n");
}
}
void employee_xiugai()
{
int employeeid,employee_record,iflagexist,n,num,i;
system("cls");
employeeid=employee_search();//调用查找函数获得职工记录号
if(employeeid==-1)//未找到该序号的职工,直接返回
return;
//找到该序号的职工,可以进行修改操作
employee_record=employeefile("rb");
showemployee_xiugaimenu();//显示修改选项的菜单
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
printf("请输入职工编号:");
do
{
iflagexist=0;
scanf("%d",&n);
getchar();
for(i=0;i<employee_record;i++)
{
if(num==employeer[i].num&&i!=employeeid)
{
iflagexist=1;
printf("错误,该职工编号已存在,请重新输入:");
break;
}
}
}while(iflagexist==1);
employeer[employeeid].num=num;
break;
case 2:
printf("请输入职工姓名:");
gets(employeer[employee_record].name);
break;
case 3:
printf("请输入性别:");
scanf("%-10s",employeer[employee_record].sex);
getchar();
break;
case 4:
printf("请输入年龄:");
scanf("%-10d",&employeer[employee_record].age);
getchar();
break;
case 5:
printf("请输入学历:");
gets(employeer[employee_record].xueli);
break;
case 6:
printf("请输入工资:");
scanf("%-16d",&employeer[employee_record].wage);
getchar();
break;
case 7:
printf("请输入住址:");
gets(employeer[employee_record].addr);
break;
case 8:
printf("请输入电话:");
gets(employeer[employee_record].tel);
break;
}
//调用saveemployeefile函数将修改记录存入文件
saveemployeefile(employeeid);
printf("职工信息修改成功!\n");
}
void showemployee_xiugaimenu()
{
printf("\n");
printf("\t| 1.职工号 |\n");
printf("\t| 2.姓名 |\n");
printf("\t| 3.性别 |\n");
printf("\t| 4.年龄 |\n");
printf("\t| 5.学历 |\n");
printf("\t| 6.工资 |\n");
printf("\t| 7.住址 |\n");
printf("\t| 8.电话 |\n");
printf("\n");
printf("请输入所要修改的信息(输入相应的数字:1-5):");
}
int employeefile(char * pcMode)//该函数负责从文件中读取所有的职工信息,并记录employee_record的值
{
int employee_record=0;
FILE *pfemployee;
pfemployee=fopen("employee.txt",pcMode);
if(pfemployee==NULL)
return -1;
while(!feof(pfemployee))
{
if(fread(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee))
employee_record++;
}
fclose(pfemployee);
return employee_record;
}
void saveemployeefile(int employeeid)//该函数专门负责将职工记录号为employeeid的职工信息写入到文件中
{
FILE *pfemployee;
pfemployee=fopen("employee.txt","a+");
if(pfemployee!=NULL)
{
fseek(pfemployee,LEN_EMPLOYEE * employeeid,SEEK_SET);
if(fwrite(&employeer[employeeid],LEN_EMPLOYEE,1,pfemployee)!=1)
printf("无法保存该信息!\n");
}
fclose(pfemployee);
}
void adm_add()
{
FILE *pfadm;//文件指针
int adm_record,iflagexist,i;
char cFlag;
system("cls");
adm_record=admfile("ab+");//ab+追加方式打开或重建二进制文件
if(adm_record==-1)
{
printf("文件打开失败!\n");
return;
}
else if(adm_record==0)
printf("文件中没有职工信息!\n");
else
adm_display();//如果职工信息不为0则显示所有职工信息
/*以下代码为循环录入职工信息*/
printf("请选择是否要输入职工信息(y/n):");
cFlag=getchar();
getchar();
if(cFlag=='n')
return;
pfadm=fopen("adm.txt","ab+");
if( pfadm==NULL)
{
printf("文件打开失败!\n");
return;
}
while(cFlag=='y')
{
if(adm_record>=ADM_NUM)//超过容量范围不能继续写入
{
printf("记录已满!");
fclose(pfadm);
return;
}
printf("请输入管理员编号:");
do{
iflagexist=0;
scanf("%d",&admer[adm_record].num);
getchar();
for(i=0;i<adm_record;i++)
{
if(admer[i].num==admer[adm_record].num)
{
iflagexist=1;
printf("该管理员编号已存在,请重新输入:");
break;
}
}
}while( iflagexist==1);
//新增的管理员的账户和密码
printf("请输入管理员号:");
scanf("%-6d",&admer[adm_record].num);
getchar();
printf("请输入账户:");
gets(admer[adm_record].account);
printf("请输入密码:");
gets(admer[adm_record].password);
/*将新增的管理员的账户和密码写入文件中*/
if(fwrite(&admer[adm_record],LEN_ADM,1,pfadm)!=1)
{
printf("无法保存该信息!\n");
return;
}
else
{
printf("%d号职工信息已保存!\n",admer[adm_record].num);
adm_record++;
}
printf("继续输入信息吗(y/n)");
cFlag=getchar();
getchar();
}
fclose(pfadm);
printf("添加管理员账户和密码执行完毕\n");
}
void adm_display()
{
int i,adm_record;
system("cls");
adm_record=admfile("rb");
if(adm_record==-1)
printf("文件打开失败,请先添加管理员信息!\n");
else if(adm_record==0)
printf("文件中没有管理员信息!\n");
else
{
printf("\t|----------------------------------------------------------|\n");
printf("\t %-6s %-20s %-20s\n","管理员编号","账户","密码");
for(i=0;i<adm_record;i++)
printf("\t %-6d %-20s %-20s\n",ADM_DATA);
printf("\t|----------------------------------------------------------|\n");
}
}
void adm_del()
{
FILE *pfadm;
int admid,adm_record,i;
char cFlag;//字符型变量用于选择
system("cls");
admid=adm_search();//调用查找函数获得管理员记录号
if(admid==-1)
return;
adm_record=admfile("rb");
printf("已找到该管理员,是否删除?(y/n)");
cFlag=getchar();
getchar();
if(cFlag=='n')
return;
else if(cFlag=='y')
{
for(i=admid;i<adm_record-1;i++)
admer[i]=admer[i+1];//数组依次前移
adm_record--;
}
pfadm=fopen("adm.txt","wb");
if(pfadm!=NULL)
{
for(i=0;i<adm_record;i++)
{
if(fwrite(&admer[i],LEN_ADM,1,pfadm)!=1)
{
printf("无法保存该信息!\n");
return;
}
}
fclose(pfadm);
printf("%d号管理员信息已删除!\n",admer[i].num);
}
}
void adm_xiugai()
{
int admid,adm_record,iflagexist,n,num,i;
system("cls");
admid=adm_search();//调用查找函数获得管理员记录号
if(admid==-1)//未找到该序号的管理员,直接返回
return;
//找到该序号的管理员,可以进行修改操作
adm_record=admfile("rb");
showadm_xiugaimenu();//显示修改选项的菜单
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
printf("请输入管理员编号:");
do
{
iflagexist=0;
scanf("%d",&n);
getchar();
for(i=0;i<adm_record;i++)
{
if(num==admer[i].num&&i!=admid)
{
iflagexist=1;
printf("错误,该管理员编号已存在,请重新输入:");
break;
}
}
}while(iflagexist==1);
admer[admid].num=num;
break;
case 2:
printf("请输入管理员账户:");
gets(admer[adm_record].account);
break;
case 3:
printf("请输入管理员密码:");
gets(admer[adm_record].password);
break;
}
//调用saveadmfile函数将修改记录存入文件
saveadmfile(admid);
printf("管理员信息修改成功!\n");
}
void showadm_xiugaimenu()
{
printf("\n");
printf("\t| 1.管理员编号 |\n");
printf("\t| 2.账户 |\n");
printf("\t| 3.密码 |\n");
printf("\n");
printf("请输入所要修改的信息(输入相应的数字:1-3):");
}
int admfile(char * pcMode)//该函数负责从文件中读取所有的管理员信息,并记录adm_record的值
{
int adm_record=0;
FILE * pfadm;
pfadm=fopen("adm.txt",pcMode);
if(pfadm==NULL)
return -1;
while(!feof(pfadm))
{
if(fread(&admer[adm_record],LEN_ADM,1,pfadm))
adm_record++;
}
fclose(pfadm);
return adm_record;
}
void saveadmfile(int admid)//该函数专门负责将管理员记录号为admid的管理员信息写入到文件中
{
FILE *pfadm;
pfadm=fopen("adm.txt","r+");
if(pfadm!=NULL)
{
fseek(pfadm,LEN_ADM * admid,SEEK_SET);
if(fwrite(&admer[admid],LEN_ADM,1,pfadm)!=1)
printf("无法保存该信息!\n");
}
fclose(pfadm);
}
int adm_search()
{
int admnum,adm_record,admid,i;
system("cls");
adm_record=admfile("rb");//以"rb"形式打开文件,如果失败则返回
if(adm_record==-1)
{
printf("文件打开失败!\n");
printf("|按任意键返回子菜单|");
getch();
return -2;//文件打开失败,返回-2
}
else if(adm_record==0)
{
printf("文件中没有职工信息!\n");
printf("|按任意键返回子菜单|");
getch();
return -3;//文件打开失败,返回-3
}
//以下进入查找程序
printf("请输入职工号:");
scanf("%d",&admnum);
getchar();
for(i=0;i<adm_record;i++)
{
if(admnum==admer[i].num )
{
admid=i;//找到职工记录,返回记录号
printf("\t %-6d %-20s %-20s\n","管理员编号","账户","密码");
printf("\t %-6d %-20s %-20s\n",ADM_DATA);
printf("\t|----------------------------------------------------------|\n");
break;
}
}
if(i==adm_record)//遍历循环,没有找到记录,提示用户
{
printf("找不到%d号职工信息!\n",admnum);
admid=-1;
}
return admid;
}
void adm_in()
{
int i,n,k,j=-1,adm_record;
char admaccount[20];
char admpassword[20];
FILE *fpadm;
adm_record=admfile("rb");
printf("将于3秒后转至administrator登录界面");
Sleep(3000);
system("cls");
for(k=0;k<3;k++)
{
printf("\n\t\t\t请输入你的账户名:");
scanf("%s",admaccount);
printf("\n\t\t\t请输入你的登入密码:");
scanf("%s",admpassword);
for(i=0;i<adm_record;i++)
{
if(strcmp(admer[i].account,admaccount)==0&&strcmp(admer[i].password,admpassword)==0)
{
printf("\n\t\t\t登入成功!");
j=1;
admmenu();
goto loop;
}
else
printf("\t\t\t用户名或者密码错误,请重新输入:");
break;
}
}
if(j==-1)
{
printf("\t连续输入错误3次,即将退出程序\n");
Sleep(1000);
exit(0);
}
loop: scanf("%d",&n);
getchar();
while(n)
{
switch(n)
{
case 1:
employee_display();
break;
case 2:
employee_search();
break;
case 3:
employee_del();
break;
case 4:
employee_add();
break;
case 5:
employee_xiugai();
break;
default:
printf("\t\t请输入正确的数字!");
}
printf("|按任意键返回子菜单|");
getch();
admmenu();
scanf("%d",&n);
getchar();
}
}
void admmenu()
{
system("cls");
printf("\n\n\n\n\n");
printf("\t|------------------欢迎进入-----------------------|\n");
printf("\t| 职工管理系统 |\n");
printf("\t| 子菜单 |\n");
printf("\t| 1.浏览职工信息 |\n");
printf("\t| 2.查询职工信息 |\n");
printf("\t| 3.删除职工信息 |\n");
printf("\t| 4.添加职工信息 |\n");
printf("\t| 5.修改职工信息 |\n");
printf("\t| 0.返回主菜单 |\n");
printf("\t|-------------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-5):");
}
void employee_in()
{
int n,employee_record;
system("cls");
printf("\n\n\n\n\n");
employee_record=employeefile("rb");
if(employee_record==-1)
printf("文件打开失败,你的信息还没有被添加!\n");
else if(employee_record==0)
printf("文件中没有你的信息!\n");
else
{
printf("\t|----------------------------------------------------------|\n");
printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话");
printf("请输入你的职工号:\n");
scanf("%d",&n);
printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",employeer[n-1].num,employeer[n-1].name,employeer[n-1].sex,employeer[n-1].age,employeer[n-1].xueli,employeer[n-1].wage,employeer[n-1].addr,employeer[n-1].tel);
printf("\t|----------------------------------------------------------|\n");
}
}