1015

来源:互联网 发布:java数组编程 编辑:程序博客网 时间:2024/06/05 08:29

这是一道简答题,用qsort函数很容易就能搞定,qsort的第二个参数多少个元素参与排序,一定不要写错了。还有就是记得初始化,如果不初始化用qsort函数很容易产生错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student {
 char id[30];
 int count;
 int ques[20];
 int grade;
}stu[1010];

int point[1010];
int cnt;

int comp(const void *a, const void *b)
{
 int res;

 struct student *p = (struct student *)a;
 struct student *q = (struct student *)b;

 if ((p->grade) == (q->grade)) {//如果成绩一样,按照名字的字母表排序
   res = strcmp(p->id, q->id);
   return res;

 } return q->grade - p->grade;
}

int init()//初始化
{
 int i;
 cnt = 0;

 for (i = 0; i < 1010; i++) {
  stu[i].grade = 0;
  stu[i].count = 0;
  memset(stu[i].id, 0, 30);
  memset(stu[i].ques, 0, 20);
 }

 return 0;
}

int main()
{
 int n, m, g, i, j;

 while (scanf("%d", &n), n) {
  scanf("%d%d", &m, &g);
  init();

  for (i = 1; i <=m; i++) {
   scanf("%d", &point[i]);
  }

  for (i = 0; i < n; i++) {
   scanf("%s", stu[i].id);
   scanf("%d", &stu[i].count);
   
   for (j = 0; j < stu[i].count; j++) {
    scanf("%d", &stu[i].ques[j]);
   }

   for (j = 0; j < stu[i].count; j++) {
    stu[i].grade += point[stu[i].ques[j]];
   }

   if (stu[i].grade >= g) cnt++;
  }
   qsort(stu, n, sizeof(struct student), comp);
   
   printf("%d\n", cnt);

   for (i = 0; i < cnt; i++) {
    printf("%s %d\n", stu[i].id, stu[i].grade);
   }
 }
 return 0;
}