C语言实现企业员工管理系统开发
本文实例为大家分享了C语言实现企业员工管理系统的具体代码,供大家参考,具体内容如下
程序介绍
系统介绍
企业员工信息管理系统主要是对企业员工的基本信息进行增、删、改、查的相关操作,以便用户可以快速地对这些信息进行管理。本系统对管理者的控制更加严格,只设置一个管理账号。
操作流程
用户在编译完成后会产生一个系统的可执行文件,用户只要双击可执行文件就可以进入系统,如果是第一次进入系统,首先要对系统进行初始化,如图所示,初始化完成后,再次双击系统执行文件,进入如图的界面。
用户在输入正确密码后,进入系统的功能选择界面如图所示。在这个界面用户可以选择相应的操作。
代码
//头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//存储员工信息的结构体
typedef struct employee
{
int num; //员工号
char duty[10]; //员工职务
char name[10]; //员工姓名
char sex[3]; //员工性别
unsigned char age; //员工年龄
char edu[10]; //教育水平
int salary; //员工工资
char tel_office[13]; //办公电话
char tel_home[13]; //家庭电话
char mobile[13]; //手机
char qq[11]; //qq号码
char address[31]; //家庭住址
struct employee *next;
}EMP;
//全局变量
char passWord[9]; //系统密码
EMP *emp_first,*emp_end; //定义指向链表的头结点和尾节点的指针
char gsave,gfirst; //判断标示
//自定义函数声明
void addemp(void); //添加员工信息的函数
void findemp(void); //查找员工信息的函数
void listemp(void); //显示员工信息列表的函数
void modifyemp(void); //修改员工信息的函数
void summaryemp(void); //统计员工信息的函数
void delemp(void); //删除员工信息的函数
void resetpwd(void); //重置系统的函数
void readdata(void); //读取文件数据的函数
void savedata(void); //保存数据的函数
int modi_age(int s); //修改员工年龄的函数
int modi_salary(int s); //修改员工工资的函数
char *modi_field(char *field,char *s,int n); //修改员工其他信息的函数
EMP *findname(char *name); //按员工姓名查找员工信息
EMP *findnum(int num); //按员工工号查找员工信息
EMP *findtelephone(char *name); //按员工的通讯号码查找员工信息
EMP *findqq(char *name); //按员工的QQ号查找员工信息
void displayemp(EMP *emp,char *field,char *name); //显示员工信息
void checkfirst(void); //初始化检测
void bound(char ch,int n); //画出分界线
void login(); //登录检测
void menu(); //主菜单列表
void addemp()
{
FILE *fp; //声明一个文件型指针
EMP *emp1; //声明一个结构型指针
int i=0;
char choice='y';
if((fp=fopen("employee.dat","ab"))==NULL) //判断信息文件中是否有信息
{
printf("打开文件employee.dat出错!\n");
getch();
return;
}
do{
i++;
emp1=(EMP *)malloc(sizeof(EMP)); //申请一段内存
if(emp1==NULL) //判断内存是否分配成功
{
printf("内存分配失败,按任意键退出!\n");
getch();
return;
}
printf("请输入第%d个员工的信息,\n",i);
bound('_',30);
printf("工号:");
scanf("%d",&emp1->num);
printf("职务:");
scanf("%s",&emp1->duty);
printf("姓名:");
scanf("%s",&emp1->name);
printf("性别:");
scanf("%s",&emp1->sex);
printf("年龄:");
scanf("%d",&emp1->age);
printf("文化程度:");
scanf("%s",&emp1->edu);
printf("工资:");
scanf("%d",&emp1->salary);
printf("办公电话:");
scanf("%s",&emp1->tel_office);
printf("家庭电话:");
scanf("%s",&emp1->tel_home);
printf("移动电话:");
scanf("%s",&emp1->mobile);
printf("QQ:");
scanf("%s",&emp1->qq);
printf("地址:");
scanf("%s",&emp1->address);
emp1->next=NULL;
if(emp_first==NULL) //判断链表头指针是否为空
{
emp_first=emp1;
emp_end=emp1;
}else {
emp_end->next=emp1;
emp_end=emp1;
}
fwrite(emp_end,sizeof(EMP),1,fp); //对数据流添加数据项
gfirst=0;
printf("\n");
bound('_',30);
printf("\n是否继续输入?(y/n)");
fflush(stdin); //清除缓冲区
choice=getch();
if(toupper(choice)!='Y') //把小写字母转换成大写字母
{
fclose(fp); //关闭文件流
printf("\n输入完毕,按任意键返回\n");
getch();
return;
}
system("cls");
}while(1);
}
void bound(char ch,int n)
{
while(n--)
putch(ch);
printf("\n");
return;
}
void checkfirst()
{
FILE *fp,*fp1; //声明文件型指针
char pwd[9],pwd1[9],pwd2[9],pwd3[9],ch;
int i;
char strt='8';
if((fp=fopen("config.bat","rb"))==NULL) //判断系统密码文件是否为空
{
printf("\n新系统,请进行相应的初始化操作!\n");
bound('_',50);
getch();
do{
printf("\n设置密码,请不要超过8位:");
for(i=0;i<8&&((pwd[i]=getch())!=13);i++)
putch('*');
printf("\n再确认一次密码:");
for(i=0;i<8&&((pwd1[i]=getch())!=13);i++)
putch('*');
pwd[i]='\0';
pwd1[i]='\0';
if(strcmp(pwd,pwd1)!=0) //判断两次新密码是否一致
{
printf("\n两次密码输入不一致,请重新输入!\n\n");
}
else break;
}while(1);
if((fp1=fopen("config.bat","wb"))==NULL)
{
printf("\n系统创建失败,请按任意键退出!");
getch();
exit(1);
}
i=0;
while(pwd[i])
{
pwd2[i]=(pwd[i]^ strt);
putw(pwd2[i],fp1); //将数组元素送入文件流中
i++;
}
fclose(fp1); //关闭文件流
printf("\n\n系统初始化成功,按任意键退出后,再重新进入!\n");
getch();
exit(1);
}else{
i=0;
while(!feof(fp)&&i<8) //判断是否读完密码文件
pwd[i++]=(getw(fp)^strt); //从文件流中读出字符赋给数组
pwd[i]='\0';
if(i>=8) i--;
while(pwd[i]!=-1&&i>=0)
i--;
pwd[i]='\0'; //将数组最后一位设定为字符串的结束符
strcpy(password,pwd); //将数组pwd中的数据复制到数组password中
}
}
void delemp()
{
int findok=0;
EMP *emp1,*emp2;
char name[10],choice;
system("cls"); //对屏幕清屏
printf("\n输入要删除的员工姓名:");
scanf("%s",name);
emp1=emp_first;
emp2=emp1;
while(emp1)
{
if(strcmp(emp1->name,name)==0)
{
findok=1;
system("cls");
printf("员工:%s的信息如下:\n",emp1->name);
bound('_',40);
printf("工号:%d\n",emp1->num);
printf("职务:%s\n",emp1->duty);
printf("姓名:%s\n",emp1->name);
printf("性别:%s\n",emp1->sex);
printf("年龄:%d\n",emp1->age);
printf("文化程度:%s\n",emp1->edu);
printf("工资:%d\n",emp1->salary);
printf("办公电话:%s\n",emp1->tel_office);
printf("家庭电话:%s\n",emp1->tel_home);
printf("移动电话:%s\n",emp1->mobile);
printf("QQ号码:%s\n",emp1->qq);
printf("住址:%\n",emp1->address);
bound('_',40);
printf("您真的要删除该员工吗?(y/n)");
fflush(stdin); //清除缓冲区
choice=getchar();
if(choice!='y' && choice!='Y')
{
return;
}
if(emp1==emp_first)
{
emp_first=emp1->next;
}
else
{
emp2->next=emp1->next;
}
printf("员工%s已被删除",emp1->name);
getch();
free(emp1);
gsave=1;
savedata(); //保存数据
return;
} else{
emp2=emp1;
emp1=emp1->next;
}
}
if(!findok)
{
bound('_',40);
printf("\n没有找到姓名是:%s的信息!\n",name); //没找到信息后的提示
getch();
}
return;
}
void displayemp(EMP *emp,char *field,char *name)
{
if(emp)
{
printf("\n%s:%s信息如下:\n",field,name);
bound('_',30);
printf("工号:%d\n",emp->num);
printf("职务:%s\n",emp->duty);
printf("姓名:%s\n",emp->name);
printf("性别:%s\n",emp->sex);
printf("年龄:%d\n",emp->age);
printf("文化程度:%s\n",emp->edu);
printf("工资:%d\n",emp->salary);
printf("办公电话:%s\n",emp->tel_office);
printf("家庭电话:%s\n",emp->tel_home);
printf("移动电话:%s\n",emp->mobile);
printf("QQ号码:%s\n",emp->qq);
printf("住址:%s\n",emp->address);
bound('_',30);
}else {
bound('_',40);
printf("资料库中没有%s为:%s的员工!请重新确认!",field,name);
}
return;
}
EMP *findname(char *name)
{
EMP *emp1;
emp1=emp_first;
while(emp1)
{
if(strcmp(name,emp1->name)==0) //比较输入的姓名和链表中的记载姓名是否相同
{
return emp1;
}
emp1=emp1->next;
}
return NULL;
}
EMP *findnum(int num) //声明一个结构体指针
{
EMP *emp1;
emp1=emp_first;
while(emp1)
{
if(num==emp1->num) return emp1;
emp1=emp1->next;
}
return NULL;
}
EMP *findtelephone(char *name)
{
EMP *emp1;
emp1=emp_first;
while(emp1)
{
if((strcmp(name,emp1->tel_office)==0)||
(strcmp(name,emp1->tel_home)==0)||
(strcmp(name,emp1->mobile)==0)) //使用逻辑或判断通讯号码
return emp1;
emp1=emp1->next;
}
return NULL;
}
EMP *findqq(char *name)
{
EMP *emp1;
emp1=emp_first;
while(emp1)
{
if(strcmp(name,emp1->qq)==0) return emp1;
emp1=emp1->next;
}
return NULL;
}
void findemp()
{
int choice,ret=0,num;
char str[13];
EMP *emp1;
system("cls");
do{
printf("\t查询员工信息\n");
bound('_',30);
printf("\t1.按姓名查询\n");
printf("\t2.按工号查询\n");
printf("\t3.按电话查询\n");
printf("\t4.按QQ号查询\n");
printf("\t0.返回主菜单\n");
bound('_',30);
printf("\n请选择菜单:");
do{
fflush(stdin);
choice=getchar();
system("cls");
switch(choice)
{
case '1':
printf("\n输入要查询的员工姓名:");
scanf("%s",str);
emp1=findname(str);
displayemp(emp1,"姓名",str);
getch();
break;
case '2':
printf("\n请输入要查询的员工的工号");
scanf("%d",&num);
emp1=findnum(num);
itoa(num,str,10);
displayemp(emp1,"工号",str);
getch();
break;
case '3':
printf("\n输入要查询员工的电话:");
scanf("%s",str);
emp1=findtelephone(str);
displayemp(emp1,"电话",str);
getch();
break;
case '4':
printf("\n输入要查询的员工的QQ号:");
scanf("%s",str);
emp1=findqq(str);
displayemp(emp1,"QQ号码",str);
getch();
break;
case '0':
ret=1;
break;
}
}while(choice<'0'||choice>'4');
system("cls");
if(ret) break;
}while(1);
}
void listemp()
{
EMP *emp1;
printf("\n资料库中的员工信息列表\n");
bound('_',40);
emp1=emp_first;
while(emp1)
{
printf("工号:%d\n",emp1->num);
printf("职务:%s\n",emp1->duty);
printf("姓名:%s\n",emp1->name);
printf("性别:%s\n",emp1->sex);
printf("年龄:%d\n",emp1->age);
printf("文化程度:%s\n",emp1->edu);
printf("工资:%d\n",emp1->salary);
printf("办公电话:%s\n",emp1->tel_office);
printf("家庭电话:%s\n",emp1->tel_home);
printf("移动电话:%s\n",emp1->mobile);
printf("QQ号码:%s\n",emp1->qq);
printf("住址:%s\n",emp1->address);
bound('_',40);
emp1=emp1->next;
}
printf("\n显示完毕,按任意键退出!\n");
getch();
return;
}
void login()
{
int i,n=3;
char pwd[9];
do{
printf("请输入密码:");
for(i=0;i<8 && ((pwd[i]=getch())!=13);i++)
putch('*');
pwd[i]='\0';
if(!strcmp(pwd,password))
{
printf("\n密码错误,请重新输入!\n");
getch();
system("cls");
n--;
}
else
break;
} while(n>0); //密码输入三次的控制
if(!n)
{
printf("请退出,你已输入三次错误密码!");
getch();
exit(1);
}
}
void menu()
{
char choice;
system("cls");
do{
printf("\n\t\t\t\t 企业员工管理系统\n\n");
printf("\t\t\t-------------------------------------\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t1、输入员工信息\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t2、查询员工信息\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t3、显示员工信息\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t4、修改员工信息\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t5、删除员工信息\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t6、统计员工信息\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t7、重置系统密码\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t| \t0、退出系统\t\t |\n");
printf("\t\t\t|\t\t\t\t |\n");
printf("\t\t\t-------------------------------------\n");
printf("\n\t\t\t请选择您需要的操作:");
do{
fflush(stdin);
choice=getchar();
system("cls");
switch(choice)
{
case '1':
addemp(); //调用员工信息添加函数
break;
case '2':
if(gfirst)
{
printf("系统信息中无员工信息,请先添加员工信息!\n");
getch();
break;
}
findemp(); //调用员工信息查找函数
break;
case '3':
if(gfirst)
{
printf("系统信息中无员工信息,请先添加员工信息!\n");
getch();
break;
}
listemp(); //员工列表函数
break;
case '4':
if(gfirst)
{
printf("系统信息中无员工信息,请先添加员工信息!\n");
getch();
break;
}
modifyemp(); //员工信息修改函数
break;
case '5':
if(gfirst)
{
printf("系统信息中无员工信息,请先添加员工信息!\n");
getch();
break;
}
delemp(); //删除员工信息的函数
break;
case '6':
if(gfirst)
{
printf("系统信息中无员工信息,请先添加员工信息!\n");
getch();
break;
}
summaryemp(); //统计函数
break;
case '7':
resetpwd(); //重置系统的函数
break;
case '0':
savedata(); //保存数据的函数
exit(0);
default:
printf("请输入0~7之间的数字");
getch();
menu();
}
} while(choice<'0'||choice>'7');
system("cls");
}while(1);
}
int modi_salary(int salary)
{
int newsalary;
printf("原来的工资数为:%d",salary);
printf("新的工资数:");
scanf("%d",&newsalary);
return(newsalary);
}
int modi_age(int age)
{
int newage;
printf("原来的年龄为:%d",age);
printf("新的年龄:");
scanf("%d",&newage);
return(newage);
}
char *modi_field(char *field,char *content,int len)
{
char *str;
str=malloc(sizeof(char)*len);
if(str==NULL)
{
printf("内存分配失败,按任意键退出!");
getch();
return NULL;
}
printf("原来%s为:%s\n",field,content);
printf("修改为(内容不要超过%d个字符!):",len);
scanf("%s",str);
return str;
}
void modifyemp()
{
EMP *emp1;
char name[10],*newcontent;
int choice;
printf("\n请输入您要修改的员工的姓名:");
scanf("%s",&name);
emp1=findname(name);
displayemp(emp1,"姓名",name);
if(emp1)
{
printf("\n 请输入你要修改的内容选项!\n");
bound('_',40);
printf("1.修改职务 2.修改年龄\n");
printf("3.修改文化程度 4.修改工资\n");
printf("5.修改办公室电话 6.修改家庭电话\n");
printf("7.修改移动电话 8.修改QQ号码 \n");
printf("9.修改住址 0.返回\n ");
bound('_',40);
do{
fflush(stdin); //清除缓冲区
choice=getchar();
switch(choice) //操作选择函数
{
case '1':
newcontent=modi_field("职务",emp1->duty,10); //调用修改函数修改基本信息
if(newcontent!=NULL)
{
strcpy(emp1->duty,newcontent);
free(newcontent);
}
break;
case '2':
emp1->age=modi_age(emp1->age);
break;
case '3':
newcontent=modi_field("文化程度",emp1->edu,10);
if(newcontent!=NULL)
{
strcpy(emp1->edu,newcontent); //获取新信息内容
free(newcontent);
}
break;
case '4':
emp1->salary=modi_salary(emp1->salary);
break;
case '5':
newcontent=modi_field("办公室电话",emp1->tel_office,13);
if(newcontent!=NULL)
{
strcpy(emp1->tel_office,newcontent);
free(newcontent);
}
break;
case '6':
newcontent=modi_field("家庭电话",emp1->tel_home,13);
if(newcontent!=NULL)
{
strcpy(emp1->tel_home,newcontent);
free(newcontent);
}
break;
case '7':
newcontent=modi_field("移动电话",emp1->mobile,12);
if(newcontent!=NULL)
{
strcpy(emp1->mobile,newcontent);
free(newcontent);
}
break;
case '8':
newcontent=modi_field("QQ号码",emp1->qq,10);
if(newcontent==NULL)
{
strcpy(emp1->qq,newcontent);
free(newcontent);
}
break;
case '9':
newcontent=modi_field("住址",emp1->address,30);
if(newcontent!=NULL)
{
strcpy(emp1->address,newcontent);
free(newcontent); //释放内存空间
}
break;
case '0':
return;
}
}while(choice<'0' || choice>'9');
gsave=1;
savedata(); //保存修改的数据信息
printf("\n修改完毕,按任意键退出!\n");
getch();
}
return;
}
void readdata(void)
{
FILE *fp;
EMP *emp1;
if((fp=fopen("employee.dat","rb"))==NULL)
{
gfirst=1;
return;
}
while(!feof(fp))
{
emp1=(EMP *)malloc(sizeof(EMP));
if(emp1==NULL)
{
printf("内存分配失败!\n");
getch();
return;
}
fread(emp1,sizeof(EMP),1,fp);
if(feof(fp)) break;
if(emp_first==NULL)
{
emp_first=emp1;
emp_end=emp1;
}else{
emp_end->next=emp1;
emp_end=emp1;
}
emp_end->next=NULL;
}
gfirst=0;
fclose(fp);
}
void resetpwd()
{
char pwd[9],pwd1[9],ch;
int i;
FILE *fp1;
system("cls");
printf("\n请输入旧密码:\n");
for(i=0;i<8 && ((pwd[i]=getch())!=13);i++)
putch('*');
pwd[i]='\0';
if(strcmp(password,pwd))
{
printf("\n密码错误,请按任意键退出!\n"); //比较旧密码,判断用户权限
getch();
return;
}
do{
printf("\n设置新密码,请不要超过8位:");
for(i=0;i<8&&((pwd[i]=getch())!=13);i++)
putch('*');
printf("\n再确认一次密码:");
for(i=0;i<8&&((pwd1[i]=getch())!=13);i++)
putch('*'); //屏幕中输出提示字符
pwd[i]='\0';
pwd1[i]='\0';
if(strcmp(pwd,pwd1)!=0)
printf("\n两次密码输入不一致,请重新输入!\n\n");
else break;
}while(1);
if((fp1=fopen("config.bat","wb"))==NULL) //打开密码文件
{
printf("\n系统创建失败,请按任意键退出!");
getch();
exit(1);
}
i=0;
while(pwd[i])
{
putw(pwd[i],fp1);
i++;
}
fclose(fp1); //关闭文件流
printf("\n密码修改成功,按任意键退出!\n");
getch();
return;
}
void savedata()
{
FILE *fp;
EMP *emp1;
if(gsave==0) return;
if((fp=fopen("employee.dat","wb"))==NULL)
{
printf("打开文件employee.dat出错!\n");
getch();
return;
}
emp1=emp_first;
while(emp1)
{
fwrite(emp1,sizeof(EMP),1,fp);
emp1=emp1->next;
}
gsave=0;
fclose(fp);
}
void summaryemp()
{
EMP *emp1;
int sum=0,num=0,man=0,woman=0;
emp1=emp_first;
while(emp1)
{
num++;
sum+=emp1->salary;
char strw[2];
strncpy(strw,emp1->sex,2);
if((strcmp(strw,"ma")==0)||(strcmp(emp1->sex,"男")==0)) man++;
else woman++;
emp1=emp1->next;
}
printf("\n下面是相关员工的统计信息!\n");
bound('_',40);
printf("员工总数是:%d\n",num);
printf("员工的工资总数是:%d\n",sum);
printf("男员工数为:%d\n",man);
printf("女员工数为:%d\n",woman);
bound('_',40);
printf("按任意键退出!\n");
getch();
return;
}
int main(void)
{
system("color f0\n"); //白底黑字
emp_first=emp_end=NULL;
gsave=gfirst=0;
checkfirst();
login();
readdata();
menu();
system("PAUSE");
return 0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关文章