编写一个程序,使用 malloc 动态分配一个结构体数组,存储用 户输入的任意数量的学生信息( name , age , gpa )。输入完成 后,按 gpa 排序并输出所有学生信息。最后释放动态分配的内 存。
时间: 2024-10-02 22:02:42 浏览: 23
当你需要处理用户输入的任意数量的数据,并且数据结构可能会变化时,动态内存管理就显得非常有用。在这个例子中,我们将编写一个 C 程序,使用 `malloc` 动态分配一个结构体数组 `Student` 来存储学生的姓名、年龄和 GPA。首先,我们需要定义一个结构体:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义学生结构体
typedef struct {
char name[50];
int age;
float gpa;
} Student;
void input_students(Student** students, int* num_students) {
*num_students = 0; // 初始化学生数量
while (1) {
printf("请输入学生信息(输入 'q' 结束):\n");
if (fgets(*students[*num_students].name, sizeof(*students[*num_students].name), stdin) == NULL || strcmp(*students[*num_students].name, "q") == 0) break;
if (scanf("%d %f", &(*students[*num_students]).age, &(*students[*num_students]).gpa) != 2) {
printf("无效输入,请重新输入。\n");
continue;
}
(*num_students)++;
}
// 修正字符串结束符
for (int i = 0; i < *num_students; i++) {
*students[i].name[strcspn(*students[i].name, "\n")] = '\0';
}
}
void sort_students_by_gpa(Student* students, int num_students) {
for (int i = 0; i < num_students - 1; i++) {
for (int j = 0; j < num_students - i - 1; j++) {
if (students[j].gpa > students[j + 1].gpa) {
// 交换元素
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
void display_students(const Student* students, int num_students) {
for (int i = 0; i < num_students; i++) {
printf("姓名:%s, 年龄:%d, GPA:%f\n", students[i].name, students[i].age, students[i].gpa);
}
}
void free_students(Student* students, int num_students) {
free(students);
}
int main() {
int num_students;
Student* students = (Student*)malloc(sizeof(Student));
// 用户输入学生信息
input_students(&students, &num_students);
// 按照 GPA 排序
sort_students_by_gpa(students, num_students);
// 输出学生信息
display_students(students, num_students);
// 释放动态内存
free_students(students, num_students);
return 0;
}
```
在这个程序中,我们首先定义了一个 `Student` 结构体,然后创建函数分别用于获取用户输入、排序和显示学生信息。最后,在 `main` 函数中通过 `malloc` 分配内存给结构体数组,用户输入结束后,按照 GPA 进行排序并输出,然后释放动态分配的内存。
阅读全文