问题 D结构体:按成绩排序

Description
定义一个学生结构体,含学号(一维字符数组)、姓名、成绩(整型)。从键盘输入n(n<20),再输入n个学生的信息,按学生成绩从小到大顺序输出学生信息。

Input
输入一个n,接着输入n个学生的信息。

Output
按成绩从小到大顺序输出学生信息。

Sample Input
4
1001
Li
76
1002
Zhang
92
1003
Liu
85
1004
Wang
70
Sample Output
1004 Wang 70
1001 Li 76
1003 Liu 85
1002 Zhang 92

实现这个得先学会用指针和结构体,题目难度是入门,重点是学会使用qsort函数按照成绩从小到大排序学生信息,理解不了得后台私信我讲解:

img

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

struct student {
    char id[20];
    char name[20];
    int score;
};

int cmp(const void *a, const void *b) {
    return ((struct student *)a)->score - ((struct student *)b)->score;
}

int main() {
    int n;
    scanf("%d", &n);
    struct student *students = (struct student *)malloc(n * sizeof(struct student));
    for (int i = 0; i < n; i++) {
        scanf("%s%s%d", students[i].id, students[i].name, &students[i].score);
    }
    qsort(students, n, sizeof(struct student), cmp);
    for (int i = 0; i < n; i++) {
        printf("%s %s %d\n", students[i].id, students[i].name, students[i].score);
    }
    free(students);
    return 0;
}



首先定义了一个 struct student 学生结构体,包括学号、姓名和成绩三个字段。
在主函数中,先输入学生个数 n,并动态分配一个含有 n 个 struct student 类型结构体的数组内存,接着通过循环输入每个学生的信息。然后,使用两层循环进行冒泡排序,将学生按成绩从小到大排序。最后,再循环输出每个学生的信息,并释放动态分配的数组内存。
代码如下:

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

// 定义学生结构体
struct student {
    char id[10];
    char name[20];
    int score;
};

int main() {
    int n;
    scanf("%d", &n);

    struct student* students = (struct student*)malloc(n * sizeof(struct student));  // 动态分配数组内存

    // 输入学生信息
    for (int i = 0; i < n; i++) {
        scanf("%s %s %d", students[i].id, students[i].name, &students[i].score);
    }

    // 按成绩从小到大排序
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (students[i].score > students[j].score) {
                struct student temp;
                temp = students[i];
                students[i] = students[j];
                students[j] = temp;
            }
        }
    }

    // 输出学生信息
    for (int i = 0; i < n; i++) {
        printf("%s %s %d\n", students[i].id, students[i].name, students[i].score);
    }

    free(students);  // 释放动态分配的内存

    return 0;
}
  • 以下回答由chatgpt基于相关博客总结生成:
    1. 输入格式及取值范围: 输入格式:第一行为一个正整数n,表示学生的数量;接着n行,每一行为一个学生的信息,包括学号(一维字符数组)、姓名、成绩,中间用空格隔开。 取值范围:n<20,学号和姓名字符串长度小于等于100,成绩在0到100之间。

    2. 输出格式及实例: 每行输出一个学生的信息,包括学号、姓名、成绩,中间用空格隔开。按学生成绩从小到大顺序输出学生信息。 样例输出: 1004 Wang 70 1001 Li 76 1003 Liu 85 1002 Zhang 92

    3. 问题要求的重点,即按成绩从小到大排序: 要根据学生的成绩从小到大排序,可以使用堆排序算法。

    4. 程序解决问题的大体步骤: 第一步,定义一个学生结构体,包括学号(一维字符数组)、姓名、成绩。 第二步,从键盘输入学生的数量n,根据n动态分配存储学生信息的结构体数组。 第三步,输入n个学生的信息(学号、姓名、成绩),存储到之前动态分配的结构体数组当中。 第四步,利用堆排序算法,将学生结构体数组按成绩从小到大排序。 第五步,按照排序后的结果,依次输出每个学生的信息。