基于C语言链表和文件的企业员工管理系统

Dreamlover

发布日期: 2018-10-26 13:45:48 浏览量: 2183
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一 需求分析

企业员工管理系统主要是针对企业员工的基本信息进行增、删、改、查的相关操作,以便用户使用本管理系统时可以快速对企业员工的信息进行管理。

主要实现以下功能:

  • 用户首次使用本系统时进行密码设置和初始化操作

  • 实现添加功能,即添加员工的相关信息

  • 实现查看功能,即显示系统中所有员工的相关信息

  • 实现查找功能,即可以通过多种条件对员工进行查询,如姓名、工号等

  • 实现修改功能,即输入员工的姓名修改其相关信息

  • 实现删除功能,即输入员工的姓名删除其相关信息

  • 实现统计员工人数的功能

  • 实现重新设置密码登录密码的功能

  • 退出系统

二 概要设计

系统功能模块架构图如下所示:

  • 首次登陆用户信息初始化功能模块:当用户时首次使用本系统时,则需要根据提示进行设置密码和初始化的操作

  • 输入员工信息功能模块:实现将用户从键盘输入的数据存储到对应字段或数据成员中,并检查输入的合法性

  • 显示员工信息功能模块:用户根据提示操作显示系统中已有的员工的相关信息,如果系统中海没有存储员工信息则给出无法显示信息的提示

  • 查询员工信息功能模块:根据用户输入的待查询记录的关键字,在数据结构中查找该记录,如找到则输出该员工的信息,否则给出无法找到的提示信息

  • 修改员工信息功能模块:根据用户要求,根据提示操作,找到要修改信息的员工然后修改员工的相关信息,如年龄。工资等

  • 删除员工信息功能模块:由用户输入选择删除相关的员工的信息

  • 统计员工信息功能模块:统计本系统中员工的信息,如男、女员工的人数等

  • 重置系统密码功能模块:根据用户的要求,将旧密码更换设置新密码

  • 退出系统功能模块:在用户执行完相关系统操作之后,退出使用本系统

三 详细设计

3.1 功能函数的调用关系

如下图所示:

3.2 各功能函数的数据流程

如下图所示:

四 程序实现

4.1 初始化模块

本系统中对是否是第一次使用本系统进行了处理,如果是第一次使用,则需要根据提示信息进行设置密码和初始化操作。其思路是:首先打开密码文件,判断是否为空,进而判断系统是否是第一次使用,如果是,系统会提示输入初始密码,如果不是,系统会进入登陆页面,提示输入登陆密码。

  1. void checkfirst()
  2. {
  3. FILE *fp,*fp1; //声明文件型指针
  4. char pwd[9],pwd1[9],pwd2[9];
  5. int i;
  6. char strt='8';
  7. if((fp=fopen("employee.txt","rb"))==NULL)
  8. {
  9. printf("\n\t新系统,请进行相应的初始化操作!\n"); //判断系统密码文件是否为空
  10. bound('_',50);
  11. getch();
  12. do
  13. {
  14. printf("\n设置密码,请不要超过8位: ");
  15. for(i=0;i<8&&((pwd[i]=getch())!=13);i++)
  16. putch('*');
  17. printf("\n请再确认一次密码: ");
  18. for(i=0;i<8&&(pwd1[i]=getch())!=13;i++)
  19. putch('*');
  20. pwd[i]='\0';
  21. pwd1[i]='\0';
  22. if(strcmp(pwd,pwd1)!=0)
  23. printf("\n\n两次密码输入不一致,请重新输入: \n");
  24. else
  25. break;
  26. }while(1);
  27. if((fp1=fopen("employee.txt","wb"))==NULL)
  28. {
  29. printf("\n系统创建失败,请按任意键退出!\n");
  30. getch();
  31. exit(1);
  32. }
  33. i=0;
  34. while(pwd[i])
  35. {
  36. pwd2[i]=(pwd[i]^strt);
  37. putw(pwd2[i],fp1);//将数组元素送入文件流中
  38. i++;
  39. }
  40. fclose(fp1);//关闭文件流
  41. printf("\n系统初始化成功,请按任意键退出后,再重新进入!\n");
  42. getch();
  43. exit(1);
  44. }
  45. else
  46. {
  47. i=0;
  48. while(!feof(fp)&&i<8)//判断是否读完密码文件
  49. pwd[i++]=getw(fp)^strt;//从文件流中读出字符赋给数组
  50. pwd[i]='\0';
  51. if(i>=8)
  52. i--;
  53. while(pwd[i]!=-1&&i>=0)
  54. i--;
  55. pwd[i]='\0';
  56. strcpy(password,pwd);
  57. }
  58. }

4.2 管理员登录模块

