PTA:7-14 PAT排名汇总(C语言)

文章描述了一个名为PAT的计算机程序设计能力考试,其目的是通过在线考试和自动评测来评估考生的算法设计和程序设计能力。考试在多个考点进行,每个考点的成绩需汇总生成总排名表。输入样例展示了不同考点的考生信息,输出样例给出了合并后的排名列表。参考代码中包含了一个使用快速排序算法实现的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。

每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。

现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。

输入格式:

输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。

输出格式:

首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。

输入样例:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

输出样例:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

参考代码:

/**
 * 7-14 PAT排名汇总
 *  快速排序
 */
#include <stdio.h>
#include <string.h>

struct stu {
    char id[14];                //考号
    int score;                  //分数
    int kc;                     //考场
};
struct stu a[30000];

int bigger(const char *s1, const char *s2) {
    for (int i = 0; i < 13; i++)
        if (s1[i] > s2[i])
            return 1;
        else if (s1[i] < s2[i])
            return 0;
    return 1;
}

void qsort(int l, int r) {
    if (l >= r)
        return;

    int i = l;
    int j = r;

    struct stu t = a[l];
    while (i != j) {
        while (i < j && (a[j].score < t.score || a[j].score == t.score && bigger(a[j].id, t.id)))
            j--;
        while (i < j && (a[i].score > t.score || a[i].score == t.score && bigger(t.id, a[i].id)))
            i++;
        if (i < j) {
            struct stu s = a[i];
            a[i] = a[j];
            a[j] = s;
        }
    }
    a[l] = a[i];
    a[i] = t;

    qsort(l, i - 1);
    qsort(i + 1, r);

    return;
}

void Copy(int *b2, int *b1, int n) {
    for (int i = 1; i <= n; i++)
        b2[i] = b1[i];
}

int main() {
    int n, j, i, top = 0;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        int k;
        scanf("%d", &k);
        for (j = 0; j < k; j++) {
            char id[14];
            int score;
            scanf("%s %d", id, &score);
            a[top].score = score;
            a[top].kc = i;
            strcpy(a[top].id, id);
            top++;
        }
    }
    qsort(0, top - 1);

    int levall = 1, b1[n + 1], b2[n + 1], score = a[0].score;

    for (i = 1; i <= n; i++)
        b1[i] = 1, b2[i] = 1;
    printf("%d\n", top);
    printf("%s %d %d %d\n", a[0].id, 1, a[0].kc, 1);
    int llevall = 1;            //上一个总排名
    levall = 2;                   //总排名

    Copy(b2, b1, n);
    b1[a[0].kc]++;
    for (i = 1; i < top; i++) {
        if (a[i].score == a[i - 1].score) {
            printf("%s %d %d %d\n", a[i].id, llevall, a[i].kc, b2[a[i].kc]);
            levall++;
            b1[a[i].kc]++;
        } else {
            printf("%s %d %d %d\n", a[i].id, levall, a[i].kc, b1[a[i].kc]);
            llevall = levall;
            levall++;

            Copy(b2, b1, n);
            b1[a[i].kc]++;                    //考场的排名
        }
    }
    return 0;
}
### PTA课程成绩统计程序实现 #### 成绩数据结构设计 为了有效地管理和计算学生成绩,可以定义一个学生类来存储学生的个人信息以及各个作业的成绩。这有助于后续的数据处理和分析。 ```python class Student: def __init__(self, student_id, name): self.student_id = student_id self.name = name self.scores = {} # 存储题目编号及其对应的分数 def add_score(self, problem_id, score): """ 添加或更新某个题目的得分 """ self.scores[problem_id] = score def get_average_score(self): """ 计算平均分 """ if not self.scores: return 0 total_scores = sum(self.scores.values()) average_score = total_scores / len(self.scores) return round(average_score, 2) def get_total_score(self): """ 获取总分 """ return sum(self.scores.values()) ``` #### 数据输入与解析 通过文件读取或者手动录入的方式收集每位同学提交的结果,并将其转换成`Student`对象列表的形式保存起来以便进一步操作[^1]。 ```python def load_students_from_file(file_path): students = [] with open(file_path, 'r', encoding='utf-8') as f: lines = f.readlines() for line in lines: parts = line.strip().split(',') sid, sname = parts[:2] scores_dict = {p.split(':')[0]: float(p.split(':')[1]) for p in parts[2:]} student = Student(sid, sname) for pid, pscore in scores_dict.items(): student.add_score(pid, pscore) students.append(student) return students ``` #### 统计功能实现 提供多种方式对学生的表现情况进行汇总展示,比如按班级排名、查看个人历史记录等。这里给出简单的例子——打印所有人的基本信息及他们的平均分。 ```python def print_student_statistics(students): sorted_students = sorted(students, key=lambda x: x.get_average_score(), reverse=True) for idx, stu in enumerate(sorted_students, start=1): avg_score = stu.get_average_score() tot_score = stu.get_total_score() print(f"{idx}. ID:{stu.student_id}, Name:{stu.name}") print(f"\tAverage Score={avg_score:.2f}, Total Score={tot_score:.2f}\n") ``` 以上就是针对PTA平台上课程成绩管理系统的简化版设计方案,实际应用中可能还需要考虑更多细节问题,如异常情况处理、权限控制等方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值