用C语言编写一个程序,输入n,然后输入n个学生信息,输出其中所有男同学的信息(按学号从小到大输出)。要求:使用动态内存分配,
时间: 2024-06-09 07:06:41 浏览: 57
以下是一个实现动态内存分配的C语言程序,可以输入n个学生信息并输出其中所有男同学的信息(按学号从小到大输出):
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char id[10]; //学号
char name[20]; //姓名
char gender[5]; //性别
int age; //年龄
} Student;
int main() {
int n, i, male_count = 0;
Student *students;
printf("请输入学生数量:");
scanf("%d", &n);
students = (Student *) malloc(n * sizeof(Student)); //动态分配内存
for (i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i+1);
printf("学号:");
scanf("%s", students[i].id);
printf("姓名:");
scanf("%s", students[i].name);
printf("性别:");
scanf("%s", students[i].gender);
printf("年龄:");
scanf("%d", &students[i].age);
if (strcmp(students[i].gender, "男") == 0) { //判断是否为男同学
male_count++;
}
}
if (male_count == 0) { //没有男同学
printf("没有男同学。\n");
} else {
Student *male_students = (Student *) malloc(male_count * sizeof(Student)); //动态分配内存
int j = 0;
for (i = 0; i < n; i++) {
if (strcmp(students[i].gender, "男") == 0) { //只处理男同学
memcpy(&male_students[j], &students[i], sizeof(Student)); //将该男同学信息复制到新的数组中
j++;
}
}
//按学号从小到大排序
for (i = 0; i < male_count-1; i++) {
int min_index = i;
for (j = i+1; j < male_count; j++) {
if (strcmp(male_students[j].id, male_students[min_index].id) < 0) {
min_index = j;
}
}
if (min_index != i) {
Student temp = male_students[i];
male_students[i] = male_students[min_index];
male_students[min_index] = temp;
}
}
//输出男同学信息
printf("所有男同学的信息如下:\n");
for (i = 0; i < male_count; i++) {
printf("%s\t%s\t%s\t%d\n", male_students[i].id, male_students[i].name, male_students[i].gender, male_students[i].age);
}
free(male_students); //释放内存
}
free(students); //释放内存
return 0;
}
```
程序中使用了两次动态内存分配,第一次是为存储所有学生信息的数组分配内存,第二次是为存储所有男同学信息的数组分配内存。
程序首先读取学生数量n,然后使用`malloc`函数为存储所有学生信息的数组分配内存。接着程序使用循环读取每个学生的信息,并判断该学生是否为男同学,如果是则`male_count`加1。读取完所有学生信息后,如果不存在男同学,则输出提示信息,否则程序使用`malloc`函数为存储所有男同学信息的数组分配内存,并把所有男同学信息复制到新的数组中。然后程序对新的数组按学号从小到大排序,并输出所有男同学的信息。最后程序释放所有动态分配的内存。