(求找错误!!)学生成绩排名
【问题描述】在文件marks.in中有N(1<N<2000)行记录,每个记录由4个字段组成,分别是学生姓名、语文成绩、数学成绩和英语成绩,各个字段之间由空格符或制表符‘\t’分隔。
按总成绩降序输出学生的姓名和总成绩。
总成绩相同时按语文成绩降序排序,语文成绩再相同时按数学成绩降序排序。
各科成绩均相同时按输入文件中记录的先后顺序排序。
【输入形式】
从当前路径下的文件marks.in中读入N行记录。
【输出形式】
将排序后的结果输出到标准输出,姓名和总成绩之间以’\t’分隔。
【输入样例】
aaa 98 85 70
bbb 92 94 88
ccc 65 72 68
【输出样例】
bbb 274
aaa 253
ccc 205
程序:
#include<stdio.h>
#include<stdlib.h>
#define N 2002
typedef struct student
{
char name[50];
int yu;
int shu;
int ying;
int sum;
int order;
}student;
int compare(const student *p1,const student *p2);
struct student stu[N]={{"",0,0,0,0}};
main()
{
int i=0,n;
char s[N]="";
FILE *fp;
if((fp=fopen("marks.in","r"))==NULL)
{
printf("cannot find the file");
exit(0);
}
while(fgets(s, N, fp) !=NULL){
sscanf(s,"%s%d%d%d",stu[i].name,&stu[i].yu,&stu[i].shu,&stu[i].ying);
stu[i].sum = stu[i].yu + stu[i].shu + stu[i].ying;
stu[i].order=i;
i++;
}
n=i;
for(i=0;i<n-1;i++)
{
qsort(stu,n,sizeof(student),compare); //sizeof (struct score) or sizeof(student)
printf("%s\t%d\n",stu[i].name,stu[i].sum);
}
printf("%s\t%d",stu[n-1].name,stu[n-1].sum);
fclose(fp);
return 0;
}
int compare(const student *p1,const student *p2)
{
if(p1->sum != p2->sum)
return (p2->sum - p2->sum);
if(p1->yu != p2->yu)
return (p2->yu - p1->yu);
if(p1->shu != p2->shu)
return (p2->shu - p1->shu);
return (p1->order - p2->order);
}