员工信息管理系统
一、实验内容
员工信息管理系统,包括员工信息数据的增删改查等基本操作,改程序可实现如下功能:
- 录入员工信息(工号,姓名,性别,年龄,电话,工资,职称);
- 浏览所有员工的信息;
- 按条件查询信息(方式一:工号,方式二:姓名,方式三:职称);
- 修改员工信息;
- 统计信息(选择一:工资的平均值,最大值,选择二:年龄的平均值,最大值);
- 按条件排序(选择一:按工号排序,选择二:按年龄排序,选择三:按工资排序);
- 信息安全及权限管理(选择一:设置或修改权限密码,选择二:是否打开某项功能的操作权限);
- 文件保存与读取(选择一:将信息保存到文件,选择二:从文件中读出信息);
程序运行后先显示如下菜单,并提示用户输入选项:
- 录入员工信息
- 浏览所有员工信息
- 按条件查询信息
- 修改员工信息
- 统计信息
- 按条件排序
- 信息安全及权限管理
- 文件保存与读取
- 输入9退出系统
- 输入10返回主菜单
初始化权限为全部打开,需要用户输入初始化密码后依据用户输入的选项执行相应的操作。
二、实验环境
操作系统:Win11
集成开发环境:Codeblocks17.12
外部库:不需要调用外部库函数。
三、系统设计与实现
1.系统功能模块划分
2.各个函数之间的调用关系
3.程序流程图
四、代码
//员工信息管理系统
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#define N 15
#define M 20
//储存员工信息的结构体
typedef struct person
{
long num; //工号
char name[N]; //姓名
char sex[N]; //性别
int age; //年龄
char tel[M]; //电话
int salary; //工资
char position[N]; //职称
enum positionFlag{staff,manager}Flag; //枚举类型职称类型
struct person *next; //链表的指针域
}PERSON;
PERSON *head=NULL; //定义指针 头指针
int safety[10]={1,1,1,1,1,1,1,1,1,1}; //定义全局变量数组,起始的操作权限全部打开
long int right_code=88888888;
int sum=0; //员工总人数
void hello(); //欢迎界面
void menus(); //菜单界面
int safety_function(int x); //权限管理功能实现函数
PERSON *input_data(); //录入信息
void browse_message(); //查看信息
void search(); //按条件查询信息--------功能主函数
void search_menu(); //按条件查询信息菜单
void search_1(PERSON *ptemp); //按条件查询信息--------- 1.按工号查询
void search_2(PERSON *ptemp); //按条件查询信息--------- 2.按姓名查询
void search_3(PERSON *ptemp); //按条件查询信息--------- 3.按职称查询
void change(PERSON *ptemp); //修改信息
void statistics(PERSON *ptemp); //统计
void statistics_menu(); //统计函数菜单
void sort(); //排序功能主函数
void sort_menus(); //排序函数菜单
void sort_1(PERSON *ptemp); //按工号排序
void sort_2(PERSON *ptemp); //按年龄排序
void sort_3(PERSON *ptemp); //按工资排序
void safety_(); //信息安全及权限管理主函数
void safety_menu(); //信息安全及权限管理菜单
void safe_(); //功能权限设置
void change_code(); //修改密码
void file(); //文件功能主函数
void file_menu(); //文件菜单
void file_save(); //文件存盘
void file_load(); //磁盘信息读入到内存
void back(); //返回主菜单
void over(); //结束界面
int Max_1(PERSON *L); //计算最大值__1
int Min_1(PERSON *L); //计算最小值__1
int Num_1(PERSON *L); //计算结点数__1
double Average_1(PERSON *L,int c); //计算平均值__1
int Max_2(PERSON *L); //计算最大值__2
int Min_2(PERSON *L); //计算最小值__2
int Num_2(PERSON *L); //计算结点数__2
double Average_2(PERSON *L); //计算平均值__2
int main()
{
int choice; //定义存入用户选择的变量
int safe;
hello();
menus();
while(1)
{
printf("\n ★ 请选择您的操作: ");
printf("\a"); //加入音效
scanf("%d",&choice);
printf("\n");
if(choice==9){ //输入9即退出系统
break;
getchar();
}
switch (choice) //判断用户的选择
{
case 1: safe=safety_function(1); if(safe==1) {head=input_data(); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 2: safe=safety_function(2); if(safe==1) {browse_message(); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 3: safe=safety_function(3); if(safe==1) {search(); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 4: safe=safety_function(4); if(safe==1) {change(head); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 5: safe=safety_function(5); if(safe==1) {statistics(head); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 6: safe=safety_function(6); if(safe==1) {sort(); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 7: safe=safety_function(7); if(safe==1) {safety_(); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 8: safe=safety_function(8); if(safe==1) {file(); getchar(); break;}
else {printf(" 暂无权限"); break;}
case 10: back();
default: printf(" 操作有误!!!!\n"); getchar();
}
}
getchar();
over();
return 0;
}
void hello() //欢迎界面
{
char ttt[] = { "欢迎访问员工信息管理系统!!!" };
printf("\a"); //加入音效
int i;
printf("\n 时间:"); //输出当前日期
system("date/t");
printf("\t ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n\n");
puts("\n");
puts("\t ┃ ┃");
puts("\t ┃ ┃");
printf(" ┃ ");
for(i = 0; ttt[i] != '\0'; i++) {
Sleep(100);
printf("%c", ttt[i]);
if(i==1)
system ( " color 1" );
else if (i==2)
system ( " color 2" );
else if (i==3)
system ( " color 3" );
else if (i==4)
system ( " color 4" );
else if (i==5)
system ( " color 5" );
else if (i==6)
system ( " color 6" );
else if (i==7)
system ( " color 7" );
else if (i==8)
system ( " color 8" );
else if (i==9)
system ( " color 9" );
else if (i==10)
system ( " color A" );
else if (i==11)
system ( " color B" );
else if (i==12)
system ( " color 3" );
else if (i==13)
system ( " color 4" );
else if (i==14)
system ( " color 6" );
else if (i==15)
system ( " color 6" );
else if (i==16)
system ( " color 7" );
else if (i==17)
system ( " color 8" );
else if (i==18)
system ( " color 2" );
else if (i==19)
system ( " color 3" );
else if (i==20)
system ( " color 4" );
else if (i==21)
system ( " color 5" );
else if (i==22)
system ( " color 4" );
}
system ( " color B0" );
printf(" ┃ \n");
puts("\t ┃ ┃");
puts("\t ┃ --------------- ┃");
puts("\t ┃ ┃");
puts("\t ┃ ┃ ");
puts("\n \n");
printf("\n\t 请按回车键进入系统……\n");
system ( " color 0 " );
getchar();
system("cls"); //清空屏幕
}
void menus() //主菜单
{
printf("\n\n\n\n");
printf(" 时间:");
system("date/t");
printf(" ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf(" ☆********************************************************************★\n");
printf(" ★ 员工信息管理系统 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.录入员工信息 5.统计信息 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2.浏览所有员工信息 6. 按条件排序 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 3.按条件查询信息 7.信息安全及权限管理 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 4.修改员工信息 8.文件保存与读取 ☆\n");
printf(" ☆ ★\n");
printf(" ★********************************************************************☆\n");
printf(" ☆ 输入9退出系统 输入10返回主菜单 ★\n");
printf(" ★ ---------------------------------------------- ☆\n");
printf("\a");
}
int safety_function(int x) //权限管理功能实现函数
{
long int input_code;
if(safety[x]==1)
{
printf("请输入密码:(在未修改密码之前,初始化密码为88888888) ");
scanf("%ld",&input_code);
if (input_code==right_code){
printf("密码正确");
return 1;
}
else {
printf("密码错误");
return 0;
}
}
else return 0;
}
PERSON *input_data() //录入信息
{
int i=0;
int judge;
long int x;
PERSON *pnew,*ptail;
ptail=head=NULL;
printf("请输入员工的\n工号 姓名 性别 年龄 电话 工资 职称 :(空格分隔)(输入-1表示输入结束)\n");
scanf("%ld",&x);
while(x!=-1) //输入-1时输入结束
{
pnew=(PERSON*)malloc(sizeof(PERSON)); //动态数据结构
if(pnew==NULL)
{
printf("空间不足\n");
break;
}
pnew->num=x;
if(head==NULL)head=pnew;
judge=scanf("%s%s%d%s%d%s",pnew->name,pnew->sex,&pnew->age,pnew->tel,&pnew->salary,pnew->position);
while(judge!=6)
{
printf("数据输入有误!\n");
judge=scanf("%s%s%d%s%d%s",pnew->name,pnew->sex,&pnew->age,pnew->tel,&pnew->salary,pnew->position);
}
if(ptail!=NULL)ptail->next=pnew;
ptail=pnew;
i++; //i记录输入的员工个数
scanf("%ld",&x);
}
if(ptail!=NULL)ptail->next=NULL;
sum=sum+i;
printf("\n--------------------------------☆输入结束,按回车返回主菜单☆--------------------------------------\n");
return head; //返回头指针
}
void browse_message() //查看信息
{
int i=0;
PERSON *ptemp=head;
if(head!=NULL)
{
while(ptemp!=NULL)
{
printf("----------------------------------------------------------------------------------------------------\n");
printf("第%d位员工信息:\n",i+1);
printf("工号 姓名 性别 年龄 电话 工资 职称 \n");
printf("%5d%5s%5s%5d%15s%10d%9s\n",ptemp->num,ptemp->name,ptemp->sex,ptemp->age,ptemp->tel,ptemp->salary,ptemp->position);
ptemp = ptemp->next;
i++;
}
}
else{
printf("当前无数据");
}
printf("\n---------------------------------☆所有信息已显示,按回车返回主菜单☆-------------------------------\n");
getchar();
}
void search() //按条件查询信息--------功能主函数
{
int t;
search_menu();
while (1)
{
printf("\n ★请选择您的操作: ");
scanf("%d",&t);
if (t==4) break;
switch (t) //选择查询方式
{
case 1: search_1(head); getchar(); break;
case 2: search_2(head); getchar(); break;
case 3: search_3(head); getchar(); break;
case 4: break;
default: printf("\n ★操作有误!! ★\n"); getchar();
}
}
system("cls");
menus();
}
void search_menu() //按条件查询信息菜单
{
system("cls"); //清空屏幕
printf("\n\n ★按条件查询选项★ \n\n");
printf(" ★ ------------------------------------------- ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.按工号查询 ☆\n");
printf(" ☆ 2.按姓名查询 ★\n");
printf(" ★ 3.按职称查询 ☆\n");
printf(" ☆ 4.返回主菜单 ★\n");
printf(" ★ ☆\n");
printf(" ☆ ★\n");
printf(" ★ ------------------------------------------- ☆\n");
}
void search_1(PERSON *ptemp) //按条件查询信息---------1.按工号查询
{
int b=0;
long int number;
printf(" 请输入查询的工号:");
scanf("%ld",&number);
printf("---------------------------------------查询结果:---------------------------------------------------\n") ;
while (ptemp != NULL)
{
b=1; //标志变量记录已找到
if (ptemp->num == number)
{
printf("工号 姓名 性别 年龄 电话 工资 职称 \n");
printf("%5d%9s%5s%5d%15s%10d%9s\n",ptemp->num,ptemp->name,ptemp->sex,ptemp->age,ptemp->tel,ptemp->salary,ptemp->position);
}
ptemp = ptemp->next;
}
if(b==0) { //b等于零则未找到
printf("\n ★无匹配员工!! ★\n");
}
}
void search_2(PERSON *ptemp) //按条件查询信息--------- 2.按姓名查询
{
int t = 0;
char b[20];
printf("请输入查询的员工姓名:");
scanf("%s",b);
printf("---------------------------------------查询结果:---------------------------------------------------\n") ;
while (ptemp != NULL)
{
if (strcmp(ptemp->name,b)==0)
{
t=1; //标志变量记录已找到
printf("工号 姓名 性别 年龄 电话 工资 职称 \n");
printf("%5d%6s%3s%5d%15s%9d%7s\n",ptemp->num,ptemp->name,ptemp->sex,ptemp->age,ptemp->tel,ptemp->salary,ptemp->position);
}
ptemp = ptemp->next;
}
if(t == 0)
printf("\n ★无匹配员工!! ★\n");
system("pause");
}
void search_3(PERSON *ptemp) //按条件查询信息--------- 3.按职称查询
{
int t=0;
char b[10];
printf(" 请输入查询的员工职称:");
scanf("%s",b);
printf("---------------------------------------查询结果:---------------------------------------------------\n") ;
while (ptemp != NULL)
{
if (strcmp(ptemp->position,b)==0)
{
t=1; //标志变量标记已找到
printf("工号 姓名 性别 年龄 电话 工资 职称 \n");
printf("%5d%6s%3s%5d%15s%9d%7s\n",ptemp->num,ptemp->name,ptemp->sex,ptemp->age,ptemp->tel,ptemp->salary,ptemp->position);
}
ptemp = ptemp->next;
}
if(t==0) {printf("\n ★无匹配员工!! ★\n"); }
}
void change(PERSON *ptemp) //修改信息
{
long int t;
char ch;
int flag=0;
while (1)
{
printf("请输入需要修改的工号(输入0000结束修改):");
scanf("%ld",&t);
getchar();
if (t==0000) break;
while (ptemp != NULL)
{
if (ptemp->num == t)
{
flag=1;
printf("工号 姓名 性别 年龄 电话 工资 职称 \n");
printf("%5ld%9s%5s%5d%15s%10d%9s\n",ptemp->num,ptemp->name,ptemp->sex,ptemp->age,ptemp->tel,ptemp->salary,ptemp->position);
printf("\t\t\t是否修改(y/n):");
scanf("%c",&ch);
if (ch == 'y' || ch == 'Y') //询问是否修改
{
printf("请输入该员工的\n工号 姓名 性别 年龄 电话 工资 职称 :(空格分隔)\n");
scanf("%ld%s%s%d%s%d%s",&ptemp->num,ptemp->name,ptemp->sex,&ptemp->age,ptemp->tel,&ptemp->salary,ptemp->position);
break;
}
else break;
}
ptemp = ptemp->next;
}
}
if(flag==0)
{
printf("\n ★无匹配员工!! ★\n");
}
printf("\n-----------------------------------☆修改完毕,按回车返回主菜单☆-----------------------------------\n");
getchar();
}
void statistics(PERSON *ptemp) //统计
{
statistics_menu();
int t;
while (1)
{
printf("\n ★请选择您的操作: ");
scanf("%d",&t);
if(t==1) //统计工资的最大值及平均值
{
int m,c,n;
double a;
m=Max_1(head);
c=Num_1(head);
a=Average_1(head,c);
n=Min_1(head);
printf("员工的工资的平均值:%7.1f 最大值:%d 最小值为:%d",a,m,n);
printf("员工个数为 %d",c);
printf("\n ★ 按4返回主菜单,请选择您的操作 ★\n");
getchar();
}
else if(t==2) //统计年龄的最大值及平均值
{
int m,c,n;
double a;
m=Max_2(head);
c=Num_2(head);
a=Average_2(head);
n=Min_2(head);
printf("员工的年龄的平均值:%7.1f 最大值:%d 最小值为:%d",a/c,m,n);
printf("员工个数为 %d",c);
printf("\n ★ 按4返回主菜单,请选择您的操作 ★\n");
getchar();
}
else if(t==4) break;
else {printf("\n ★操作有误!! ★\n"); getchar();}
}
getchar();
system("cls");
menus();
}
void statistics_menu() //统计函数菜单
{
system("cls"); //清空屏幕
printf("\n\n\n ★统计信息选项★ \n\n");
printf(" ★ ------------------------------------------- ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.统计工资的平均值、最大值 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2.统计年龄的平均值、最大值 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 4.返回主菜单 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ------------------------------------------- ☆\n");
}
void sort() //排序功能主函数
{
int t;
sort_menus();
while (1)
{ printf("\n ★请选择您的操作: ");
scanf("%d",&t);
if (t==4) break;
switch (t)
{
case 1: sort_1(head);getchar();break; //按工号排序
case 2: sort_2(head);getchar();break; //按年龄排序
case 3: sort_3(head);getchar();break; //按工资排序
default:printf("\n ★操作有误!! ★\n");getchar();
}
printf("---------------------------------------排序结果:---------------------------------------------------\n");
PERSON *p;
p=head;
if(head!=NULL)
{
do{
printf("工号 姓名 性别 年龄 电话 工资 职称 \n");
printf("%5d%9s%5s%5d%15s%10d%9s\n",p->num,p->name,p->sex,p->age,p->tel,p->salary,p->position);
p=p->next;
}while(p!=NULL);
}
else
{
printf("链表为空");
}
printf("\n---------------------------------☆所有信息已显示,按回车上一级☆-------------------------------\n");
getchar();
}
getchar();
system("cls");
menus();
}
void sort_menus() //排序函数菜单
{
system("cls"); //清空屏幕
printf("\n\n\n ★按条件排序选项★ \n\n");
printf(" ★ ------------------------------------------- ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.按工号排序 ☆\n");
printf(" ☆ 2.按年龄排序 ★\n");
printf(" ★ 3.按工资排序 ☆\n");
printf(" ☆ 4.返回主菜单 ★\n");
printf(" ★ ☆\n");
printf(" ☆ ★\n");
printf(" ★ ------------------------------------------- ☆\n");
}
void sort_1(PERSON *ptemp)
//按条件排序---------1.按工号排序
{
PERSON *cur,*tail;
cur=head;
tail=NULL;
if(cur==NULL||cur->next==NULL){
return;
}
while(cur!=tail)
{
while(cur->next!=tail)
{
if(cur->num>cur->next->num)
{
int temp=cur->num;
cur->num=cur->next->num;
cur->next->num=temp;
int temp1=cur->age;
cur->age=cur->next->age;
cur->next->age=temp1;
char a[N];
strcpy(a,cur->name);
strcpy(cur->name,cur->next->name);
strcpy(cur->next->name,a);
char b[N];
strcpy(b,cur->sex);
strcpy(cur->sex,cur->next->sex);
strcpy(cur->next->sex,b);
char c[M];
strcpy(c,cur->tel);
strcpy(cur->tel,cur->next->tel);
strcpy(cur->next->tel,c);
int d=cur->salary;
cur->salary=cur->next->salary;
cur->next->salary=d;
char e[N];
strcpy(e,cur->position);
strcpy(cur->position,cur->next->position);
strcpy(cur->next->position,e);
}
cur=cur->next;
}
tail=cur;
cur=head;
}
}
void sort_2(PERSON *ptemp)
//按条件排序---------2.按年龄排序
{
PERSON *cur,*tail;
cur=head;
tail=NULL;
if(cur==NULL||cur->next==NULL){
return;
}
while(cur!=tail)
{
while(cur->next!=tail)
{
if(cur->age>cur->next->age)
{
int temp=cur->num;
cur->num=cur->next->num;
cur->next->num=temp;
int temp1=cur->age;
cur->age=cur->next->age;
cur->next->age=temp1;
char a[N];
strcpy(a,cur->name);
strcpy(cur->name,cur->next->name);
strcpy(cur->next->name,a);
char b[N];
strcpy(b,cur->sex);
strcpy(cur->sex,cur->next->sex);
strcpy(cur->next->sex,b);
char c[M];
strcpy(c,cur->tel);
strcpy(cur->tel,cur->next->tel);
strcpy(cur->next->tel,c);
int d=cur->salary;
cur->salary=cur->next->salary;
cur->next->salary=d;
char e[N];
strcpy(e,cur->position);
strcpy(cur->position,cur->next->position);
strcpy(cur->next->position,e);
}
cur=cur->next;
}
tail=cur;
cur=head;
}
}
void sort_3(PERSON *ptemp)
//按条件排序---------3.按工资排序
{
PERSON *cur,*tail;
cur=head;
tail=NULL;
if(cur==NULL||cur->next==NULL){
return;
}
while(cur!=tail)
{
while(cur->next!=tail)
{
if(cur->salary>cur->next->salary)
{
int temp=cur->num;
cur->num=cur->next->num;
cur->next->num=temp;
int temp1=cur->age;
cur->age=cur->next->age;
cur->next->age=temp1;
char a[N];
strcpy(a,cur->name);
strcpy(cur->name,cur->next->name);
strcpy(cur->next->name,a);
char b[N];
strcpy(b,cur->sex);
strcpy(cur->sex,cur->next->sex);
strcpy(cur->next->sex,b);
char c[M];
strcpy(c,cur->tel);
strcpy(cur->tel,cur->next->tel);
strcpy(cur->next->tel,c);
int d=cur->salary;
cur->salary=cur->next->salary;
cur->next->salary=d;
char e[N];
strcpy(e,cur->position);
strcpy(cur->position,cur->next->position);
strcpy(cur->next->position,e);
}
cur=cur->next;
}
tail=cur;
cur=head;
}
}
void safety_() //信息安全及权限管理主函数
{
int t;
safety_menu();
while (1)
{
printf("\n ★请选择您的操作: ");
scanf("%d",&t);
if(t==3) break;
switch (t)
{
case 1: safe_();getchar(); break;
case 2: change_code(); getchar(); break;
default: printf("\n ★操作有误!! ★\n"); getchar();
}
}
getchar();
system("cls");
menus();
}
void safety_menu() //信息安全及权限管理菜单
{
system("cls"); //清空屏幕
printf("\n\n\b ★信息安全及权限管理★ \n");
printf(" ★ ------------------------------------------- ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.功能权限设置 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2.修改密码 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 3.返回主菜单 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ------------------------------------------- ☆\n");
}
void safe_() //功能权限设置
{
int a;
printf("\n\n");
printf(" | 1.录入员工信息 5.统计信息 |\n");
printf(" | 2.浏览所有员工信息 6. 按条件排序 |\n");
printf(" | 3.按条件查询信息 7.信息安全及权限管理 |\n");
printf(" | 4.修改员工信息 8.文件保存与读取 |\n");
printf(" ☆ 输入9返回上一级 ☆ \n");
while(1)
{
printf("--------------------------------------------------------------------------------------\n");
printf(" 请输入需要设置的功能序号(按9返回):");
scanf("%d",&a);
if(a==9) break;
printf("\n 权限设置为(0为关,1为开):");
scanf("%d",&safety[a]);
printf(" ★ 设置成功 ★ \n");
getchar();
}
}
void change_code() //修改密码
{
int t;
printf("初始密码为:88888888\n");
printf(" 输入1返回菜单,输入其他进行修改密码操作\n");
scanf("%d",&t);
if(t==1);
else {
printf(" 请输入新密码(只能由数字组成):\n");
scanf("%ld",&right_code);
printf(" ★ 修改成功 ★ \n");
}
}
void file() //文件功能主函数
{
int t;
file_menu();
while (1)
{
printf("\n ★请选择您的操作: ");
scanf("%d",&t);
if (t==3) break;
switch (t)
{
case 1: file_save();getchar(); break; //保存文件到磁盘
case 2: file_load();getchar(); break; //从磁盘读取文件
default:printf("\n ★操作有误!! ★\n");getchar();
}
}
system("cls");
menus();
}
void file_menu() //文件操作菜单
{
system("cls"); //清空屏幕
printf("\n\n\b ★文件保存与读取★ \n");
printf(" ★ ------------------------------------------- ☆\n");
printf(" ☆ ★\n");
printf(" ★ 1.文件保存到磁盘 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 2.从磁盘读取文件 ☆\n");
printf(" ☆ ★\n");
printf(" ★ 3.返回主菜单 ☆\n");
printf(" ☆ ★\n");
printf(" ★ ------------------------------------------- ☆\n");
}
void file_save() //文件存盘
{
FILE *fp; //定义文件指针
PERSON *ptemp = head;
if((fp=fopen("Staff.txt","w"))==NULL) // 打开文件,没有文件自动创建,‘w’为只写 模式
{
printf("文件打开错误!\n"); //检查文件打开状态,打开不成功则提示
exit(0);
}
while (ptemp!= NULL)
{
fprintf(fp, "%ld\t%s\t%s\t%d\t%s\t%d\t%s\n", ptemp->num, ptemp->name, ptemp->sex, ptemp->age,ptemp->tel,ptemp->salary,ptemp->position);
ptemp = ptemp->next;
}
fclose(fp); //关闭文件
printf("\n ★数据保存成功 ★ \n\n ");
}
void file_load()
{ // 读入函数 磁盘信息读入到内存
FILE *fp;
//PERSON* pnew = NULL;
PERSON* ptemp = NULL;
long int a;
char b[N];
char c[N];
int d;
char e[M];
int f;
char g[N];
//定义文件指针
if((fp=fopen("Staff.txt","r"))==NULL) // 打开文件,,‘r’为只读
{
printf("文件打开错误!\n"); //检查文件打开状态,打开不成功则提示
exit(0);
}
while(!feof(fp)) //数据多少未知
{
fscanf(fp, "%ld %s %s %d %s %d %s", &a, b, c,&d,e,&f,g);
printf("%5ld%9s%5s%5d%15s%10d%9s\n",a,b,c,d,e,f,g);
}
fclose(fp); //关闭文件
printf("\n ★数据读取成功 ★ \n\n ");
}
void back() //返回主菜单
{
system("cls");
menus();
}
void over() //结束界面
{ system("cls");
printf("\n\n\n");
printf("\n\t ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★\n\n");
puts("\n");
puts("\t ┃ ┃");
puts("\t ┃ ┃");
puts("\t ┃ 感谢访问员工信息管理系统!欢迎下次再来! ┃");
puts("\t ┃ ┃");
puts("\t ┃ ┃");
puts("\t ┃ ┃");
puts("\t ┃ ┃ ");
puts("\n ");
printf("\n\n\n");
}
int Max_1(PERSON *L)
{
int m;
if(!L->next) //如果只有一个结点
return L->salary;
m=Max_1(L->next); //递归法求最大值
return m>=L->salary?m:L->salary;
}
int Min_1(PERSON *L)
{
int n;
if(!L->next) //如果只有一个结点
return L->salary;
n=Min_1(L->next); //递归法求最小值
return n<=L->salary?n:L->salary;
}
int Num_1(PERSON *L)
{
if(!L->next) //如果只有一个结点
return 1;
else
return Num_1(L->next)+1; //递归法求结点个数
}
double Average_1(PERSON *L,int c)
{
double a;
if(!L->next) //如果只有一个结点
{
return L->salary;
}
else
{
a=Average_1(L->next,c-1); //递归法求平均值
return (a*(c-1)+L->salary)/c;
}
}
int Num_2(PERSON *L)
{
if(!L->next) //如果只有一个结点
return 1;
else
return Num_1(L->next)+1; //递归法求结点个数
}
double Average_2(PERSON *L)
{
if(L->next==NULL) //如果只有一个结点
return L->age;
else
//递归法求平均值
return Average_2(L->next)+L->age;
}
int Max_2(PERSON *L)
{
int m;
if(!L->next) //如果只有一个结点
return L->age;
m=Max_2(L->next); //递归法求最大值
return m>=L->age?m:L->age;
}
int Min_2(PERSON *L)
{
int n;
if(!L->next) //如果只有一个结点
return L->age;
n=Min_2(L->next); //递归法求最小值
return n<=L->age?n:L->age;
}
五、测试用例和测试结果
测试用例:
测试方法:通过键盘输入数据及从文件中读取数据。
目的:测试从键盘输入数据或从文件读取数据后,各项功能是否达到预期目的。
测试过程:选择操作为1,后输入初始化密码“88888888”,之后分别输入四个人的相关信息,输入结束后,输入-1以表明输入结束,操作过程及运行结果如下图所示。
之后输入2,再输入初始化密码,检查浏览所有员工信息功能是否达到预期,操作过程及运行结果如下图所示。
之后按回车返回主菜单,后输入3,再输入初始化密码,检查按条件查询功能是否达到预期,输入1,按工号查询,之后输入2,输出了工号为2的员工的所有信息,操作过程如下图所示,
之后在选择操作后输入2,检查按姓名查询功能是否符合预期,后输入“小张”,输出了姓名为小张的员工的全部信息,操作过程如下图所示,
之后按任意键后,在选择操作后输入3,检查按职称查询信息功能是否符合预期,后输入“算法设计”,输出了职称为算法设计的全部员工信息,操作过程如下图所示,
之后在选择操作后输入4,返回主菜单,之后在选择操作后输入4,检查修改员工信息功能是否符合预期,后输入初始化密码“88888888”,之后输入修改的工号,比如是“1”,之后屏幕输出了工号为1的员工的全部信息,在询问是否修改后输入“y”或者“Y”以示需要修改,比如修改小明的年龄为“21”,之后输入“0000”以示修改结束。
之后在选择操作后输入“2”及初始化密码“88888888”检查修改是否完成,可以发现工号为1的员工年龄已经修改为“21”不再是“20”。
之后按回车,在输入选择操作后输入“5”,检验统计功能是否达到预期,后在选择操作后输入“1”,查看员工工资的最值,员工个数及平均值,之后输入“2”,查看员工年龄的最值,员工个数及平均值,操作过程如下图所示,
之后在选择操作界面后输入“4”,返回主菜单,之后在选择操作界面选择“6”并输入初始化密码“88888888”,检验按条件排序功能是否符合预期,之后在选择操作界面输入“1”,看到按照工号排序的结果如下图所示,
之后输入“2”,检验按年龄排序是否符合预期,输出结果如下图所示,
之后输入“3”,检验按工资排序是否符合预期,输出结果如下图所示,
之后在选择操作后输入“4”,返回主菜单,后在选择操作后输入“7”,检验信息安全及权限管理功能是否符合预期,之后在选择操作后输入“1”,检验功能权限功能是否符合预期,比如设置“2 浏览所有员工信息”功能权限为“0”(关),操作过程如下,
此时设置“2 浏览所有员工信息”功能权限为“关”,返回到主菜单后输入选择“2”,可以看到“暂无权限”提示,即之前的修改发挥了作用,操作如下图,
之后在选择操作后输入“7”,再输入“2”,检验修改密码功能是否符合预期,操作如下图所示,
比如修改新密码为“123456”,此时再回到主菜单选择某个功能后输入密码“888888888”会提示“密码错误暂无权限”,而输入密码“123456”会提示“密码正确”,即信息安全即=及权限管理功能符合预期。操作过程如下图,
之后在主菜单的选择操作后输入“8”,检验文件保存与读取功能是否符合预期,操作如下图所示,
之后在此电脑中打开文件“Staff”,可看到内容如下,
之后保存该文件,重新执行程序,在操作选择后输入“8”,再输入“2”,检验从磁盘中读取文件功能是否符合预期,操作结果如下图所示,
之后返回主菜单,后输入“9”,检验退出系统功能是否符合预期,结果如下图所示,
六、一个小提示(困扰我半天。。。)
问题:从文件中读取数据时,读取的字符串部分为乱码。
原因:问题在于电脑的编码方式不同,我的电脑编码方式为GBR。
解决方法:修改一下txt文件的编码方式,修改编码方式为ANSI即可。
有问题的话欢迎各位小伙伴评论哟
想要系统设计与实现流程图,解决读取汉字乱码问题及测试图片可私信哦,弄了好久图片传不上来。。哭