一、思维导图
内存分配
二、课后习题
分文件编译
//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赋给班级结构体的sizeptr->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;
}