设计一个员工管理系统要求如下,注释越多越好,我菜看不懂

输入10个员工的信息,每个员工含有成员名为“工号、姓名、基本工资、补贴、奖金、水电费、房租、实发工资、工资排名”,分别编写五个函数求:
(1)输入一个员工的工号,查询该员工的信息并输出,若不存在显示没找到。
(2)输入一个新员工的信息,按工号顺序将该员工的信息插入后输出。
(3)输入一个已存在员工的姓名信息,删除该员工的信息后输出。
(4)求每个员工的实发工资(实发工资=基本工资+补贴+奖金-水电费-房租);
(5)对所有员工的信息按实发工资升序排序,并填写工资排名后输出;
要求:
10个员工的数据用文件存储,每个员工的结构体用数组。当程序执行后先显示“菜单”,当输入为1时,执行第(1)个函数;当输入为2时,执行第(2)个函数;当输入为3时,执行第(3)个函数;当输入为4时,执行第(4)个函数;当输入为5时,执行第(5)个函数;当输入为0时,退出系统,当输入其他数字时,提示输入有错误。

代码如下

#include <stdio.h>
#include <string.h>
#include <process.h>
//最大的员工数量,可以根据实际调整
#define MAXNMB 20

//定义员工结构体,用于存放员工数据
struct Employee 
{
    int id;        //工号
    char name[20]; //姓名 
    int baseGz;    //基本工资
    int bt;        //补贴
    int jiangjin;  //奖金
    int shuidian;  //水电费
    int fangzu;    //房租
    int real;      //是发工资
    int rank;      //排名
};

//显示所有员工信息
void display(struct Employee a[],int n)
{
    int i;
    printf("工号 姓名  基本工资 补贴 奖金 水电费 房租\n");
    for (i=0;i<n;i++)
    {
        printf("%d %s %d %d %d %d %d\n",a[i].id,a[i].name,a[i].baseGz,a[i].bt,a[i].jiangjin,a[i].shuidian,a[i].fangzu);
    }
}

