22-结构体-2-测试排名
[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
为了提升同学们的编程能力,老师们会在平时进行C语言的上机测试,了解班上同学的学习情况,对于一些测试成绩较差的同学,老师会进行督促和增加练习。每次考完后,老师希望知道哪些同学通过了测试,他们的成绩排名怎样。你能编写程序帮老师进行成绩统计吗?
统计的内容包括:通过测试线的同学个数,按照降序给出这些同学的成绩,如果成绩相同,则按照考号有小到大输出。
输入
多样例。每个测试文件包括多组测试用例。每组测试用例包括多行输入:
第一行为考生人数n(1≤n<1000)、考题数m(1≤m≤10)、测试合格线g(正整数);
第二行为第1题至第m题的正整数分值x;
接下来的n行,每行包括一 名考生的准考证号s(长度不超过20的字符串)、该生解决的题目总数t、以及这m道题的题号 (题目号由1到m)。
当读入的考生人数为0时,输入结束。
输出
对每组样例,首先在第1行输出不低于分数线的考生人数,随后若干行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。
样例输入 Copy
4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1 2
CS001 3 2 3 5
1 2 40
10 30
CS001 1 2
2 3 20
10 10 10
CS000000000000000001 0
CS000000000000000002 2 1 2
0
样例输出 Copy
3
CS003 60
CS001 37
CS004 37
0
1
CS000000000000000002 20
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student {char kaohao[21];int score;
};
int compare(const void* p, const void* q)
{struct student* p1 = p;struct student* q1 = q;if (p1->score > q1->score)return -1;else if (p1->score < q1->score)return 1;else{return strcmp(p1->kaohao, q1->kaohao);}
}
int main(void)
{int n;while (1){scanf("%d", &n);if (n == 0) break;int daxianrenshu = 0;int m, g;scanf("%d %d", &m, &g);int arr[11];//liru,arr[1]wei diyitiduiyingdefenshustruct student kaosheng[10000];for (int i = 1; i <= m; i++){scanf("%d", &arr[i]);}for (int i = 1; i <= n; i++){scanf("%s", kaosheng[i].kaohao);int num,sum=0;scanf("%d", &num);for (int h = 1; h <= num; h++){int t;scanf("%d", &t);sum += arr[t];}kaosheng[i].score = sum;if (sum >= g)daxianrenshu++;}qsort(kaosheng + 1, n, sizeof(struct student), compare);printf("%d\n", daxianrenshu);for (int i = 1; i <=daxianrenshu; i++){printf("%s %d\n", kaosheng[i].kaohao, kaosheng[i].score);}}return 0;
}
好好起名字