Tips:此题比较简单,最好将每一个学生的信息构建一个结构体,另外需要注意的是,若分数相同,排序按姓名排序,我看网上很多都是使用<algorithm>中的sort算法,只需重写cmp函数即可。
该方法如下所示:
1 #include<aigorithm> 2 bool cmp(const node &a,const node &b) 3 { 4 if(a.sum == b.sum) 5 return strcmp(a.name,b.name) < 0 ? 1 : 0; 6 else 7 return a.sum > b.sum; 8 }
但由于我自己是采用纯C语言代码提交的,所以排序时时是自己写的sort函数,采用冒泡排序,虽然较慢,不过也可以AC
1 void sort(struct node stu[],int n) 2 { 3 int i = 0; 4 int j = 0; 5 for(i = 0 ;i < n;i++) 6 { 7 for(j = i ; j < n ; j++) 8 { 9 if(stu[i].sum<stu[j].sum) //按分值由大到小排序 10 { 11 struct node temp = stu[i]; 12 stu[i] = stu[j]; 13 stu[j] = temp; 14 }else if(stu[i].sum == stu[j].sum) 15 { 16 if(strcmp(stu[i].name,stu[j].name) > 0) 17 { 18 struct node temp = stu[i]; 19 stu[i] = stu[j]; 20 stu[j] = temp; 21 } 22 } 23 } 24 } 25 }
最后附上完整源程序:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAXSTU 1005 4 struct node 5 { 6 char name[25]; //姓名 7 int num; //完成题目数量 8 int sum; //得分 9 }stu[MAXSTU]; 10 11 void sort(struct node stu[],int n) 12 { 13 int i = 0; 14 int j = 0; 15 for(i = 0 ;i < n;i++) 16 { 17 for(j = i ; j < n ; j++) 18 { 19 if(stu[i].sum<stu[j].sum) //按分值由大到小排序 20 { 21 struct node temp = stu[i]; 22 stu[i] = stu[j]; 23 stu[j] = temp; 24 }else if(stu[i].sum == stu[j].sum) 25 { 26 if(strcmp(stu[i].name,stu[j].name) > 0) 27 { 28 struct node temp = stu[i]; 29 stu[i] = stu[j]; 30 stu[j] = temp; 31 } 32 } 33 } 34 } 35 } 36 37 int main() 38 { 39 int N = 0; //考生人数 40 int M = 0; //考题数量 41 int G = 0; //分数线 42 int score[10] = {0};//每道题的分值 43 int i=0,j=0; 44 int cnt = 0; 45 while(scanf("%d",&N) && N != 0) 46 { 47 scanf("%d %d",&M,&G); 48 for(i=0;i<M;i++)//读入第二行分值数据 49 { 50 scanf("%d",&score[i]); 51 } 52 cnt = 0; 53 for(i=0;i<N;i++)//循环读入每隔学生的信息数据 54 { 55 scanf("%s%d",stu[i].name,&stu[i].num); 56 stu[i].sum = 0; 57 while(stu[i].num--) 58 { 59 scanf("%d",&j); 60 stu[i].sum += score[j-1]; 61 } 62 if(stu[i].sum >= G) 63 cnt++; 64 } 65 66 sort(stu,N); 67 printf("%d ",cnt); 68 for(i=0;i<N;i++) 69 { 70 if(stu[i].sum >= G) 71 { 72 printf("%s %d ",stu[i].name,stu[i].sum); 73 } 74 } 75 76 } 77 return 0; 78 }