//根据工号排序
void SortByGh(struct Employee a[],int n)
{
    int i,j;
    struct Employee tt;
    //采用冒泡排序法按照工号从小到大排序
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if (a[j].id > a[j+1].id)
            {
                tt = a[j];
                a[j] = a[j+1];
                a[j+1] = tt;
            }
        }
    }
}
//读取文件
void ReadFile(char* filename,struct Employee a[],int *n)
{
    FILE* fp;
    int i = 0;
    char buf[100]={0};  //临时缓冲区,读取第一行的注释
    if((fp= fopen(filename,"r")) == 0)
    {
        printf("文件打开失败\n");
        return ;
    }
    fgets(buf,100,fp); //读取开头的注释
    //逐行读取文件,并将字段数据存入结构体数组
    while(!feof(fp))
    {
        fscanf(fp,"%d %s %d %d %d %d %d\n",&a[i].id,a[i].name,&a[i].baseGz,&a[i].bt,&a[i].jiangjin,&a[i].shuidian,&a[i].fangzu);
        if(a[i].id > 0) //去掉空行的影响
            i++;
    }
    fclose(fp);
    *n = i;  //记录数组中实际的员工个数
    display(a,*n);//显示读取后的数据
}
//1.查找信息
void Find(struct Employee a[],int n)
{
    int id,i;
    system("cls");
    printf("请输入需要查找的工号:");
    scanf("%d",&id);
    for (i=0;i<n;i++)
    {
        if (a[i].id == id) //如果工号相等,说明找到需要查找的员工
        {
            printf("工号:%d\n",a[i].id);
            printf("姓名:%s\n",a[i].name);
            printf("基本工资:%d\n",a[i].baseGz);
            printf("补贴:%d\n",a[i].bt);
            printf("奖金:%d\n",a[i].jiangjin);
            printf("水电费:%d\n",a[i].shuidian);
            printf("房租:%d\n",a[i].fangzu);
            //printf("实发工资:%d\n",a[i].real);
            break;
        }
    }
    if (i == n)
    {
        printf("未找到该员工\n");
    }
    system("pause");    
}
//2.插入新员工
void Insert(struct Employee a[],int *n)
{
    struct Employee tt;
    int i,j;
    system("cls");
    printf("请输入新员工的工号:");
    while(1)
    {
        scanf("%d",&tt.id);
        //查找是否已经存在
        for (i=0;i<*n;i++)
        {
            if(a[i].id == tt.id)
            {
                printf("该工号已经被使用,请重新输入:");
                break;
            }
        }
        if(i == *n) //说明该工号可以使用
            break;
    }
    printf("请输入新员工的姓名: ");
    scanf("%s",tt.name);
    printf("请输入新员工的基本工资:");
    scanf("%d",&tt.baseGz);
    printf("请输入新员工的补贴:");
    scanf("%d",&tt.bt);
    printf("请输入新员工的奖金:");
    scanf("%d",&tt.jiangjin);
    printf("请输入新员工的水电费:");
    scanf("%d",&tt.shuidian);
    printf("请输入新员工的房租:");
    scanf("%d",&tt.fangzu);
    //插入
    for (i = 0;i<*n;i++)
    {
        //因为开始的时候已经按照工号从小到大排序了,所以此处找到比插入的工号大的位置
        if(tt.id < a[i].id ) 
        {
            //将原来的数据后移一位
            for (j=*n;j>i;j--)
            {
                a[j] = a[j-1];
            }
            //在找到的位置插入新员工信息
            a[i] = tt;
        }
    }
    //如果数组中所有员工的工号都比新员工的员工号小,就把新员工的信息插入到数组的最后
    if(i == *n)
    {
        a[*n] = tt;
    }
    *n = *n +1;//数组的大小+1
    printf("插入成功\n");
    display(a,*n);
    system("pause");
}
//3.删除员工
void Dele(struct Employee a[],int *n)
{
    int i,j;
    char name[20]={0};
    system("cls");
    printf("请输入需要删除的姓名:"); 
    scanf("%s",name);
    for (i=0;i<*n;i++)
    {
        if (strcmp(name,a[i].name) == 0) //找到名字符合的员工
        {
            //将数组中的元素前移一位(用后面的元素把这个元素覆盖掉)
            for (j=i;j<*n-1;j++)
            {
                a[j] = a[j+1];
            }
            *n = *n -1; //数组中元素的实际个数减一
            printf("删除成功\n");
            display(a,*n); //显示删除后的员工信息
            break;
        }
    }
    if(i == *n)
        printf("未找到该员工\n");

    system("pause");
}
//4.求实发工资
void Real(struct Employee a[],int n)
{
    int i=0;
    system("cls");
    printf("实发工资如下:\n");
    //遍历数组,计算员工的实发工资
    for (i=0;i<n;i++)
    {
        a[i].real = a[i].baseGz + a[i].bt + a[i].jiangjin - a[i].shuidian - a[i].fangzu;
        printf("工号:%d 姓名:%s 实发工资:%d\n",a[i].id,a[i].name,a[i].real);
    }
    system("pause");
}
//5.根据实发工资排名
void SortByReal(struct Employee a[],int n)
{
    int i,j;
    struct Employee tt;
    //使用冒泡排序根据员工的实发工资排序,实发工资从小到大排序
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if(a[j].real > a[j+1].real)
            {
                tt = a[j];
                a[j] = a[j+1];
                a[j+1] = tt;
            }
        }
    }
    //计算排名
    j = 1;
    a[n-1].rank = 1;
    //因为实发工资升序排列,所以排名按照逆序遍历,实发工资最多的排名第一
    for (i = n-2;i>=0;i--)
    {
        if (a[i].rank == a[i+1].rank)//如果第i员工的实发工资与第i+1个员工的实发工资相同,那么他们的排名相同
        {
            a[i].rank = j;
        }else
        {
            //如果第i员工的实发工资与第i+1个员工的实发工资不相同,那么第i个员工的排名+1
            j++;
            a[i].rank = j;
        }
    }
    //显示
    printf("实发工资排名:\n");
    printf("工号    姓名   实发工资    排名\n");
    for (i = 0;i<n;i++)
    {
        printf("%d    %s   %d    %d\n",a[i].id,a[i].name,a[i].real,a[i].rank);
    }
    system("pause");
}
//6.保存到文件
void WriteFile(char* filename,struct Employee a[],int n)
{
    int i;
    FILE* fp;
    if((fp = fopen(filename,"w")) == 0)
    {
        printf("文件打开失败\n");
        return ;
    }
    fprintf(fp, "工号   姓名  基本工资  补贴  奖金  水电费  房租\n"); 
    for (i=0;i<n;i++)
    {
        fprintf(fp,"%d %s %d %d %d %d %d\n",a[i].id,a[i].name,a[i].baseGz,a[i].bt,a[i].jiangjin,a[i].shuidian,a[i].fangzu);
    }
    fclose(fp);
    printf("文件保存成功\n");
    system("pause");
}
int main()
{
    struct Employee a[MAXNMB];  //保存所有员工数据
    int nmbReal = 0;//实际员工数量
    int opt =0;
    int bgo = 1;
    //从文件中读取数据到结构体数组a,nmbReal是实际读取的员工信息个数
    ReadFile("file.txt",a,&nmbReal); 
    while(bgo)
    {
        system("cls");
        printf("---------------员工管理系统---------------\n");
        printf("|   1.查询员工信息                       |\n");
        printf("|   2.添加新员工                         |\n");
        printf("|   3.删除员工                           |\n");
        printf("|   4.求实发工资                         |\n");
        printf("|   5.根据实发工资排名                   |\n");
        printf("|   0.退出系统                           |\n");
        printf("------------------------------------------\n");
        scanf("%d",&opt);
        switch(opt)
        {
        case 1:
            Find(a,nmbReal);//查询员工信息
            break;
        case 2:
            Insert(a,&nmbReal);//添加新员工
            break;
        case 3:
            Dele(a,&nmbReal);//删除员工
            break;
        case 4:
            Real(a,nmbReal);//计算每个员工的实发工资
            break;
        case 5:
            SortByReal(a,nmbReal);//根据实发工资排名
            break;
        case 0:
            bgo = 0; //退出程序
            WriteFile("file2.txt",a,nmbReal);//退出前保存文件,如果需要保存到原文件,把文件名修改为file.txt
            break;
        default:
            system("cls");
            printf("输入错误,没有该操作!!"); //没有对应的操作选项,提示输入错误
            system("pause");
            break;
        }
    }
}

晚上可以写,白天时间不够,应该百度一下找个相似的改改就行了

还要删除和添加信息后要保存数据到文件