成绩排名
假设每个班的同学人数最多不超过10人。每个同学的档案信息包括:学号(最大为10个字符)、姓名(最大为20个字符)、班级(最大为6个字符)、成绩1(float
型)、成绩2(float型)。
有两个磁盘文件class1.txt 和
class2.txt,分别存放两个班同学的学习成绩档案。文件为文本文件,每行存放一位同学的档案信息,各信息项之间用空格间隔。
编写程序,要求实现以下功能:
(1)请从文件中读入两个班同学的档案信息。
(2)将所有的同学,按照平均成绩进行全部排名。排名规则如下:
- 按照平均成绩、成绩1、成绩2的优先顺序进行比较排名。
- 即:平均成绩高的同学排名靠前;如果平均成绩相同,则成绩1高的同学排名靠前。
- 如果各项成绩都相同,则排名也相同。
- 对于同学A,按照上述排序规则,如果有K个同学的排名在其前面,则该同学的总排名则为K+1。
(3)输入一个同学的学号,如果该学号存在,输出该名同学的排名及档案信息;如果该学号不存在,则输出“Error”;输入end,查询结束。
输入格式:读入文件。
键盘依次输入学号200911019,200910105,200911005,200911002,最后输入end。
输出格式要求:
输出查询结果,每行输出一个同学的信息,依次为名次,学号,姓名,班级,平均成绩,成绩1,成绩2,各数据项之间用一个逗号“,”隔开。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{
int round;
char snum[10];
char name[20];
char cla[6];
float mark1;
float mark2;
float mid;
};
int read(char filename1[12],char filename2[12],struct student class1[20])
{
FILE *fp;
int i=0;
fp=fopen(filename1,"r");
if (fp==NULL)
{
printf("cannot open file\n");
exit(0);
}
while (!feof(fp))
{
fscanf(fp,"%s %s %s %f %f",class1[i].snum,class1[i].name,class1[i].cla,&class1[i].mark1,&class1[i].mark2);
i=i+1;
}
fclose(fp);
fp=fopen(filename2,"r");
if (fp==NULL)
{
printf("cannot open file\n");
exit(0);
}
while (!feof(fp))
{
fscanf(fp,"%s %s %s %f %f",class1[i].snum,class1[i].name,class1[i].cla,&class1[i].mark1,&class1[i].mark2);
i=i+1;
}
return (i);
fclose(fp);
}
void paimin(struct student clas[20],int n)
{
int i,j;
for (i=0;i<n;i++)
clas[i].mid=(clas[i].mark1+clas[i].mark2)/2;
for (i=0;i<n;i++)
clas[i].round=1;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if ((clas[j].mid>clas[i].mid)||(clas[j].mid==clas[i].mid&&clas[j].mark1>clas[i].mark1)||(clas[j].mid==clas[i].mid&&clas[j].mark1==clas[i].mark1&&clas[j].mark2>clas[i].mark2))
clas[i].round=clas[i].round+1;
}
}
}
void search(struct student clas[20],char num[10],int n)
{
int i,t=0;
for (i=0;i<n;i++)
{
if (strcmp(clas[i].snum,num)==0)
{
printf("%d,%s,%s,%s,%f,%f,%f\n",clas[i].round,clas[i].snum,clas[i].name,clas[i].cla,clas[i].mark1,clas[i].mark2,clas[i].mid);
t=1;
}
}
if (t==0)
printf("Error\n");
}
void main()
{
struct student clas[20];
int n;
char file1[12]={'\0'},file2[12]={'\0'},num[10]={'\0'};
printf("请输入读入文件:\n");
scanf("%s %s",file1,file2);
n=read(file1,file2,clas);
paimin(clas,n);
printf("请输入要查找学生的学号(输入End时停止):\n");
scanf("%s",num);
while (strcmp(num,"End")!=0)
{
search(clas,num,n);
printf("请输入要查找学生的学号(输入End时停止):\n");
scanf("%s",num);
}
}
