首页 > 试题广场 >

有一个文件emp.dat存放职工数据 。每个职工的数据包括:

[问答题]
有一个文件emp.dat存放职工数据 。每个职工的数据包括:职工号、姓名、性别、年龄和工资(假设没有重复的职工号)。编写实现如下功能的程序,每个程序可以单独运行。
(1)根据用户的输入建立emp.dat文件。
(2)在emp.dat文件末尾追加职工记录。
(3)在用户指定的记录号之前插入一个新纪录。要求输出插入前、后的所有职工记录。
(4)根据用户输入的职工号和相应的数据修改该职工的数据,并输出修改后的所有职工记录。
(5)根据用户输入的职工号删除该职工的数据,并输出删除前、后的所有职工记录。
(6)根据用户输入的工资数显示大于该工资数的职工的所有信息。
推荐
设计一个emp.h头文件用于存放职工结构体。代码如下:
typedef struct            /*职工数据结构体*/
{   char no[5];        /*职工号*/
    char name[8];      /*姓名*/
    char sex[3];      /*性别*/
    int age;        /*年龄*/
    int salar;          /*工资*/
} Employee;

(1)定义一个结构体变量emp用于存放职工记录,在获得用户输入的职工记录后,采用块写入函数fwrite()将其写入到emp.dat文件中。prog1.c程序如下:
#include <stdio.h>
#include "emp.h"
void main()
{
    FILE * fp;
    int n,i;
    Employee emp;        /*职工结构体变量 emp*/
    if ((fp=fopen('emp.dat","wb"))==NULL)
    {    printf("不能建立emp.dat文件\n");
       return;
    }
    printf("职工人数");
    scanf("%d",&n);
    printf("输入格式:职工号 姓名 性别 年龄 工资<Enter>\n");
    for (i=0;i<n;i++ )        /*循环获取n个职工记录*/
    {    printf("第%d个职工:",i+1);
       scanf("%s%s%s%d%d",emp.no,emp.name,emp.sex,&emp.age,&emp.salar);
       fwrite(&emp,sizeof(Employee),1,fp);
    }
    fclose(fp);
}
(2)定义一个结构体变量emp用于存放职工记录,在获得用户输入的职工记录后,采用块写入函数fwrite()将该记录写入到emp.dat文件中。prog2.c程序如下:
#include <stdio.h>
#include "emp.h"
void main()
{
    FILE * fp;
    Employee emp;
    if ((fp=fopen("emp.dat","ab+ "))=NULL)
    {    printf("不能打开emp.dat文件\n");
       return;
    }
    printf("输入格式:职工号 姓名 性别 年龄 工资<Enter>\n");
    printf("职工记录");
    scanf("%s%s%s%d%d",emp.np,emp.name,emp.sex,&emp.age,&emp.salar);
        /*获取一个职工记录*/
    fwrite(&emp,sizeof(Employee),1,fp);    /*将该职工记录写入文件*/
    fclose(fp);
}
(3)由于C未提供插入文件数据的函数,故先将emp.dat文件中的所有记录读到结构体数组emp***有n个记录),输入在第i行(序号从1开始)个记录之前要插入的新职工记录。然后重建emp.dat文件,将emp[0..i-2]个记录写入这个文件中,再写入这个输入的记录,最后写入emp[i-1..n-1]数组余下的记录。prog3.c程序如下:
#include <stdio.h>
#include "emp.h"
#define NUM 100
void main()
{
    int n,i,j;
    FILE * fp;
    Employee  emp[NUM],newemp;
    if ((fp=fopen("emp.dat","rb"))==NULL)
    {    printf("不能打开emp.dat文件\n");
       return;
    }
    printf("插入前:\n);        /*显示插入前所有记录*/
    printf("记录号 职工号        姓名 性别 年龄 工资\n");
    for (n=0;fread(&emp[n],sizeof(Employee),1,fp);n++ )
        printf("%6d%6s%9s%4s%5d%6d\n",n+1,emp[n].no,emp[n].name,emp[n].sex,emp[n].age,emp[n].salar);
    printf("第i个记录之前插入:")'
    scanf("%d",&i);
    if (i>n)                /n为职工个数*/
    {    printf("\n输入的j值太大了\n");
        exit(2);
    }
    printf("输入格式:职工号 姓名 性别 年龄 工资<Enter>\n");
    printf("第%d个记录:",i);
    scanf("%s%s%s%d%d",newemp.no,newemp.name,newemp.sex,&newemp.age,&newemp.salar);
    fclose(fp);
    fp=fopen("emp.dat","wb+ ")        /*重新***并清除原内容*/
    for (j=0;j<i-1;j++ )
        fwrite(&emp[j],sizeof(Employee),1,fp);
    fwrite(&newemp,sizeof(Employee),1,p);
    for (j=i-1;i<n;j++ )
        fwrite(&emp[j],sizeof(Employee),1,fp);
    printf("插入后:\n");        /*显示插入后的所有记录*/
    rewind(fp);
    for (i=0;fread(&emp[i],sizeof(Employee),1,fp)!=0;i++ )
        printf("%6d%6s%9s%4s%5d%6d\n",i+1,emp[i].no,emp[i].name,emp[i].sex,emp[i].age,emp[i].salar);
    fclose(fp);
}
(4)输入要修改的职工号和对应的职工记录,使用fseek()函数指向原记录开头,采用fwrite()函数写入新职工记录,则覆盖原来的记录,达到修改的目的。prog4.c程序如下:
#include <stdio.h>
#include "emp.h"
void main()
{
    int i,j;
    FILE * fp;
    Employee emp,newemp;
    char num[5];
   if ((fp=fopen("emp.dat","rb+ "))==NULL)
    {    printf("不能打开emp.dat文件\n");
       return;
    }
    printf("要修改的职工号:");
    scanf("%d",num);
    for (i=0;fresd(&emp,sizeof(Employee),1,fp);i++ )
        if (!strcmp(emp.no,num)) break;
    if (feof(fp))
    {    printf("\t没有%s职工号的职工\n",num);
       exit(2);
    }
    printf("记录号 职工号        姓名 性别 年龄 工资\n");
    printf("第%d个记录:",i+1);
    scanf("%s%s%s%d%d",newemp.no,newemp.name,newemp.sex,&newemp.age,&newemp.salar);     /*获取新的职工记录*/
    fseek(fp,- (long)sizeof(Employee),SEEK_CUR);    /*文件指针指向该修改的记录开头*/
    fwrite(&newemp,sizeof(Employee),1,fp);        /*用newemp覆盖当前记录*/
    printf("修改后:\n");
    fseek(fp,0,SEEK_SET);    /*显示修改后的文件数据*/
   printf("记录号 职工号        姓名 性别 年龄 工资\n");
    for (i=0;fread(&emp,sizeof(Employee),1,fp)!=0;i++ )
      printf("%6d%6s%9s%4s%5d%6d\n",i+1,emp.no,emp.name,emp.sex,emp.age,emp.salar);
    fclose(fp);
}
(5)先将emp.dat文件中的职工记录读到emp数组***有n个记录),根据用户输入的职工号查找职工记录号i;重建emp.dat文件,将emp[0..i-1]和emp[i+1..n-1]的职工记录写入该文件。prog5.c程序如下:
#include <stdio.h>
#include "emp.h"
#define NUM 100
void main()
{
    int i,j,n;
    FILE * fp;
    Employee emp[NUM];
    char num[5];
   if ((fp=fopen("emp.dat","rb+ "))==NULL)
   {    printf("不能打开emp.dat文件\n");
        return;
    }
    printf("删除前:\n");        /*显示删除前的所有记录*/
    printf("记录号 职工号        姓名 性别 年龄 工资\n");
   for (n=0;fread(&emp[n],sizeof(Employee),1,fp);n++ )
       printf("%6d%6s%9s%4s%5d%6d\n",n+1,emp[n].no,emp[n].name,emp[n].sex,emp[n].age,emp[n].salar);
    printf"要删除的职工号:");
    scanf("%s",num);
    for (i=0;(strcmp(emp[i].no,num)!=0 && i<n);i++ );        /*查找职工记录*/
    if (i>=n)            /*n为emp.dat文件中记录数*/
    {    printf("\t没有%s职工号的职工\n",num);
       return:
    }
    fclose(fp);
    fp=fopen("emp.dat","w+ ");        /*重建emp.dat文件*/
    if (n==1)     /*若原来只有一个记录,则立即关闭文件表示删除原来全部内容*/
    {    fclose(fp);
       return;
    }
    for (j=0;j<i;j++ )
        fwrite(&emp[j],sizeof(Employee),1,fp);
    for (j=i+1;j<n;j++ )
        fwrite(&emp[j],sizeof(Employee),1,fp);
    printf("删除后:\n");        /*显示删除后的文件数据*/
    fseek(fp,0,SEEK_SET);
   printf("记录号 职工号        姓名 性别 年龄 工资\n");
   for (i=0;fread(&emp[i],sizeof(Employee),1,fp);i++ )
        printf("%6d%6s%9s%4s%5d%6d\n",i+1,emp[i].no,emp[i].name,emp[i].sex,emp[i].age,emp[i].salar);
    fclose(fp);
}
(6)打开emp.dat文件,采用for循环语句,用fread()函数读取一个职工记录,若其工资数大于用户输入的工资数,则显示它。prog6.c程序如下:
#include <stdio.h>
#include "emp.h"
void main()
{
    int n;num;
    FILE * fp;
    Employee emp;
    if ((fp=fopen("emp.dat","rb"))==NULL)
   {    printf("不能打开emp.dat文件\n");
        return;
    }
    printf("工资数:");
    scanf("%d",&num);
   printf("记录号 职工号        姓名 性别 年龄 工资\n");
   for (i=0;fread(&emp[i],sizeof(Employee),1,fp);i++ )
       if (emp.salar>=num)
            printf("%6d%6s%9s%4s%5d%6d\n",n+1,emp.no,emp.name,emp.sex,emp.age,emp.salar);
    fclose(fp);
}

发表于 2018-05-07 21:17:22 回复(0)