📜  门| GATE-IT-2004 |第 41 题(1)

📅  最后修改于: 2023-12-03 14:58:32.501000             🧑  作者: Mango

题目描述

本题要求编写一个程序,对一组给定的学生数据进行排序。排序的方法如下:按学生的总分从高到低排序,如果总分相同,则按学生的编号从小到大排序。

输入格式

第一行n ,m ,k 。其中 n 是学生数;m 是参加考试的科目数,k 是要输出的前 k 名学生。

第二行是 m 个不超过100的正整数,代表这 m门课程的满分值。

接下来n 行,每行给出一位学生的信息和他的m个成绩,其间以空格分隔,信息包括:学生的编号(长度不超过6的字符串)、姓名(长度不超过8的不含空格的字符串)、m个成绩(整型),这里保证每个学生的成绩都不超过100,且至少存在一名考生。

输出格式

输出占一行,按照排名顺序输出前k名学生的信息,每个学生信息占一行,输出格式为:学生编号 姓名 分数1 ... 分数m 总分。

其中学生编号占据6个字符宽度,右对齐输出,不足部分补空格;姓名占据10个字符宽度,左对齐输出,不足部分补空格;分数和总分都占据5个字符宽度,右对齐输出,分数之间用空格间隔。

输入样例
6 3 2
90 80 70
101001 Zhang 78 80 92
101003 Li 88 81 70
101005 Wang 85 90 90
101004 Chen 90 90 90
101002 Zhao 87 78 90
101006 Wu 80 88 88
输出样例
101004 Chen     90 90 90 270
101005 Wang     85 90 90 265

程序实现

本题需要实现一个学生排序的程序,要求按照总分从高到低排序,如果总分相同,则按照学生编号从小到大排序。为了方便排序,可以使用结构体存储学生的信息,然后使用快速排序或者归并排序对学生进行排序。

在实现过程中,需要注意按照题目要求的输出格式输出结果,节点之间需要正确的缩进和对齐。

下面是一个简单的实现示例。

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

#define MAX_N 10000  // 数据容量上限
#define MAX_M 10     // 最大科目数

// 学生结构体
typedef struct {
    char id[7];         // 学生编号
    char name[9];       // 学生姓名
    int score[MAX_M];   // 学生成绩
    int total;          // 总分
} Student;

// 定义比较函数用于快速排序或者归并排序
int cmp(const void *a, const void *b)
{
    Student *s1 = (Student *)a;
    Student *s2 = (Student *)b;
    if (s1->total == s2->total) {
        return strcmp(s1->id, s2->id);
    } else {
        return s2->total - s1->total;
    }
}

int main(void)
{
    int n, m, k;
    int full[MAX_M];    // 每门课程的满分值
    Student list[MAX_N];    // 学生列表

    // 读入数据
    scanf("%d %d %d", &n, &m, &k);
    for (int i = 0; i < m; i++) {
        scanf("%d", &full[i]);
    }
    for (int i = 0; i < n; i++) {
        scanf("%s %s", list[i].id, list[i].name);
        list[i].total = 0;
        for (int j = 0; j < m; j++) {
            scanf("%d", &list[i].score[j]);
            list[i].total += list[i].score[j];
        }
    }

    // 排序
    qsort(list, n, sizeof(Student), cmp);

    // 输出结果
    for (int i = 0; i < k; i++) {
        printf("%-6s %-10s", list[i].id, list[i].name);
        for (int j = 0; j < m; j++) {
            printf(" %5d", list[i].score[j]);
        }
        printf(" %5d\n", list[i].total);
    }

    return 0;
}

以上是一个C语言的示例代码,其中包含了快速排序的实现和输入输出的实现。由于默认程序已经包含头文件和.cpp文件输入main()函数,因此上述代码中并不包含头文件和main()函数。

## python示例代码

这里给出python的示例代码,同样需要按照结构体进行排序,并且需要使用`lambda`表达式定义cmp函数。

