首页  > 考试管理  > 如何对n名学生m门成绩进行排序

如何对n名学生m门成绩进行排序

2025-05-14 00:07:20
张老师
张老师已认证

张老师为您分享以下优质知识

要对n名学生的m门成绩进行排序,可以按照以下步骤实现:

一、数据结构设计

二维数组存储

使用二维数组`score[n+1][m+1]`存储成绩,其中:

- `score[i]`存储学生编号(从1开始)

- `score[i][j]`存储第i个学生的第j门课程成绩(j从1到m)

辅助数组

使用一维数组`total_score[n+1]`存储每个学生的总成绩,`avg_score[n+1]`存储平均成绩

二、核心算法实现

输入数据

从键盘读取n和m,然后依次输入每个学生的m门成绩,并计算总成绩和平均成绩

排序算法

使用 快速排序或 归并排序对二维数组按总成绩降序排序。以下是快速排序的伪代码示例:

```c

void quick_sort(int n, double score[n+1][m+1]) {

if (n pivot) i++;

while (score[j] < pivot) j--;

if (i < j) swap(score[i], score[j]);

}

quick_sort(i+1, score);

quick_sort(n-i, score);

}

```

或者使用标准库函数`qsort`:

```c

include

int cmp(const void *a, const void *b) {

double diff = ((double *)b) - ((double *)a);

return (diff >

0) - (diff < 0);

}

void sort_by_total_score(int n, double score[n+1][m+1]) {

qsort(score+1, n, sizeof(double), cmp);

}

```

输出结果

按排序后的顺序输出每个学生的编号、各科成绩及总成绩,格式如下:

```

学号1 总分1 总分2 总分3

学号2 总分1 总分2 总分3

...

```

三、扩展功能(可选)

按学号排序

若需按学号升序排序,可在排序时调整比较函数:

```c

int cmp_by_id(const void *a, const void *b) {

return (*(int *)a - *(int *)b);

}

```

或在`qsort`中传递自定义比较函数。

统计功能

可添加统计模块,统计各分数段人数(如不及格、合格等)

四、示例代码(完整流程)

以下是包含输入、排序、输出及统计的完整示例代码(以C语言为例):

```c

include

include

define MAXN 1000

define MAXM 10

typedef struct {

int id;

double scores[MAXM];

double total;

double avg;

} Student;

void input_scores(Student *students, int n, int m) {

for (int i = 0; i < n; i++) {

scanf("%d", &students[i].id);

for (int j = 0; j < m; j++) {

scanf("%lf", &students[i].scores[j]);

students[i].total += students[i].scores[j];

}

students[i].avg = students[i].total / m;

}

}

void sort_students(Student *students, int n) {

qsort(students+1, n, sizeof(Student), cmp_by_total_score);

}

void print_students(const Student *students, int n) {

printf("%-5d", "学号");

printf("%-10.1f", "平均分");

for (int j = 0; j < MAXM; j++) {

printf("%-10.1f", "成绩%2d", j+1);

}

printf("n");

for (int i = 0; i < n; i++) {

printf("%-5d", students[i].id);

printf("%-10.1f", students[i].avg);

for (int j = 0; j < MAXM; j++) {

printf