自定义函数login()在初始化检测后调用,用于管理员的登录,用户根据提示密码,函数调用strcmp()函数对输入密码和密码文件中的读取数据进行比较,如果一致则进入系统,不一致会提示重新输入,如果3次不一致会强制退出。

  1. void login()//检测登陆密码
  2. {
  3. int i,n=3;
  4. char pwd[9];
  5. do
  6. {
  7. printf("\n请输入登陆密码: ");
  8. for(i=0;i<8&&((pwd[i]=getch())!=13);i++)
  9. putch('*');
  10. pwd[i]='\0';
  11. if(strcmp(pwd,password))
  12. {
  13. printf("\n密码错误,请重新输入!\n");
  14. system("cls");//调用清屏命令
  15. n--;
  16. }
  17. else
  18. break;
  19. }while(n>0);
  20. if(!n)
  21. {
  22. printf("密码输入3次错误,请退出!\n");
  23. getch();
  24. exit(1);
  25. }
  26. }

4.3 添加员工信息模块

自定义函数addemp()用于添加员工的信息,首先打开存储员工信息的数据文件,系统会提示用户输入相应的员工基本信息,当用户输入完成一个员工的信息后,系统会提示用户是否继续输入员工信息。

  1. void addemp()
  2. {
  3. FILE *fp;
  4. EMP *emp1;
  5. int i=0;
  6. char choice='y';
  7. if((fp=fopen("employee.txt","ab"))==NULL)// 追加打开一个二进制文件,并在文件末尾写数据
  8. {
  9. printf("打开文件出错!\n");
  10. getch();
  11. exit(1);
  12. }
  13. do
  14. {
  15. i++;
  16. emp1=(EMP*)malloc(sizeof(EMP));
  17. if(emp1==NULL)
  18. {
  19. printf("内存分配失败,请按任意键退出!\n");
  20. getch();
  21. return;
  22. }
  23. printf("\n\t请输入第%d各员工的信息\n",i);
  24. bound('_',40);
  25. printf("工号: ");
  26. scanf("%d",&emp1->num);
  27. printf("职务: ");
  28. scanf("%s",&emp1->duty);
  29. printf("姓名: ");
  30. scanf("%s",&emp1->name);
  31. printf("性别: ");
  32. scanf("%s",&emp1->sex);
  33. printf("年龄: ");
  34. scanf("%d",&emp1->age);
  35. printf("文化程度: ");
  36. scanf("%s",&emp1->edu);
  37. printf("工资: ");
  38. scanf("%d",&emp1->salary);
  39. printf("办公电话: ");
  40. scanf("%s",&emp1->tel_office);
  41. printf("家庭电话: ");
  42. scanf("%s",&emp1->tel_home);
  43. printf("手机号码: ");
  44. scanf("%s",&emp1->mobile);
  45. printf("QQ号码: ");
  46. scanf("%s",&emp1->qq);
  47. printf("家庭地址: ");
  48. scanf("%s",&emp1->address);
  49. emp1->next=NULL;
  50. if(emp_first==NULL)//判断表头指针是否为空
  51. {
  52. emp_first=emp1;
  53. emp_end=emp1;
  54. }
  55. else
  56. {
  57. emp_end->next=emp1;
  58. emp_end=emp1;
  59. }
  60. fwrite(emp_end,sizeof(EMP),1,fp);//对数据流添加数据项
  61. gfirst=0;
  62. printf("\n");
  63. bound('_',40);
  64. printf("\n是否继续输入?(y/n)");
  65. fflush(stdin);//清除缓存区
  66. choice=getchar();
  67. if(toupper(choice)!='Y')
  68. {
  69. fclose(fp);//关闭文件流
  70. printf("\n输入完毕,请按任意键返回!\n");
  71. getchar();
  72. return;
  73. }
  74. system("cls");
  75. }while(1);
  76. }

4.4 删除员工信息模块

