员工信息管理系统 c语言(链表,文件,递归,结构体)

                                                       员工信息管理系统

一、实验内容

员工信息管理系统,包括员工信息数据的增删改查等基本操作,改程序可实现如下功能:

  1. 录入员工信息(工号,姓名,性别,年龄,电话,工资,职称);
  2. 浏览所有员工的信息;
  3. 按条件查询信息(方式一:工号,方式二:姓名,方式三:职称);
  4. 修改员工信息;
  5. 统计信息(选择一:工资的平均值,最大值,选择二:年龄的平均值,最大值);
  6. 按条件排序(选择一:按工号排序,选择二:按年龄排序,选择三:按工资排序);
  7. 信息安全及权限管理(选择一:设置或修改权限密码,选择二:是否打开某项功能的操作权限);
  8. 文件保存与读取(选择一:将信息保存到文件,选择二:从文件中读出信息);

程序运行后先显示如下菜单,并提示用户输入选项:

  1. 录入员工信息
  2. 浏览所有员工信息
  3. 按条件查询信息
  4. 修改员工信息
  5. 统计信息
  6. 按条件排序
  7. 信息安全及权限管理
  8. 文件保存与读取  
  9.  输入9退出系统
  10. 输入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即可。

有问题的话欢迎各位小伙伴评论哟

想要系统设计与实现流程图,解决读取汉字乱码问题及测试图片可私信哦,弄了好久图片传不上来。。哭

  • 10
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值