📅  最后修改于: 2023-12-03 15:30:15.661000             🧑  作者: Mango
这篇文章介绍了一个C程序,它将学生记录存储为结构,并按照学生的名称对它们进行排序。我们将首先介绍数据结构,并解释为什么我们选择使用结构体来存储学生记录。接着,我们将讨论排序算法并给出实现代码。最后,我们将演示如何使用代码从用户输入中读取学生记录,并按名称对它们进行排序。
我们的C程序将使用结构体作为学生记录的数据结构。结构体是一种用户定义的数据类型,它允许程序员将不同类型的数据组合在一个单一的对象中。在本例中,我们将使用结构体来表示每个学生记录。每个记录包括学生的名称,成绩和年龄。下面是我们的结构体定义:
struct student {
char name[50];
int score;
int age;
};
该结构体定义了一个名为 student
的新类型,该类型包括三个成员变量,即 name
,score
和 age
。其中,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
是一个学生记录的数组。输入参数 left
和 right
是需要排序的数组的左右边界。该函数使用指针和递归来排序数组。在该函数中,数组被分成两个部分,左部分包含小于或等于支点的元素,右部分包含大于支点的元素。在每个部分中,函数递归地应用快速排序算法。排序结束时,学生记录将按名称字典顺序排序。
下面是完整的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程序,它将学生记录存储为结构体,并使用快速排序算法按名称对学生记录进行排序。我们首先介绍了结构体,解释了为什么我们选择使用它来存储学生记录。然后,我们讨论了快速排序算法和实现代码。最后,我们演示了如何使用代码从用户输入中读取学生记录,并按名称对它们进行排序。这个程序可以在实际的应用程序中使用,例如管理大型学生数据库或制作学生成绩单。