一、思维导图
内存分配
二、课后习题
分文件编译
//sys.h
#ifndef TEST_H
#define TEST_H
#define MAX_SIZE 100
//定义学生类型
typedef struct Stu
{
char name[20]; //姓名
int age; //年龄
double score; //分数
}stu;
//定义班级类型
typedef struct Class
{
struct Stu student[MAX_SIZE]; //定义学生容器
int size; //实际学生人数
}class;
//创建班级
class *Create_Stu(int size);
//信息录入
void Enter_Stu(class *ptr,int size);
//学生信息输出
void Print_Stu(class *ptr,int size);
//按成绩降序排序
void Sort_Stu(class *ptr,int size);
//输出成绩最值学生信息
void Print_Best(class *ptr,int size);
//销毁班级容器
void destroy(class *ptr);
#endif
//fun.c
#include <myhead.h>
#include "sys.h"
//创建班级
class *Create_Stu(int size)
{
//申请size个学生结构体加上一个size的空间
class *ptr = (class*)malloc(sizeof(stu) * size + sizeof(int));
if(NULL == ptr)
{
printf("申请失败\n");
return NULL;
}
//申请成功
//给内存空间初始化
memset(ptr,0,sizeof(stu)*size+sizeof(int));
//将size赋给班级结构体的size
ptr->size = size;
//将内存地址返回
printf("创建班级成功\n");
return ptr;
}
//信息录入
void Enter_Stu(class *ptr,int size)
{
//判断是否成功申请内存
if(NULL == ptr)
{
printf("error\n");
return ;
}
//循环录入学生信息
for(int i=0;i<size;i++)
{
printf("请输入第%d个学生姓名:",i+1);
scanf("%s",ptr->student[i].name);
getchar();
printf("请输入第%d个学生年龄:",i+1);
scanf("%d",&ptr->student[i].age);
getchar();
printf("请输入第%d个学生成绩:",i+1);
scanf("%lf",&ptr->student[i].score);
getchar();
printf("\n");
}
//录入完成
printf("录入成功\n");
}
//学生信息输出
void Print_Stu(class *ptr,int size)
{
//判断是否成功申请内存
if(NULL == ptr)
{
printf("error\n");
return ;
}
//循环输出学生信息
printf("**********学生信息如下*********\n");
printf("姓名\t年龄\t成绩\n\n");
for(int i=0;i<size;i++)
{
printf("%s\t%d\t%lf\n",\
ptr->student[i].name,ptr->student[i].age,ptr->student[i].score);
printf("\n");
}
}
//按成绩降序排序
void Sort_Stu(class *ptr,int size)
{
//判断是否成功申请内存
if(NULL == ptr)
{
printf("error\n");
return ;
}
printf("************对学生成绩进行排序***********\n");
for(int i=1;i<size;i++)
{
for(int j=0;j<size;j++)
{
if(ptr->student[j].score < ptr->student[j+1].score)
{
//交换位置
stu temp = ptr->student[j];
ptr->student[j] = ptr->student[j+1];
ptr->student[j+1] = temp;
}
}
}
//排序成功
printf("排序成功\n");
}
//输出成绩最值学生信息
void Print_Best(class *ptr,int size)
{
//判断是否成功申请内存
if(NULL == ptr)
{
printf("error\n");
return ;
}
//定义最值学生容器
stu stu_max;
stu stu_min;
//定义最值分数容器
double max_score = 0;
double min_socre = 0;
//将第一个学生当做最值
stu_max = *ptr->student;
stu_min = *ptr->student;
max_score = ptr->student[0].score;
min_socre = ptr->student[0].score;
//循环比较刷新最值
for(int i=1;i<size;i++)
{
if(ptr->student[i].score > max_score)
{
max_score = ptr->student[i].score;
stu_max = ptr->student[i];
}
if(ptr->student[i].score < min_socre)
{
min_socre = ptr->student[i].score;
stu_min = ptr->student[i];
}
}
//输出成绩最值学生信息
printf("************成绩最值学生信息************\n");
printf("成绩最高学生信息:\n");
printf("姓名\t年龄\t成绩\n\n");
printf("%s\t%d\t%lf\n",\
stu_max.name,stu_max.age,stu_max.score);
printf("成绩最低学生信息:\n");
printf("姓名\t年龄\t成绩\n\n");
printf("%s\t%d\t%lf\n",\
stu_min.name,stu_min.age,stu_min.score);
}
//销毁班级容器
void destroy(class *ptr)
{
//释放内存
if(ptr != NULL)
{
free(ptr);
ptr =NULL;
}
}
//Stu_sys(主函数)
#include <myhead.h>
#include "sys.h"
int main(int argc, const char *argv[])
{
printf("\t\t************学生信息管理系统************\n");
printf("\t\t=======1、 创建班级 =======\n");
printf("\t\t=======2、 录入学生信息 =======\n");
printf("\t\t=======3、 查看学生信息 =======\n");
printf("\t\t=======4、 学生成绩降序排序 =======\n");
printf("\t\t=======5、 输出成绩最值学生信息 =======\n");
printf("\t\t=======6、 销毁班级 =======\n");
printf("\t\t=======0、 退出 =======\n");
//菜单
int menu =0;
//初始化人数
int size = 0;
do
{
printf("请输入选项>>>");
scanf("%d",&menu);
getchar();
//多分支选择执行对应功能
switch(menu)
{
case 1://创建班级
printf("请输入班级人数:");
scanf("%d",&size);
getchar();
//定义指针接收申请的班级结构体内存
class *P =Create_Stu(size);
break;
case 2://录入学生信息
Enter_Stu(P,P->size);
break;
case 3://查看学生信息
Print_Stu(P,P->size);
break;
case 4://按成绩降序排序
Sort_Stu(P,P->size);
//输出排序后信息
Print_Stu(P,P->size);
break;
case 5://输出成绩最值学生信息
Print_Best(P,P->size);
break;
case 6://销毁班级容器
destroy(P);
P == NULL;
printf("销毁成功\n");
break;
case 0://退出
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while(menu !=0);
return 0;
}