|
6鱼币
#include <stdio.h>
#include <stdlib.h>
#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;
//从文件fileName表示的二进制文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char *fileName, STUDENT stud[])
{
/*************Begin***************/
/*************End*****************/
}
//向文件fileName表示的二进制文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[],int n,int m)
{
/*************Begin***************/
/*************End*****************/
}
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个结构体数据单元中。
每个学生的信息包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次。
本帖最后由 jackz007 于 2020-12-6 13:24 编辑
代码分为两个文件,分别对应两个程序,一个是 "save.c" 专门录入数据,另一个是 "load.c" 专门用来显示结果。两份代码除了 main() 不一样外,其它部分一模一样。
"save.c"#include <stdio.h>
#include <stdlib.h>
#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;
void swap(int * a , int * b)
{
int t ;
t = * a ;
* a = * b ;
* b = t ;
}
//从文件fileName表示的文本文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char * fileName , STUDENT stud[])
{
/***********Begin*****************/
FILE * fp ;
int m , n ;
if((fp = fopen(fileName , "rb")) != NULL) {
fread(& m , sizeof(int) , 1 , fp) ;
fread(& n , sizeof(int) , 1 , fp) ;
fread(stud , sizeof(STUDENT) , m , fp) ;
fclose(fp) ;
} else {
fprintf(stderr , "\n") ;
fprintf(stderr , "无法打开输入文件[%s]\n" , fileName) ;
fprintf(stderr , "\n") ;
}
/***********End*******************/
}
//向文件fileName表示的文本文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[] , int n , int m)
{
/***********Begin*****************/
FILE * fp ;
if((fp = fopen(fileName , "wb")) != NULL) {
fwrite(& m , sizeof(int) , 1 , fp) ;
fwrite(& n , sizeof(int) , 1 , fp) ;
fwrite(stud , sizeof(STUDENT) , m , fp) ;
fclose(fp) ;
} else {
fprintf(stderr , "\n") ;
fprintf(stderr , "无法打开输入文件[%s]\n" , fileName) ;
fprintf(stderr , "\n") ;
}
/***********End*******************/
}
main(void)
{
STUDENT d[50] ;
int m , n , j , k , rank ;
printf("请输入人数和课程门数 : ") ;
scanf("%d%d" , & m , & n) ;
for(k = 0 ; k < m ; k ++) {
printf("学号: ") ;
scanf("%d" , & d[k] . studentID) ;
printf("姓名: ") ;
scanf("%s" , & d[k] . studentName) ;
printf("性别: ") ;
scanf("%s" , & d[k] . sex) ;
printf("生日(yy mm dd): ") ;
scanf("%d%d%d" , & d[k] . birthday . year , & d[k] . birthday . month , & d[k] . birthday . day) ;
printf("%d 门课程的成绩 : " , n) ;
for(d[k] . total = 0 , j = 0 ; j < n ; j ++) {
scanf("%f" , & d[k] . score[j]) ;
d[k] . total += d[k] . score[j] ;
}
d[k] . average = d[k] . total / n ;
d[k] . rank = 0 ;
}
SaveResult("student.dat" , d , n , m) ;
}
"load.c"#include <stdio.h>
#include <stdlib.h>
#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;
void swap(int * a , int * b)
{
int t ;
t = * a ;
* a = * b ;
* b = t ;
}
//从文件fileName表示的文本文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char * fileName , STUDENT stud[] , int * n , int * m)
{
/***********Begin*****************/
FILE * fp ;
if((fp = fopen(fileName , "rb")) != NULL) {
fread(m , sizeof(int) , 1 , fp) ;
fread(n , sizeof(int) , 1 , fp) ;
fread(stud , sizeof(STUDENT) , * m , fp) ;
fclose(fp) ;
} else {
fprintf(stderr , "\n") ;
fprintf(stderr , "无法打开输入文件[%s]\n" , fileName) ;
fprintf(stderr , "\n") ;
}
/***********End*******************/
}
//向文件fileName表示的文本文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[] , int n , int m)
{
/***********Begin*****************/
FILE * fp ;
if((fp = fopen(fileName , "wb")) != NULL) {
fwrite(& m , sizeof(int) , 1 , fp) ;
fwrite(& n , sizeof(int) , 1 , fp) ;
fwrite(stud , sizeof(STUDENT) , m , fp) ;
fclose(fp) ;
} else {
fprintf(stderr , "\n") ;
fprintf(stderr , "无法打开输入文件[%s]\n" , fileName) ;
fprintf(stderr , "\n") ;
}
/***********End*******************/
}
main(void)
{
STUDENT d[50] ;
int i , j , k , m , n , e[50] ;
ReadStudInfo("student.dat" , d , & n , & m) ;
for(k = 0 ; k < m ; k ++) e[k] = k ;
for(i = 0 ; i < m - 1 ; i ++) {
for(j = i + 1 ; j < m ; j ++) {
if(d[e[i]] . total < d[e[j]] . total) swap(& e[i] , & e[j]) ;
}
}
for(k = 0 ; k < m ; k ++) d[e[k]] . rank = k + 1 ;
for(k = 0 ; k < m ; k ++) {
printf("%d" , d[e[k]] . studentID) ;
printf(" %s" , d[e[k]] . studentName) ;
printf(" %s" , d[e[k]] . sex) ;
printf(" %4d-%02d-%02d" , d[e[k]] . birthday . year , d[e[k]] . birthday . month , d[e[k]] . birthday . day) ;
printf(" %.0f" , d[e[k]] . score[0]) ;
for(j = 1 ; j < n ; j ++) printf(" %.0f" , d[e[k]] . score[j]) ;
printf(" %.0f %.0f %d\n" , d[e[k]] . total , d[e[k]] . average , d[e[k]] . rank) ;
}
}
注意,题目中 ReadStudInfo() 的定义存在严重缺陷: void ReadStudInfo(const char * fileName , STUDENT stud[])
因为学生人数和功课门数只能通过读文件内容才能获取,如果没有这两项关键数据,读出来的文件内容也无法处理,在函数定义中,并没有为传递这两项参数提供通道。所以,我把这个函数的定义修改成了: void ReadStudInfo(const char * fileName , STUDENT stud[] , int * n , int * m)
这里要强调的是,这个修改是必须的!
编译、运行实况 I:\00.2020\[00.00].Exercise\00.C\链表文件>g++ -o load load.c
I:\00.2020\[00.00].Exercise\00.C\链表文件>load
20183004 任盈盈 女 2000-03-25 78 95 87 90 350 88 1
20183005 王仪琳 女 1999-08-01 92 83 72 92 339 85 2
20183002 林平之 男 2000-10-25 78 92 88 78 336 84 3
20183001 令狐冲 男 1999-09-01 90 83 72 82 327 82 4
20183003 岳灵珊 女 2001-12-01 89 72 98 66 325 81 5
I:\00.2020\[00.00].Exercise\00.C\链表文件>
|
最佳答案
查看完整内容
代码分为两个文件,分别对应两个程序,一个是 "save.c" 专门录入数据,另一个是 "load.c" 专门用来显示结果。两份代码除了 main() 不一样外,其它部分一模一样。
"save.c"
"load.c"
注意,题目中 ReadStudInfo() 的定义存在严重缺陷:
因为学生人数和功课门数只能通过读文件内容才能获取,如果没有这两项关键数据,读出来的文件内容也无法处理,在函数定义中,并没有为传递这两项参数提供通道 ...
|