自定义函数delemp()实现删除员工的功能。在系统的功能菜单中选择删除信息的操作后,系统就会提示要删除的员工的姓名,输入要删除的员工的姓名后,如果系统从信息链表中找到相关信息后就会将信息显示出来,再次要求用户确定是否要删除,谨防误操作,提高信息的安全性。

  1. void delemp()
  2. {
  3. int findok=0;
  4. EMP *emp1,*emp2;
  5. char name[10],choice;
  6. system("cls");
  7. printf("\n请输入要删除的员工的姓名: ");
  8. scanf("%s",name);
  9. emp1=emp_first;
  10. emp2=emp1;
  11. while(emp1)
  12. {
  13. if(strcmp(emp1->name,name)==0)
  14. {
  15. findok=1;
  16. system("cls");
  17. printf("\n员工 %s 的信息如下: \n ",emp1->name);
  18. bound('_',40);
  19. printf("工号: %d \n",emp1->num);
  20. printf("职务: %s \n",emp1->duty);
  21. printf("姓名: %s \n",emp1->name);
  22. printf("性别: %s \n",emp1->sex);
  23. printf("年龄: %d \n",emp1->age);
  24. printf("文化程度: %s \n",emp1->edu);
  25. printf("工资: %d\n",emp1->salary);
  26. printf("办公电话: %s \n",emp1->tel_office);
  27. printf("家庭电话: %s \n",emp1->tel_home);
  28. printf("手机号码: %s \n",emp1->mobile);
  29. printf("QQ号码: %s \n",emp1->qq);
  30. printf("家庭地址: %s \n",emp1->address);
  31. bound('_',40);
  32. printf("\n确定要删除该员工信息?(y/n) ");
  33. fflush(stdin);
  34. choice=getchar();
  35. if(choice!='y'&&choice!='Y')
  36. return;
  37. if(emp1==emp_first)
  38. emp_first=emp1->next;
  39. else
  40. emp2->next=emp1->next;
  41. free(emp1);
  42. gsave=1;
  43. savedata();//保存数据
  44. return;
  45. }
  46. else
  47. {
  48. emp2=emp1;
  49. emp1=emp1->next;
  50. }
  51. if(!findok)
  52. {
  53. bound('_',40);
  54. printf("\n没有找到姓名是: %s 的信息!\n",name);
  55. getch();
  56. }
  57. return;
  58. }
  59. }

4.5 员工信息显示模块

自定义函数displayemp()在找到员工的信息后,则需进行显示。

  1. void displayemp(EMP *emp ,char *filed , char *name)
  2. {
  3. if(emp)
  4. {
  5. bound('_',40);
  6. printf("\n %s : %s 信息如下: \n",filed,name);
  7. bound('_',40);
  8. printf("工号: %d \n",emp->num);
  9. printf("职务: %s \n",emp->duty);
  10. printf("姓名: %s \n",emp->name);
  11. printf("性别: %s \n",emp->sex);
  12. printf("年龄: %d \n",emp->age);
  13. printf("文化程度: %s \n",emp->edu);
  14. printf("工资: %d \n",emp->salary);
  15. printf("办公电话: %s \n",emp->tel_office);
  16. printf("家庭电话: %s \n",emp->tel_home);
  17. printf("手机号码: %s \n",emp->mobile);
  18. printf("QQ号码: %s \n",emp->qq);
  19. printf("家庭地址: %s \n",emp->address);
  20. bound('_',40);
  21. }
  22. else
  23. {
  24. bound('_',40);
  25. printf("\n资料库中没有%s为: %s的员工,请重新确认!\n",filed,name);
  26. }
  27. return;
  28. }

4.6 查询员工信息模块

自定义函数findemp()函数用于查询员工信息,在系统的功能菜单中选择查询员工信息的操作后,系统进入一个查询选项列表,用户根据自己的需要选择要使用的查询条件,根据用户输入的条件的不同,系统会调用不同的查询函数,如果系统从信息链表中找到相关的信息就会显示出来。

  1. void findemp()
  2. {
  3. int choice,ret=0,num;
  4. char str[13];
  5. EMP *emp1;
  6. system("cls");
  7. do{
  8. printf("\n\t查询员工信息:\n");
  9. bound('_',30);
  10. printf("\t1.按姓名查询\n");
  11. printf("\t2.按工号查询\n");
  12. printf("\t3.按电话查询\n");
  13. printf("\t4.按QQ号查询\n");
  14. printf("\t0.返回主菜单\n");
  15. bound('_',30);
  16. printf("\n请选择(0-4): ");
  17. do
  18. {
  19. fflush(stdin);
  20. choice=getchar();
  21. system("cls");
  22. switch(choice)
  23. {
  24. case '1':
  25. printf("\n请输入要查询员工的姓名: ");
  26. scanf("%s",str);
  27. emp1=findname(str);//调用子函数
  28. displayemp(emp1,"姓名",str);
  29. getchar();
  30. getchar();
  31. break;
  32. case '2':
  33. printf("\n请输入要查询员工的工号: ");
  34. scanf("%d",&num);
  35. emp1=findnum(num);//调用子函数
  36. itoa(num,str,10);
  37. displayemp(emp1,"工号",str);
  38. getchar();
  39. getchar();
  40. break;
  41. case '3':
  42. printf("\n请输入要查询员工的电话: ");
  43. scanf("%s",str);
  44. emp1=findtelephone(str);//调用子函数
  45. displayemp(emp1,"电话",str);
  46. getchar();
  47. getchar();
  48. break;
  49. case '4':
  50. printf("\n请输入要查询员工的QQ号: ");
  51. scanf("%s",str);
  52. emp1=findqq(str);//调用子函数
  53. displayemp(emp1,"QQ号码",str);
  54. getchar();
  55. getchar();
  56. break;
  57. case '0':
  58. ret=1;
  59. break;
  60. }
  61. }while(choice<'0'||choice>'4');
  62. system("cls");
  63. if(ret)
  64. break;
  65. }while(1);
  66. }
  67. EMP *findname(char *name)//按姓名查找员工信息
  68. {
  69. EMP *emp1;
  70. emp1=emp_first;
  71. while(emp1)
  72. {
  73. if(strcmp(name,emp1->name)==0)//比较输入的名字和链表中记载的名字是否相同
  74. return emp1;
  75. emp1=emp1->next;
  76. }
  77. return NULL;
  78. }
  79. EMP *findnum(int num)//按工号查询
  80. {
  81. EMP *emp1;
  82. emp1=emp_first;
  83. while(emp1)
  84. {
  85. if(num==emp1->num)
  86. return emp1;
  87. emp1=emp1->next;
  88. }
  89. return NULL;
  90. }
  91. EMP *findtelephone(char *name)//按电话号码查询员工信息
  92. {
  93. EMP *emp1;
  94. emp1=emp_first;
  95. while(emp1)
  96. {
  97. if(strcmp(name,emp1->tel_office)==0||strcmp(name,emp1->tel_home)==0||strcmp(name,emp1->mobile)==0)
  98. return emp1;
  99. emp1=emp1->next;
  100. }
  101. return NULL;
  102. }
  103. EMP *findqq(char *name)//按QQ号码查询员工信息
  104. {
  105. EMP *emp1;
  106. emp1=emp_first;
  107. while(emp1)
  108. {
  109. if(strcmp(name,emp1->qq)==0)
  110. return emp1;
  111. emp1=emp1->next;
  112. }
  113. return NULL;
  114. }

