#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define SCORES 5
#define S 3
typedef struct {
int num;
char *name;
char sex[2];
float score[SCORES];
float total;
} STU;
//输入n个学生的信息
void initInfo(STU * st,int n);
//保存n个学生文件
void saveAsFile(STU * st,int n);
//根据4门功课分数排序
void sortByScore(STU * st,int n);
//读取文件
void readFile(STU * st,int n);
int main(){
STU ps[S];
initInfo(ps,S);
sortByScore(ps,S);
saveAsFile(ps,S);
readFile(ps,S);
return 0;
}
void initInfo(STU * p,int n){
int i,j;
for(i=0;i<n;i++){
char tmp[10];
int len;
printf("\n---- 请输入第%d个学生的信息-------",i+1);
printf("\n请输入编号:");
if((scanf("%d",&((p+i)->num)))!=1)
return;
printf("\n请输入姓名:");
if(scanf("%s",tmp)==1){
len=strlen(tmp);
(p+i)->name=(char *)malloc(len+1);
strcpy((p+i)->name,tmp);
}else{
return;
}
printf("\n请输入性别:");
if(scanf("%s",(p+i)->sex)!=1)
{
free((p+i)->name);//函数return终止释放name
return;
}
printf("\n请输入5门功课分数:\n");
//memset((p+i)->score,0,sizeof(int)*SCORES);
for(j=0;j<SCORES;j++){
if(scanf("%f",(p+i)->score+j)!=1){
break;
}else{
(p+i)->total+=(p+i)->score[j];
}
}
//对于未输入的赋值0
for(;j<SCORES;j++)
(p+i)->score[j]=0;
}
}
//根据学生分数排序
void sortByScore(STU * pst, int n){
int i,j;
STU st;
for(i=0;i<n;i++){
for(j=0;j<n-i-1;j++){
if((pst+j)->total>(pst+j+1)->total){
st=*(pst+j);
*(pst+j)=*(pst+j+1);
*(pst+j+1)=st;
}
}
}
}
//保存n个学生的信息至students文件
void saveAsFile(STU * pst,int n){
FILE *f;
int i;
if((f=fopen("students","wb"))==NULL){
printf("cannt opent file.");
exit(0);
}
printf("-----------开始写入文件-----------------\n");
for(i=0;i<n;i++)
if(fwrite(pst+i,sizeof(STU),1,f)!=1)
printf("file write error");
printf("-----------写入文件成功-----------------\n");
fclose(f);
}
//从students文件读取信息并打印
void readFile(STU * pst,int n){
int i,j;
FILE *f;
if((f=fopen("students","rb"))==NULL){
printf("cannt opent file.");
exit(0);
}
printf("-----------开始读取文件-----------------\n");
for(i=0;i<n;i++){
fread(pst+i,sizeof(STU),1,f);
printf("%4d %5s %2s",(pst+i)->num,(pst+i)->name,(pst+i)->sex);
for(j=0;j<SCORES;j++)
printf(" %3.1f ",(pst+i)->score[j]);
printf(" %4.1f ",(pst+i)->total);
printf("\n");
}
printf("-----------读取文件结束-----------------\n");
fclose(f);
}