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 diyitiduiyingdefenshu
struct 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;
}
好好起名字