/**
Description
给出一个班的成绩情况,请计算平均分,并按平均分进行排名。
输入 第一行是一个整数K,表示样例个数。每个样例的第一行是两个正整数N(N<=40)和M(M<=10),
分别表示班上的人数信息,课程的门数。以后的N行,每行一个字符串和M个整数,
字符串表示学生姓名(字符串不超过10个字符,只含英文字母),M个整数表示M门课的成绩。
输出 每个样例输出一个排名结果,一行为一个学生的成绩信息。包含3个部分的信息,
第一个是一个整数,表示排名,从1开始计数;第二部分是学生的姓名;第三部分是一个浮点数,
表示学生的平均成绩,保留1位小数。排名按平均成绩从高到低排列,如果平均成绩相同,
按姓名的字典序排列,其排名相同,后面的排名依次后推。三者之间用一个空格隔开,行末无空格。
Sample Input
2
4 2
eric 80 90
rose 70 80
john 80 70
jone 60 60
6 2
eric 80 90
rose 70 80
john 80 70
jone 60 60
kebi 80 70
nash 60 60
Sample Output
1 eric 85.0
2 john 75.0
2 rose 75.0
4 jone 60.0
*/
- #include<stdio.h>
- #include<string.h>
- #define MAX1 20
- #define MAX2 50
- typedef struct student student;
- struct student
- {
- char name[MAX1];
- int grade[MAX1];
- double gpa;
- };
- void compareStudents(student students[],int n);
- void sortByName(student students[],int n,int count);
- void printResult(student students[],int n);
- int main()
- {
- int cases,n,m,i,j,sum;//cases个用例、n个学生、m科科目
- student students[MAX2];
- scanf("%d",&cases);
- while(cases--)
- {
- scanf("%d%d",&n,&m);
- //while(getchar() != '\n');
- //输入信息
- for(i=0; i<n; i++)
- {
- sum = 0;
- scanf("%s",students[i].name);
- for(j=0; j<m; j++)
- {
- scanf("%d",&(students[i].grade[j]));
- }
- for(j=0; j<m; j++)
- {
- sum += students[i].grade[j];
- }
- students[i].gpa = (1.0 * sum) / m;
- }
- compareStudents(students,n);
- printResult(students,n);
- }
- return 0;
- }
- //执行排名后输出
- void compareStudents(student students[],int n)
- {
- int i,j,pos;
- student tempStudent;
- double max;
- bool flag;
- //按照平均成绩的降序排序
- for(i=0; i<n-1; i++)
- {
- max = students[i].gpa;
- flag = false;
- for(j=i+1; j<n; j++)
- {
- if(students[j].gpa > max)
- {
- pos = j;
- max = students[j].gpa;
- flag = true;
- }
- }
- if(flag)
- {
- tempStudent = students[i];
- students[i] = students[pos];
- students[pos] = tempStudent;
- }
- }
- //再次遍历students这个数组,找到平均值相等的学生
- //printResult(students,n);
- //printf("------------------\n");
- int count = 1;
- for(i=0; i<n; i++)
- {
- if(students[i].gpa == students[i+1].gpa)
- {
- count++;
- continue;
- }
- else if(count > 1)
- {
- sortByName(students,i,count); //按名字给i之前的count个学生排序 包括i
- count = 1;
- }
- else if(1 == count)
- {
- continue;
- }
- }
- }
- void sortByName(student students[],int n,int count)
- {
- bool flag;
- //printf("%d\n",count);
- int k,j,pos;
- student tempStudent;
- char *pTemp;
- for(k=n; k>=n-count+2; k--)
- {
- //每次找到字典排序中最靠后的名字串
- pTemp = students[k].name;
- flag = false;
- for(j=k-1; j>=n-count+1; j--)
- {
- if(strcmp(students[j].name,pTemp) > 0) //表明前者的名字在字典排序中靠后要交换
- {
- pTemp = students[j].name;
- pos = j;
- flag = true;
- }
- }
- if(flag)
- {
- tempStudent = students[k];
- students[k] = students[pos];
- students[pos] = tempStudent;
- }
- }
- }
- //打印输出
- void printResult(student students[],int n)
- {
- int i,rank;
- bool flag = false;
- for(i=0; i<n; i++)
- {
- if(i > 0 && students[i].gpa == students[i-1].gpa)
- {
- if(!flag)
- {
- rank = i;
- flag = true;
- }
- printf("%d %s %.1f\n",rank,students[i].name,students[i].gpa);
- }
- else
- {
- flag = false;
- printf("%d %s %.1f\n",(i+1),students[i].name,students[i].gpa);
- }
- }
- }
阅读(1388) | 评论(0) | 转发(0) |