成绩排名
假设每个班的同学人数最多不超过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); } }