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

应用背景:某公司的员工信息保存在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;

定义员工信息的结构体:

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;
}

仅供参考,望采纳。

这个不是很难,我现在写一下


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<malloc.h> 

using namespace std;

// 函数结果状态代码 
#define TRUE 1
#define FALSE 0
#define OK    1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;  //Status是函数的类型,其值是函数结果状态代码,如OK等

//———————线性表的动态分配顺序存储结构————————//

#define LIST_INIT_SIZE 20 //线性表存储空间的初始分配量
#define LIST_ADD_SIZE  10  //线性表存储空间的分配增量

typedef struct
{
    char id[10];    /* 职工号 */
    char name[20];    /* 职工姓名 */
    char department[20];    /* 所在部门 */
    float salary;    /* 职工工资 */
    char postion[20];    /* 职位 */
}ElemType;

typedef struct
{
    ElemType *elem;    //存储空间基址
    int length;        //当前表长度(当前表中元素个数)
    int listsize;      //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

Status SqList_Init(SqList &L)   //初始化,构造一个新的线性表L
{
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L.elem)  exit(OVERFLOW);  //存储内存分配失败
    L.length = 0;                  //空表长度为0
    L.listsize = LIST_INIT_SIZE;   //初始化存储容量
    return OK;
}

int ListLength(SqList L)  //返回L中数据元素个数
{
    return L.length;
}

//返回表中第i个元素的值
ElemType GetElem(SqList L, int i)
{
    if (i<1 || i>L.length)   exit(ERROR);   //i值不合法
    return L.elem[i - 1];
}

//在表尾插入新的元素 
Status SqList_Insert(SqList &L, ElemType e)
{
    ElemType *p, *q, *newbase = NULL;
    if (L.length >= L.listsize)  //当前内存已满,增加内存,重新分配
    {
        newbase = (ElemType *)realloc(L.elem, (L.listsize + LIST_ADD_SIZE) * sizeof(ElemType));
        if (!newbase)  exit(OVERFLOW);  //存储内存分配失败
        L.elem = newbase;               //新基址
        L.listsize += LIST_ADD_SIZE;    //存储容量增加
    }
    int i = L.length + 1;
    q = &(L.elem[i - 1]);     //q为插入位置
    for (p = &(L.elem[L.length - 1]); p >= q; --p)    *(p + 1) = *p;
    //插入位置及之后的元素右移
    *q = e;      //插入e到第i个元素的位置
    ++L.length;  //表长加一
    return OK;
}

//在顺序线性表中删除第i个元素
Status SqList_Delete(SqList &L, int i)
{
    
    //i的合法值为 1<= i <=L.length
    ElemType *p, *q;
    if (i < 1 || i > L.length)  return ERROR;  //i值不合法         
    p = &L.elem[i - 1];                        //p为被删除元素的位置
    q = L.elem + L.length - 1;                 //表尾元素的位置
    for (; p <= q; ++p)  *(p - 1) = *p;        //被删除元素之后的元素左移
    --L.length;
    return OK;
}

// 比较是否是同一人(id号是否相等)
Status Equal(ElemType a, ElemType b)
{
    if (!strcmp(a.id,b.id))  return TRUE;
    else return FALSE;
}

//在L中查找第一个值与e满足compare关系的元素,返回它在表中的下标 
int SqList_LocateElem(SqList L, ElemType e,
    Status(*compare)(ElemType, ElemType))  //形参compare()是函数型指针
    
{
    int i = 1;    //i的初值为第一个元素的位序
    ElemType *p;  //p的初值为第一个元素的存储位置
    p = L.elem;
    while (i <= L.length && !(*compare)(*p++, e))  ++i;
    if (i <= L.length)   return i;  //若找到,则返回其在L中的位序,否则返回0
    else  return 0;
}

