一、动态内存分配和回收与分文件联合编译相关练习
完成学生信息管理系统
要求:定义一个班级,包括多个学生,以及记录实际学生的个数
1> 完成班级的创建,创建时,需要传递班级实际人数
2> 完成班级学生的信息录入工作
3> 完成将班级学生按成绩进行降序排序工作
4> 输出班级中成绩最好和最差学生的信息
5> 完成信息的输出工作
6> 完成班级的销毁工作
要求:班级创建在堆区,尽量分文件编译完成
1.头文件
//homework.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
//定义学生类型
struct Stu
{
char name[20];
int age;
double score;
};
//定义班级类型
struct Class
{
struct Stu student[MAX]; //存放学生的容器
int size; //班级实际人数
};
//声明菜单函数
int menu();
//声明班级创建函数
struct Class *classCreate();
//声明学生信息录入函数函数
void studentInsert(struct Class *c);
//声明学生成绩降序排序函数函数
void scoreSort(struct Class *c);
//声明输出成绩最值学生信息函数
void scoreMaxMin(struct Class *c);
//声明学生信息输出函数
void printStudent(struct Class *c);
//声明班级销毁函数
void classDestroy(struct Class *c);
2.函数文件
//homemork_fun.c
#include "homework.h"
//菜单函数
int menu()
{
int menu = 0;
printf("\t\t\t\t========欢迎使用学生信息管理系统========\n");
printf("\t\t\t\t========================================\n");
printf("\t\t\t\t========1.班级创建 ========\n");
printf("\t\t\t\t========2.学生信息录入 ========\n");
printf("\t\t\t\t========3.学生信息排序 ========\n");
printf("\t\t\t\t========4.学生成绩最值 ========\n");
printf("\t\t\t\t========5.学生信息输出 ========\n");
printf("\t\t\t\t========6.班级销毁 ========\n");
printf("\t\t\t\t========0.退出 ========\n");
printf("\t\t\t\t========================================\n");
printf("\t\t\t\t========请输入您要使用的功能>>>>");
scanf("%d", &menu);
getchar();
printf("\n\n");
return menu;
}
//班级创建函数
struct Class *classCreate()
{
printf("\t\t\t\t================班级创建================\n");
printf("\t\t\t\t========================================\n");
//创建班级并通过malloc()给班级分配内存空间
struct Class *c = (struct Class *)malloc(sizeof(struct Class));
//班级初始化
memset(c, 0, sizeof(struct Class));
printf("\t\t\t\t请输入您所创建班级的人数:");
//输入班级具体人数
scanf("%d", &c->size);
if(c == NULL)
{
printf("\t\t\t\t班级创建失败\n");
return NULL;
}
printf("\t\t\t\t班级创建成功\n\n");
return c;
}
//学生信息录入函数
void studentInsert(struct Class *c)
{
printf("\t\t\t\t==============学生信息录入==============\n");
printf("\t\t\t\t========================================\n");
//遍历输入学生信息
for(int i=0; i<c->size; i++)
{
printf("\t\t\t\t请输入第%d个学生姓名:", i+1);
scanf("%s", c->student[i].name);
getchar();
printf("\t\t\t\t请输入第%d个学生年龄:", i+1);
scanf("%d", &c->student[i].age);
getchar();
printf("\t\t\t\t请输入第%d个学生成绩:", i+1);
scanf("%lf", &c->student[i].score);
getchar();
}
printf("\t\t\t\t学生信息录入成功\n\n");
}
//学生成绩排序函数
void scoreSort(struct Class *c)
{
//定义学生信息交换中间变量
struct Stu temp = c->student[0];
//冒泡排序
for(int i=0; i<c->size; i++)
{
for(int j=0; j<c->size-i; j++)
{
if(c->student[j].score < c->student[j+1].score)
{
temp = c->student[j];
c->student[j] = c->student[j+1];
c->student[j+1] = temp;
}
}
}
printf("\t\t\t\t学生成绩(降序)排序成功\n\n");
}
//学生成绩最值函数
void scoreMaxMin(struct Class *c)
{
//定义成绩最值学生信息结构体变量
struct Stu max = c->student[0];
struct Stu min = c->student[0];
//遍历学生成绩,寻找最大值和最小值
for(int i=1; i<c->size; i++)
{
if(max.score < c->student[i].score)
{
max = c->student[i];
}
if(min.score > c->student[i].score)
{
min = c->student[i];
}
}
//输出成绩最值学生信息
printf("\t\t\t\t=========成绩最好和最差学生信息=========\n");
printf("\t\t\t\t========================================\n");
printf("\t\t\t\t姓名==========年龄==========成绩========\n");
printf("\t\t\t\t%-4s\t\t%-3d\t\t%3.2lf\n", max.name, max.age, max.score);
printf("\t\t\t\t%-4s\t\t%-3d\t\t%3.2lf\n\n", min.name, min.age, min.score);
printf("\t\t\t\t成绩最好和最差学生信息输出完成\n\n");
}
//学生信息输出函数
void printStudent(struct Class *c)
{
printf("\t\t\t\t================学生信息================\n");
printf("\t\t\t\t========================================\n");
printf("\t\t\t\t姓名==========年龄==========成绩========\n");
//遍历输出学生信息
for(int i=0; i<c->size; i++)
{
printf("\t\t\t\t%-4s\t\t%-3d\t\t%3.2lf\n", \
c->student[i].name, c->student[i].age, c->student[i].score);
}
printf("\n\n");
}
//班级销毁函数
void classDestroy(struct Class *c)
{
//释放内存空间
if(c!=NULL)
{
free(c);
printf("\t\t\t\t班级销毁成功\n\n");
return ;
}
printf("\t\t\t\t班级销毁失败\n\n");
}
3.主函数
#include "homework.h"
int main(int argc, const char *argv[])
{
//定义并初始化菜单选项
int m = 1;
//定义并初始化班级结构体指针变量
struct Class *Cla = NULL;
while(m)
{
m = menu();
switch(m)
{
case 1:
{
//创建班级
Cla = classCreate();
printf("\t\t\t\t当前班级人数为:%d\n\n", Cla->size);
break;
}
case 2:
{
//学生信息录入
studentInsert(Cla);
break;
}
case 3:
{
//学生成绩降序排序
scoreSort(Cla);
break;
}
case 4:
{
//输出班级中最好和最差学生信息
scoreMaxMin(Cla);
break;
}
case 5:
{
//学生信息输出
printStudent(Cla);
break;
}
case 6:
{
classDestroy(Cla);
Cla = NULL;
break;
}
case 0:
{
printf("\n\n\t\t\t\t欢迎下次使用\n\n");
break;
}
default:
{
printf("\t\t\t\t选项输入错误,请重新输入\n\n");
break;
}
}
}
return 0;
}