4.7 修改密码模块

自定义函数resetpwd()用于修改密码。在系统的功能菜单中选择修改的操作选项后,系统会提示输入旧密码,用户咋正确的输入旧密码后,根据提示即可实现密码的修改。

  1. void resetpwd()
  2. {
  3. char pwd[9],pwd1[9];
  4. int i;
  5. FILE *fp1;
  6. system("cls");
  7. printf("\n请输入旧密码: \n");
  8. for(i=0;i<8&&((pwd[i]=getchar())!=13);i++)
  9. putchar('*');
  10. pwd[i]='\0';
  11. if(strcmp(password,pwd)!=0)
  12. {
  13. printf("\n密码错误,请按任意键退出!\n");
  14. getchar();
  15. return;
  16. }
  17. do
  18. {
  19. printf("\n设置密码,请不要超过8位: ");
  20. for(i=0;i<8&&((pwd[i]=getchar())!=13);i++)
  21. putchar('*');
  22. printf("\n请再确认一次密码: ");
  23. for(i=0;i<8&&((pwd[i]=getchar())!=13);i++)
  24. putchar('*');
  25. pwd[i]='\0';
  26. pwd1[i]='\0';
  27. if(strcmp(pwd,pwd1)!=0)//比较两次输入的密码
  28. printf("\n两次密码输入不一致,请重新输入! \n\n");
  29. else
  30. break;
  31. }while(1);
  32. if((fp1=fopen("employee.tex","wb"))==NULL)
  33. {
  34. printf("\n系统创建失败,请按任意键退出!\n");
  35. getchar();
  36. exit(1);
  37. }
  38. i=0;
  39. while(pwd[i])
  40. {
  41. putw(pwd[i],fp1);//将数组元素送入文件流中
  42. i++;
  43. }
  44. fclose(fp1);//关闭文件流
  45. printf("\n密码修改成功,请按任意键退出后,再重新进入!\n");
  46. getch();
  47. return;
  48. }

4.8 主函数模块

  1. int main()
  2. {
  3. emp_first=emp_end=NULL;//链表指针初始化
  4. gsave=gfirst=0;
  5. checkfirst();
  6. login();
  7. readdata();
  8. menu();
  9. system("PAUSE");
  10. return 0;
  11. }

五 运行测试

实现添加员工信息并显示添加后员工的信息的功能,操作如下图:

实现查询员工信息的功能,操作如下:

实现修改员工信息的功能,并显示修改后员工的信息,操作如下:

六 参考文献

  • 《C语言程序设计教程》,人民邮电出版社

  • 《C语言程序开发范例宝典》,人民邮电出版社

上传的附件 cloud_download 基于C语言链表和文件的企业员工管理系统.zip ( 548.19kb, 96次下载 )
error_outline 下载需要7点积分

发送私信

花有重开日,人无再少年

19
文章数
27
评论数
最近文章
eject