```python
if 'python' in language.lower():
    import sys

    class Student:
        def __init__(self, id, name, score):
            self.id = id
            self.name = name
            self.score = score
            self.total = sum(score)

    n, m, k = map(int, input().split())
    full = list(map(int, input().split()))
    students = []
    for i in range(n):
        id, name, score = input().split()
        score = list(map(int, score.split()))
        student = Student(id, name, score)
        students.append(student)

    students = sorted(students, key=lambda x: (-x.total, x.id))

    for i in range(k):
        student = students[i]
        print(f'{student.id:>6s} {student.name:<10s}', end='')
        for j in range(m):
            print(f' {student.score[j]:5d}', end='')
        print(f' {student.total:5d}')

返回的markdown格式如下

# 题目描述

本题要求编写一个程序,对一组给定的学生数据进行排序。排序的方法如下:按学生的总分从高到低排序,如果总分相同,则按学生的编号从小到大排序。

# 输入格式

第一行n ,m ,k 。其中 n 是学生数;m 是参加考试的科目数,k 是要输出的前 k 名学生。

第二行是 m 个不超过100的正整数,代表这 m门课程的满分值。

接下来n 行,每行给出一位学生的信息和他的m个成绩,其间以空格分隔,信息包括:学生的编号(长度不超过6的字符串)、姓名(长度不超过8的不含空格的字符串)、m个成绩(整型),这里保证每个学生的成绩都不超过100,且至少存在一名考生。

# 输出格式

输出占一行,按照排名顺序输出前k名学生的信息,每个学生信息占一行,输出格式为:学生编号 姓名 分数1 ... 分数m 总分。

其中学生编号占据6个字符宽度,右对齐输出,不足部分补空格;姓名占据10个字符宽度,左对齐输出,不足部分补空格;分数和总分都占据5个字符宽度,右对齐输出,分数之间用空格间隔。

## 输入样例

6 3 2 90 80 70 101001 Zhang 78 80 92 101003 Li 88 81 70 101005 Wang 85 90 90 101004 Chen 90 90 90 101002 Zhao 87 78 90 101006 Wu 80 88 88


## 输出样例

101004 Chen 90 90 90 270 101005 Wang 85 90 90 265


# 程序实现

本题需要实现一个学生排序的程序,要求按照总分从高到低排序,如果总分相同,则按照学生编号从小到大排序。为了方便排序,可以使用结构体或者类存储学生的信息,然后使用快速排序或者归并排序对学生进行排序。

在实现过程中,需要注意按照题目要求的输出格式输出结果,节点之间需要正确的缩进和对齐。

## python示例代码

这里给出python的示例代码,同样需要按照结构体进行排序,并且需要使用lambda表达式定义cmp函数。

```python
if 'python' in language.lower():
    import sys

    class Student:
        def __init__(self, id, name, score):
            self.id = id
            self.name = name
            self.score = score
            self.total = sum(score)

    n, m, k = map(int, input().split())
    full = list(map(int, input().split()))
    students = []
    for i in range(n):
        id, name, score = input().split()
        score = list(map(int, score.split()))
        student = Student(id, name, score)
        students.append(student)

    students = sorted(students, key=lambda x: (-x.total, x.id))

    for i in range(k):
        student = students[i]
        print(f'{student.id:>6s} {student.name:<10s}', end='')
        for j in range(m):
            print(f' {student.score[j]:5d}', end='')
        print(f' {student.total:5d}')

以上是一个python的示例代码,其中使用了类的方式存储学生的信息,使用lambda表达式进行排序,输出采用了若干个f-string进行格式控制。

C++示例代码

这里还给出了一个C++的示例代码,可以发现其实现与C语言并没有区别,唯一需要注意的就是C++的struct可以包含函数。

#if defined(__cplusplus)
#include <cstdio>
#include <algorithm>
using namespace std;
#else
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#endif

#define MAX_N 10000  // 数据容量上限
#define MAX_M 10     // 最大科目数

#if defined(__cplusplus)
struct Student {
    char id[7];         // 学生编号
    char name[9];       // 学生姓名
    int score[MAX_M];   // 学生成绩
    int total;          // 总分
    bool operator < (const Student &t) const {
        if (total == t.total) {
            return strcmp(id, t.id) < 0;
        } else {
            return total > t.total;
        }
    }
} list[MAX_N];    // 学生列表

int main(void)
{
    int n, m, k, full[MAX_M];
    scanf("%d %d %d", &n, &m, &k);
    for (int i = 0; i < m; i++) {
        scanf("%d", &full[i]);
    }
    for (int i = 0; i < n; i++) {
        scanf("%s %s", list[i].id, list[i].name);
        list[i].total = 0;
        for (int j = 0; j < m; j++) {
            scanf("%d", &list[i].score[j]);
            list[i].total += list[i].score[j];
        }
    }
    sort(list, list + n);

    for (int i = 0; i < k; i++) {
        printf("%-6s %-10s", list[i].id, list[i].name);
        for (int j = 0; j < m; j++) {
            printf(" %5d", list[i].score[j]);
        }
        printf(" %5d\n", list[i].total);
    }

    return 0;
}

#else

typedef struct {
    char id[7];         // 学生编号
    char name[9];       // 学生姓名
    int score[MAX_M];   // 学生成绩
    int total;          // 总分
} Student;

bool cmp(const Student &a, const Student &b)
{
    if (a.total == b.total) {
        return strcmp(a.id, b.id) < 0;
    } else {
        return a.total > b.total;
    }
}

int main(void)
{
    int n, m, k;
    int full[MAX_M];    // 每门课程的满分值
    Student list[MAX_N];    // 学生列表

    // 读入数据
    scanf("%d %d %d", &n, &m, &k);
    for (int i = 0; i < m; i++) {
        scanf("%d", &full[i]);
    }
    for (int i = 0; i < n; i++) {
        scanf("%s %s", list[i].id, list[i].name);
        list[i].total = 0;
        for (int j = 0; j < m; j++) {
            scanf("%d", &list[i].score[j]);
            list[i].total += list[i].score[j];
        }
    }

    // 排序
    sort(list, list + n, cmp);

    // 输出结果
    for (int i = 0; i < k; i++) {
        printf("%-6s %-10s", list[i].id, list[i].name);
        for (int j = 0; j < m; j++) {
            printf(" %5d", list[i].score[j]);
        }
        printf(" %5d\n", list[i].total);
    }

    return 0;
}
#endif