// 获取输入的员工信息 
ElemType GetEmpInfomation()
{
    ElemType e; 
    printf("请输入职工号:");
    scanf("%s",&(e.id));
    printf("请输入职工姓名:");
    scanf("%s", &(e.name));
    printf("请输入职位:");
    scanf("%s", &(e.postion));
    printf("请输入部门:");
    scanf("%s", &(e.department));
    printf("请输入薪资:");
    scanf("%f", &(e.salary));
    printf("\n"); 
    return e;
} 

// 插入新的员工信息
void AddEmpToList(SqList &L)
{
    ElemType e = GetEmpInfomation();
    int res = SqList_LocateElem(L, e, Equal);
    if(res == 0)//此员工信息未存在 
    {
        SqList_Insert(L, e);
        printf("添加成功!是否继续添加?1:是;0:否\n");
        int c = -1;
        scanf("%d",&c);
        if(c == 1){
            AddEmpToList(L);
        }else if(c == 0){
            printf("\n");
            return;
        }else{
            printf("非法输入,请重新操作!\n\n");
            return;
        }
    }else{//此员工信息已存在 
        printf("此编号员工信息已存在,请勿重复操作!\n\n"); 
        return;
    } 
    
} 

// 显示某员工信息
void showEmpInfo(SqList L)
{
    printf("\n请输入要查看的员工编号:");
    char id[10];
    scanf("%s",id);
    ElemType e;
    strcpy(e.id,id);
    int res = SqList_LocateElem(L, e, Equal);
    if(res != 0){
        e = GetElem(L, res);
        printf("职工号\t姓名\t部门\t职位\t薪资\n");
        printf("%s\t%s\t%s\t%s\t%.2f\n\n", e.id, e.name, e.department, e.postion, e.salary);
    }else{
        printf("此员工不存在!\n\n");
    }
} 

// 删除某员工信息
void DeleteEmp(SqList &L)
{
    if(L.length == 0){
        printf("当前无员工信息,请先选择添加员工信息操作!\n");
        return;
    } 
    printf("请输入要删除的员工编号:");
    char id[10];
    scanf("%s",id);
    ElemType e;
    strcpy(e.id,id);
    int res = SqList_LocateElem(L, e, Equal);
    if(res != 0){
        printf("确定要删除吗?确定:1; 放弃:0\n");
        int c;
        scanf("%d",&c); 
        if(c == 1){
            SqList_Delete(L, res + 1);//第i+1各=个元素的下表是i 
            printf("删除成功!\n\n");
        }else{
            printf("此操作已取消!\n\n");
        }        
    }else{
        printf("此员工不存在!\n\n");
    }
} 
 
//打印员工信息表 
void Print(SqList L)
{
    printf("\n职工号\t姓名\t部门\t职位\t薪资\n");
    ElemType p;
    for (int i = 0; i < L.length; i++)
    {
        p = L.elem[i];
        printf("%s\t%s\t%s\t%s\t%.2f\n", p.id, p.name, p.department, p.postion, p.salary);
    }
    printf("\n\n");
}

// 主菜单 
void menu(SqList &L)
{
    bool flag = true;
    while(flag)
    {
        flag = true;
     printf("======================================================\n"); 
        printf("\t\t欢迎进入公司职工信息管理系统\n"); 
     printf("======================================================\n"); 
        printf("\t\t1.增加职工信息\n"); 
        printf("\t\t2.查找职工信息\n"); 
        printf("\t\t3.显示所有职工信息\n"); 
        printf("\t\t4.删除职工信息\n"); 
        printf("\t\t5.退出\n"); 
        printf("======================================================\n"); 
        printf("请选择1-5:"); 
        int c;
        scanf("%d",&c);
        switch(c)
        {
            case 1: AddEmpToList(L);break;
            case 2: showEmpInfo(L);break;
            case 3: Print(L);break;
            case 4: DeleteEmp(L);break;
            case 5: flag = false; printf("\n您已退出!\n");break;
            default: printf("输入不合法!\n\n");break;
        }
    } 
}

int main()
{
    SqList L;  //定义SqList型结构L
    SqList_Init(L);  //初始化L

    menu(L);
    
    system("pause");
}