📌  相关文章
📜  C程序将学生记录存储为结构并按名称对它们进行排序(1)

📅  最后修改于: 2023-12-03 15:30:15.661000             🧑  作者: Mango

C程序将学生记录存储为结构并按名称对它们进行排序

这篇文章介绍了一个C程序,它将学生记录存储为结构,并按照学生的名称对它们进行排序。我们将首先介绍数据结构,并解释为什么我们选择使用结构体来存储学生记录。接着,我们将讨论排序算法并给出实现代码。最后,我们将演示如何使用代码从用户输入中读取学生记录,并按名称对它们进行排序。

数据结构

我们的C程序将使用结构体作为学生记录的数据结构。结构体是一种用户定义的数据类型,它允许程序员将不同类型的数据组合在一个单一的对象中。在本例中,我们将使用结构体来表示每个学生记录。每个记录包括学生的名称,成绩和年龄。下面是我们的结构体定义:

struct student {
    char name[50];
    int score;
    int age;
};

该结构体定义了一个名为 student 的新类型,该类型包括三个成员变量,即 namescoreage。其中,name 是一个字符数组,其大小为50。这个数组存储学生的名字。score 是一个整数变量,存储学生的成绩。age 是一个整数变量,存储学生的年龄。

排序算法

我们的程序将对学生记录按名称进行排序。为了排序,我们将使用快速排序算法。快速排序是一种分治算法,它将输入数据分为两个较小的部分,然后对这两个部分递归地应用排序算法。在我们的例子中,快速排序将根据学生名字的字母顺序(A-Z)来对学生记录进行排序。下面是快速排序算法的实现代码:

void quicksort(struct student arr[], int left, int right) {
    int i = left, j = right;
    struct student tmp;
    char pivot[50];
    strcpy(pivot, arr[(left + right) / 2].name);

    /* partition */
    while (i <= j) {
        while (strcmp(arr[i].name, pivot) < 0)
            i++;
        while (strcmp(arr[j].name, pivot) > 0)
            j--;
        if (i <= j) {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };

    /* recursion */
    if (left < j)
        quicksort(arr, left, j);
    if (i < right)
        quicksort(arr, i, right);
}

该函数的输入参数 arr 是一个学生记录的数组。输入参数 leftright 是需要排序的数组的左右边界。该函数使用指针和递归来排序数组。在该函数中,数组被分成两个部分,左部分包含小于或等于支点的元素,右部分包含大于支点的元素。在每个部分中,函数递归地应用快速排序算法。排序结束时,学生记录将按名称字典顺序排序。

实现代码

下面是完整的C程序,它使用快速排序算法将学生记录按名称排序。

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

struct student {
    char name[50];
    int score;
    int age;
};

void quicksort(struct student arr[], int left, int right) {
    int i = left, j = right;
    struct student tmp;
    char pivot[50];
    strcpy(pivot, arr[(left + right) / 2].name);

    /* partition */
    while (i <= j) {
        while (strcmp(arr[i].name, pivot) < 0)
            i++;
        while (strcmp(arr[j].name, pivot) > 0)
            j--;
        if (i <= j) {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };

    /* recursion */
    if (left < j)
        quicksort(arr, left, j);
    if (i < right)
        quicksort(arr, i, right);
}

int main() {
    int i, n;
    struct student s[100];

    printf("Enter number of students: ");
    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        printf("Enter name of student #%d: ", i + 1);
        scanf("%s", s[i].name);
        printf("Enter score of student #%d: ", i + 1);
        scanf("%d", &s[i].score);
        printf("Enter age of student #%d: ", i + 1);
        scanf("%d", &s[i].age);
    }

    quicksort(s, 0, n - 1);

    printf("\nSorted Student Records:\n");
    for (i = 0; i < n; i++) {
        printf("%-20s %3d %3d\n", s[i].name, s[i].score, s[i].age);
    }

    return 0;
}

在该程序中,我们首先定义了一个结构体 student 来表示每个学生记录。接着,我们实现了 quicksort 函数来对学生记录按照名称进行排序。最后,我们在主函数中使用 scanf 函数从用户输入中读取学生记录,并使用 quicksort 函数将学生记录按名称排序。

总结

这篇文章介绍了一个C程序,它将学生记录存储为结构体,并使用快速排序算法按名称对学生记录进行排序。我们首先介绍了结构体,解释了为什么我们选择使用它来存储学生记录。然后,我们讨论了快速排序算法和实现代码。最后,我们演示了如何使用代码从用户输入中读取学生记录,并按名称对它们进行排序。这个程序可以在实际的应用程序中使用,例如管理大型学生数据库或制作学生成绩单。