周其乐之父 2021-07-06 15:56 采纳率: 75%
浏览 135
已采纳

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

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

  • 写回答

3条回答 默认 最新

  • qfl_sdu 2021-07-06 17:31
    关注

    代码如下

    #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;
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。