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