Nobody really cares if you’re miserable, so you might as well be happy。沒有人真的在意你是不是難過,所以還是歡樂一點吧。
編程要求
本關的編程任務是補全step2/fileBin.c文件中ReadStudInfo函數和SaveResult函數,以實現按數據塊使用FILE結構存取學生信息的功能。具體要求如下:
1.ReadStudInfo函數功能:實現從二進制文件中讀取學生的基本信息。
2.SaveResult函數功能:實現從二進制格式文件中讀取學生的基本信息。
此題實現內容和昨天差不多,但是實現的方式不一樣。傳送門:
http://mp.weixin.qq.com/s?__biz=MzU0MjAwOTU3Mg==&mid=100001420&idx=2&sn=99f6698d68fe30398a9bf8b9a7b7341c&chksm=7b2077074c57fe11a3bcbd9dd1b7dfd105ac4a319ae248b6a78d6f52b7f9b441bb7d2a22efea#rd
測試樣例:
#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;
//聲明外部函數,函數在其它源文件中實現
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; //指向存放學生信息的存儲塊的首地址
//freopen("Input.txt","r",stdin);
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);
//Print(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;
}
void Input(STUDENT *stud, int n,int m)
{
int i;
//freopen("Input.txt","r",stdin);
//scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%ld",&stud[i].studentID);
scanf("%s",stud[i].studentName);
scanf("%s",stud[i].sex);
scanf("%d-%d-%d",&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day);
for(int j=0;j<m;j++)
scanf("%f",&stud[i].score[j]);
stud[i].total = 0;
stud[i].average = 0;
stud[i].rank = 0;
}
}
void Print(STUDENT *stud, int n,int m)
{
printf("%8s%12s%4s%12s%10s%10s%10s%10s%10s%10s%5s\n",
" NO. ","Name","Sex"," Birthday ","Computer","English","Math","Music","Total","Average","Rank");
for(int i=0;i<n;i++)
{
printf("%8ld",stud[i].studentID);
printf("%15s",stud[i].studentName);
printf("%5s",stud[i].sex);
printf("%6d-%02d-%02d",stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day);
for(int j=0;j<m;j++)
{
printf("%10.0f",stud[i].score[j]);
}
printf("%10.0f",stud[i].total);
printf("%10.0f",stud[i].average);
printf("%5d\n",stud[i].rank);
}
}
void TotalAndAverage(STUDENT *stud, int n,int m)
{
for(int i=0;i<n;i++)
{
stud[i].total = 0;
for(int j=0;j<m;j++)
stud[i].total += stud[i].score[j];
stud[i].average = stud[i].total/4;
}
}
void RankByTotal(STUDENT *stud, int n,int m)
{
for(int i=0;i<n-1; i++)
{
int k = i;
for(int j=i+1;j<n;j++)
{
if(stud[j].total>stud[k].total)
{
k = j;
}
}
if(k != i)
{
STUDENT temp = stud[i];
stud[i] = stud[k];
stud[k] = temp;
}
stud[i].rank = i+1;
if(i>0 && stud[i].total == stud[i-1].total)
stud[i].rank = stud[i-1].rank;
}
stud[n-1].rank = n;
if(n-1>0 && stud[n-1].total == stud[n-2].total)
stud[n-1].rank = stud[n-2].rank;
}
void SaveStudInfo(const char *fileName,STUDENT *stud,int n,int m)
{
FILE *fp = fopen(fileName,"w"); //打開二進制文件student.dat用於寫
if(fp == NULL)
{
printf("Failure to open %s!\n",fileName);
exit(0);
}
fwrite(&n,sizeof(n),1,fp);//將n寫入文件
fwrite(&m,sizeof(m),1,fp);//將m寫入文件
fwrite(stud,sizeof(STUDENT),n,fp);
fclose(fp); //關閉文件
}
void ReadResult(const char *fileName,STUDENT *stud)
{
FILE *fp = fopen(fileName,"r"); //打開二進制文件result.dat用於讀
if(fp == NULL)
{
printf("Failure to open %s!\n",fileName);
exit(0);
}
int n,m;
// 讀一個整數(學生人數)
fread(&n,sizeof(n),1,fp);
// 課程數量
fread(&m,sizeof(m),1,fp);
fread(stud,sizeof(STUDENT),n,fp);
fclose(fp);//關閉文件
}
//從文件fileName表示的二進制文件中讀取學生基本信息,
//包括學號、姓名、性別、出生日期,若干門課程的成績
//文件的第一行存儲的信息包含了n和m,即學生的人數和課程門數
void ReadStudInfo(const char *fileName, STUDENT stud[])
{
/*************Begin***************/
FILE *fp = fopen(fileName,"r");
if(fp == NULL)
{
printf("Failure to open %s!\n",fileName);
exit(0);
}
int n,m;
fread(&n,sizeof(n),1,fp);
fread(&m,sizeof(m),1,fp);
fread(stud,sizeof(STUDENT),n,fp);
fclose(fp);
/*************End*****************/
}
//向文件fileName表示的二進制文件中寫入學生基本信息,
//包括學號、姓名、性別、出生日期,若干門課程的成績、總分、平均分、名次
//文件的第一行存儲的信息應該包括n和m,即學生的人數和課程門數
void SaveResult(const char *fileName, STUDENT stud[],int n,int m)
{
FILE *fp = fopen(fileName,"w");
if(fp == NULL)
{
printf("Failure to open %s!\n",fileName);
exit(0);
}
fwrite(&n,sizeof(n),1,fp);
fwrite(&m,sizeof(m),1,fp);
fwrite(stud,sizeof(STUDENT),n,fp);
fclose(fp);
}
運行結果:
最後的話:刷題要找自己的不足,然後去專攻。