任务描述
本关任务与上一关任务相似。
相关知识(略)
编程要求
本关的编程任务是补全step2/fileBin.c
文件中ReadStudInfo
函数和SaveResult
函数,以实现按数据块使用FILE结构存取学生信息的功能。具体要求如下:
1.ReadStudInfo
函数功能:实现从二进制文件中读取学生的基本信息。函数ReadStudInfo
函数原型为:
void ReadStudInfo(const char *fileName, STUDENT stud[]);
其中:
- 参数
fileName
是一个二进制格式的文件,位于当前目录,即与源程序文件在同一文件夹下。文件中首先是以二进制数据形式写入的学生人数(整数n
,不超过30
)和课程数量(整数n
,不超过5
),然后是n
个学生的信息,学生信息在结构STUDENT
中定义:
struct student { long studentID; char studentName[20]; char sex[4]; struct{ int year; int month; int day; }birthday; float score[COURSE_MAXNUM]; float total; float average; int rank; }; typedef struct student STUDENT;
- 文件中存储了 total,average,rank 三项信息,但均为初始值0。
- 函数
ReadStudInfo
的第二个参数stud
存放读取出来的学生信息。
2.SaveResult
函数功能:实现从二进制格式文件中读取学生的基本信息。函数SaveResult
函数原型为:
void SaveResult(const char *fileName, STUDENT stud[],int n,int m);
其中:
- 参数
fileName
是一个二进制格式文件,位于当前目录,即与源程序文件在同一文件夹下。 - 文件中首先要求以二进制形式写入学生人数(整数
n
,不超过30
)和课程数量(整数n
,不超过5
),然后是n
个学生的信息。n
个学生的信息存放在第二个参数stud
开始的n
个结构体数据单元中。 - 每个学生的信息包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次。
测试说明
本关的测试文件是step3/main.c
,其中将会调用你在step3/fileBin.c
文件中完成的ReadStudInfo
函数和SaveResult
函数。除此之后,step3/main.c
中还对学生信息进行了处理:包括计算总分、平均分和名次。其次还实现了输入测试数据、输出测试结果、写入测试文件(student.dat
)、读取测试文件(result.dat
):
1.调用函数Input()
将标准输入的数据读入内存,然后调用SaveStudInfo()
函数将数据再写入到student.dat
文本文件,以便为**ReadStudInfo()
**函数从文本文件读取学生信息准备测试数据。
2.调用函数ReadResult()
将SaveResult()
函数保存的result.dat
中的学生信息读入内存,并调用Print()
函数进行输出。**SaveResult()
**函数需要将计算出总分、平均分和名次信息的学生信息存入result.dat
。
3.student.dat
的示例如下:
4.result.dat
的示例如下:
5.step3/main.c
主要代码如下:
#include #include #define COURSE_MAXNUM 5 //声明结构STUDENT struct student { long studentID; char studentName[20]; char sex[4]; struct{ int year; int month; int day; }birthday; float score[COURSE_MAXNUM]; float total; float average; int rank; }; typedef struct student STUDENT; //声明外部函数,函数在其它源文件中实现 extern void ReadStudInfo(const char *fileName, STUDENT stud[]); extern void SaveResult(const char *fileName, STUDENT stud[],int n,int m); //声明本文件中的其它函数 void Input(STUDENT *stud, int n,int m); void Print(STUDENT *stud, int n,int m); void TotalAndAverage(STUDENT *stud, int n,int m); void RankByTotal(STUDENT *stud, int n,int m); void SaveStudInfo(const char *fileName,STUDENT *stud,int n,int m); void ReadResult(const char *fileName,STUDENT *stud); int main() { int n,m; //n用于存放学生人数,m用于存放课程门数。 STUDENT *stud; //指向存放学生信息的存储块的首地址 scanf("%d%d",&n,&m); //输入学生总人数 // 动态分配存储 stud = (STUDENT *)malloc(n*sizeof(STUDENT)); Input(stud,n,m);//输入学生信息 //将测试输入信息写入二进制文件 SaveStudInfo("student.dat",stud,n,m); free(stud); //打开文件student.dat,以二进制文件方式打开用于读 //从文件中读取学生信息到数组stud中 stud = (STUDENT *)malloc(n*sizeof(STUDENT)); ReadStudInfo("student.dat",stud);//位于fileBin.c文件中 // 计算总分 TotalAndAverage(stud,n,m); // 计算排名 RankByTotal(stud,n,m); //打开文件result.dat,以二进制文件方式打开用于写 //将计算出了总分和平均分以及名次的学生信息写入文件 SaveResult("result.dat",stud,n,m);//位于fileBin.c文件中 free(stud); //打开文件result.dat,以二进制文件方式打开用于读 //从文件中读取学生信息到数组stud中,用于测试是否与预期输出一致 stud = (STUDENT *)malloc(n*sizeof(STUDENT)); ReadResult("result.dat",stud); //输出学生信息 Print(stud,n,m); //释放动态申请的存储块 free(stud); return 0; }
平台会对你编写的代码进行测试:
测试样例