Chinaunix首页 | 论坛 | 博客
  • 博客访问: 506073
  • 博文数量: 65
  • 博客积分: 1158
  • 博客等级: 少尉
  • 技术积分: 1261
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-18 22:07
文章分类

全部博文(65)

文章存档

2016年(1)

2014年(2)

2013年(9)

2012年(53)

分类: C/C++

2012-09-24 20:51:02

/**
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
*/



点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MAX1 20
  4. #define MAX2 50

  5. typedef struct student student;

  6. struct student
  7. {
  8.     char name[MAX1];
  9.     int grade[MAX1];
  10.     double gpa;
  11. };

  12. void compareStudents(student students[],int n);
  13. void sortByName(student students[],int n,int count);
  14. void printResult(student students[],int n);

  15. int main()
  16. {
  17.     int cases,n,m,i,j,sum;//cases个用例、n个学生、m科科目

  18.     student students[MAX2];
  19.     scanf("%d",&cases);

  20.     while(cases--)
  21.     {
  22.         scanf("%d%d",&n,&m);

  23.         //while(getchar() != '\n');

  24.         //输入信息
  25.         for(i=0; i<n; i++)
  26.         {
  27.             sum = 0;
  28.             scanf("%s",students[i].name);
  29.             for(j=0; j<m; j++)
  30.             {
  31.                 scanf("%d",&(students[i].grade[j]));
  32.             }

  33.             for(j=0; j<m; j++)
  34.             {
  35.                 sum += students[i].grade[j];
  36.             }

  37.             students[i].gpa = (1.0 * sum) / m;
  38.         }

  39.         compareStudents(students,n);
  40.         printResult(students,n);

  41.     }
  42.     return 0;
  43. }

  44. //执行排名后输出
  45. void compareStudents(student students[],int n)
  46. {
  47.     int i,j,pos;
  48.     student tempStudent;
  49.     double max;
  50.     bool flag;

  51.     //按照平均成绩的降序排序
  52.     for(i=0; i<n-1; i++)
  53.     {
  54.         max = students[i].gpa;
  55.         flag = false;
  56.         for(j=i+1; j<n; j++)
  57.         {
  58.             if(students[j].gpa > max)
  59.             {
  60.                 pos = j;
  61.                 max = students[j].gpa;
  62.                 flag = true;
  63.             }
  64.         }

  65.         if(flag)
  66.         {
  67.             tempStudent = students[i];
  68.             students[i] = students[pos];
  69.             students[pos] = tempStudent;
  70.         }
  71.     }

  72.     //再次遍历students这个数组,找到平均值相等的学生

  73.     //printResult(students,n);

  74.     //printf("------------------\n");
  75.     int count = 1;
  76.     for(i=0; i<n; i++)
  77.     {
  78.         if(students[i].gpa == students[i+1].gpa)
  79.         {
  80.             count++;
  81.             continue;
  82.         }
  83.         else if(count > 1)
  84.         {
  85.             sortByName(students,i,count); //按名字给i之前的count个学生排序 包括i
  86.             count = 1;
  87.         }
  88.         else if(1 == count)
  89.         {
  90.             continue;
  91.         }
  92.     }
  93. }


  94. void sortByName(student students[],int n,int count)
  95. {
  96.     bool flag;
  97.     //printf("%d\n",count);
  98.     int k,j,pos;
  99.     student tempStudent;
  100.     char *pTemp;

  101.     for(k=n; k>=n-count+2; k--)
  102.     {
  103.         //每次找到字典排序中最靠后的名字串
  104.         pTemp = students[k].name;
  105.         flag = false;
  106.         for(j=k-1; j>=n-count+1; j--)
  107.         {
  108.             if(strcmp(students[j].name,pTemp) > 0) //表明前者的名字在字典排序中靠后要交换
  109.             {
  110.                 pTemp = students[j].name;
  111.                 pos = j;
  112.                 flag = true;
  113.             }
  114.         }

  115.         if(flag)
  116.         {
  117.             tempStudent = students[k];
  118.             students[k] = students[pos];
  119.             students[pos] = tempStudent;
  120.         }
  121.     }
  122. }



  123. //打印输出

  124. void printResult(student students[],int n)
  125. {
  126.     int i,rank;
  127.     bool flag = false;

  128.     for(i=0; i<n; i++)
  129.     {
  130.         if(i > 0 && students[i].gpa == students[i-1].gpa)
  131.         {
  132.             if(!flag)
  133.             {
  134.                 rank = i;
  135.                 flag = true;
  136.             }
  137.             printf("%d %s %.1f\n",rank,students[i].name,students[i].gpa);
  138.         }
  139.         else
  140.         {
  141.             flag = false;
  142.             printf("%d %s %.1f\n",(i+1),students[i].name,students[i].gpa);
  143.         }
  144.     }
  145. }

阅读(1194) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~