陳Sir不是阿Sir 2022-12-30 14:57 采纳率: 66.7%
浏览 57
已结题

以数据调用为基础的综合性问题

应用背景:某公司的员工信息保存在data.txt文件中,可以随时根据关键信息查询,一段时间后需要对已离职的员工进行统计,将离职员工的信息归档。

程序功能:程序读取data.txt文件中所有信息,根据指定信息查找员工,按员工编号顺序输出所有相关纪录;将已离职的员工信息保存在achieve.txt文件中。

(1) 设计 readfile 函数(说明如下),函数从文件名为filename字符串的文件中读取所有员工信息,保存到staff结构体数组中,返回员工的人数。

函数声明:int readfile(char *filename, Staff staff[]);

参数说明:filename为文件名,staff[]为员工信息结构体数组。

返回值:函数返回读入的员工人数,文件打开失败时返回-1。

(2) 设计 search 函数(说明如下),查找构体数组a中岗位编号为B的员工,统计人数显示在屏幕上,然后按员工编号升序排序输出在屏幕上。

函数声明:void search(Staff a[], int n);

参数说明:a[]为员工信息结构体数组, n为结构体数组a[]的元素个数。

(3) 设计 achieve 函数 (说明如下),将数组a中离职的员工信息添加到achieve.txt文件中,并在屏幕上显示离职员工人数。

函数声明:int achieve(Staff a[], int n);

参数说明:a[]为员工信息结构体数组,n为结构体数组a[]的元素个数。

返回值:函数返回离职的员工人数,文件写入失败时返回-2。

(4) 修改main()函数,通过调用函数方式,实现程序功能。

提供的源程序部分代码:

#define MAX_Staff_NUM 1000 //最大员工人数

struct stStaff

{

char id[5];        //员工编号

char gender;    //性别

char role;        //岗位编号

char dim;        //是否离职,y表示已经离职,

};

typedef struct stStaff Staff;

int main(void)

{

int n;  //员工数量

char filename[] = "data.txt";   //保存员工信息的文件名字符串

Staff staff[MAX_Staff_NUM];     //员工列表结构体数组

n =readfile(filename, staff);

search(staff, n);

printf("离职员工人数为:%d\n", achieve(staff, n));

return 0;
  • 写回答

3条回答 默认 最新

  • |__WhoAmI__| 2022-12-30 15:05
    关注

    定义员工信息的结构体:

    struct Staff {
      int id;
      char name[32];
      int position;
      int status;  // 1表示在职,0表示离职
    };
    

    实现 readfile 函数:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_STAFF 1000  // 员工信息的最大数量
    
    int readfile(char *filename, struct Staff staff[]) {
      FILE *fp = fopen(filename, "r");  // 以只读方式打开文件
      if (fp == NULL) return -1;  // 打开文件失败
    
      int count = 0;
      while (fscanf(fp, "%d %s %d %d", &staff[count].id, staff[count].name, &staff[count].position, &staff[count].status) == 4) {
        count++;
      }
    
      fclose(fp);  // 关闭文件
      return count;  // 返回员工数量
    }
    

    实现 search 函数:

    #include <stdio.h>
    #include <stdlib.h>
    
    void search(struct Staff a[], int n) {
      int position;
      printf("请输入岗位编号:");
      scanf("%d", &position);
    
      int count = 0;
      for (int i = 0; i < n; i++) {
        if (a[i].position == position) {
          count++;
        }
      }
      printf("岗位编号为%d的员工有%d人\n", position, count);
    
      // 对满足条件的员工进行排序
      for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
          if (a[i].id > a[j].id) {
            struct Staff temp = a[i];
            a[i] = a[j];
            a[j] = temp;
          }
        }
      }
    
      // 输出满足条件的员工信息
      for (int i = 0; i < n; i++) {
        if (a[i].position == position) {
          printf("员工编号:%d,员工姓名:%s,岗位编号:%d,状态:%d\n", a[i].id, a[i].name, a[i].position, a[i].status);
        }
      }
    }
    

    实现 achieve 函数:

    #include <stdio.h>
    
    int achieve(struct Staff a[], int n) {
      FILE *fp = fopen("achieve.txt", "w");  // 以写入方式打开文件
      if (fp == NULL) return -1;  // 打开文件失败
    
      int count = 0;
      for (int i = 0; i < n; i++) {
        if (a[i].status == 0) {
          count++;
          fprintf(fp, "%d %s %d %d\n", a[i].id, a[i].name, a[i].position, a[i].status);
        }
      }
    
      fclose(fp);  // 关闭文件
      return count;  // 返回离职员工数量
    }
    

    main 函数,调用前面实现的函数:

    #include <stdio.h>
    
    int main() {
      struct Staff staff[MAX_STAFF];
      int n = readfile("data.txt", staff);
      if (n < 0) {
        printf("读取文件失败\n");
        return 1;
      }
    
      search(staff, n);
    
      int count = achieve(staff, n);
      if (count < 0) {
        printf("写入文件失败\n");
        return 1;
      }
      printf("已离职的员工有%d人\n", count);
    
      return 0;
    }
    

    仅供参考,望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 赞助了问题酬金20元 12月30日
  • 赞助了问题酬金20元 12月30日
  • 展开全部

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)