一、思维导图
二、顺序表实现学生管理系统
//头文件
#ifndef TEST_H
#define TEST_H
#define MAX_SIZE 100//定义学生类型
typedef struct
{char name[20]; //姓名int age; //年龄double score; //分数
}datatype;//定义班级类型
typedef struct
{datatype student[MAX_SIZE]; //定义学生容器int size; //实际学生人数
}class,*class_ptr;//函数声明
//创建班级函数
class_ptr Create_Stu();//判空函数
int Empty(class_ptr P);//判满函数
int Full(class_ptr P);//信息录入
int Enter_Stu(class_ptr P);//学生信息输出
void Print_Stu(class_ptr P);//按姓名查找学生位置
int Search_name(class_ptr P,const char *ptr);//按位置输出学生信息
void Print_pos(class_ptr P,int pos);//按位置修改学生新信息
int Update_pos(class_ptr P,int pos);//按位置删除学生信息
int Delete_pos(class_ptr P,int pos);//学生信息去重
int Unique(class_ptr P);//按成绩降序排序
void Sort_Stu(class_ptr P);//输出成绩最值学生信息
void Print_Best(class_ptr P);//销毁班级容器
void destroy(class_ptr P);#endif
//功能函数
#include <myhead.h>
#include "sys.h"//创建班级
class_ptr Create_Stu()
{//申请堆区空间class_ptr P = (class_ptr)malloc(sizeof(class));if(NULL == P){printf("创建失败\n");return NULL;}//申请成功//给申请空间初始化memset(P,0,sizeof(class));P->size =0;//将内存地址返回printf("创建班级成功\n");return P;
}//判空函数
int Empty(class_ptr P)
{return P->size ==0;
}//判满函数
int Full(class_ptr P)
{return P->size ==MAX_SIZE;
}//信息录入
int Enter_Stu(class_ptr P)
{//判断合法性if(NULL == P || Full(P)){printf("error\n");return -1 ;}//录入学生信息printf("请输入学生姓名:");scanf("%s",P->student[P->size].name);getchar();printf("请输入学生年龄:");scanf("%d",&P->student[P->size].age);getchar();printf("请输入学生成绩:");scanf("%lf",&P->student[P->size].score);getchar();printf("\n");//录入完成//长度增加P->size++;printf("录入成功\n");return 0;
}//学生信息输出
void Print_Stu(class_ptr P)
{//判断合法性if(NULL == P || Empty(P)){printf("error\n");return;}//循环输出学生信息printf("**********学生信息如下*********\n");printf("姓名\t年龄\t成绩\n\n");for(int i=0;i<P->size;i++){printf("%s\t%d\t%lf\n",\P->student[i].name,P->student[i].age,P->student[i].score);printf("\n");}
}//按姓名查找学生位置
int Search_name(class_ptr P,const char *ptr)
{//判断合法性if(NULL == P || Empty(P)){printf("error\n");return 0 ;}//遍历查找for(int i =0;i<P->size;i++){if(strcmp(P->student[i].name , ptr ) == 0){//查找成功,返回下标 return i;} }return -1;
}//按位置输出学生信息
void Print_pos(class_ptr P,int pos)
{//判断合法性if(NULL == P || Empty(P) || pos < 0 || pos>P->size){printf("error\n");return ;}//输出信息printf("**********学生信息如下*********\n");printf("姓名\t年龄\t成绩\n\n");printf("%s\t%d\t%lf\n",\P->student[pos].name,P->student[pos].age,P->student[pos].score);printf("\n");
}//按位置修改学生新信息
int Update_pos(class_ptr P,int pos)
{//判断合法性if(NULL == P || pos < 0 || pos>P->size){printf("error\n");return -1;}//按位置重新输入刷新学生信息printf("请输入新学生姓名:");scanf("%s",P->student[pos].name);getchar();printf("请输入新学生年龄:");scanf("%d",&P->student[pos].age);getchar();printf("请输入新学生成绩:");scanf("%lf",&P->student[pos].score);getchar();printf("修改成功\n");return 0;
}//按位置删除学生信息
int Delete_pos(class_ptr P,int pos)
{//判断合法性if(NULL == P || Full(P) || pos < 0 || pos>P->size){printf("error\n");return -1;}//删除for(int i=pos+1;i<P->size;i++){P->student[i-1] = P->student[i];}//删除成功P->size--;printf("删除成功\n");return 0;
}//学生信息去重//按成绩降序排序
void Sort_Stu(class_ptr P)
{//判断合法性if(NULL == P || Full(P)){printf("error\n");return;}printf("************对学生成绩进行排序***********\n"); for(int i=1;i<P->size;i++){for(int j=0;j<P->size;j++){if(P->student[j].score < P->student[j+1].score){//交换位置datatype temp = P->student[j];P->student[j] = P->student[j+1];P->student[j+1] = temp;}}}//排序成功printf("排序成功\n");
}//输出成绩最值学生信息
void Print_Best(class_ptr P)
{//判断是否成功申请内存if(NULL == P){printf("error\n");return ;}//定义最值学生容器datatype stu_max;datatype stu_min;//定义最值分数容器double max_score = 0;double min_socre = 0;//将第一个学生当做最值stu_max = *P->student;stu_min = *P->student;max_score = P->student[0].score;min_socre = P->student[0].score;//循环比较刷新最值for(int i=1;i<P->size;i++){if(P->student[i].score > max_score){max_score = P->student[i].score;stu_max = P->student[i];}if(P->student[i].score < min_socre){min_socre = P->student[i].score;stu_min = P->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 P)
{//释放内存if(P != NULL){free(P);P = NULL;}
}
//主函数
#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=======7、 学生成绩降序排序 =======\n");printf("\t\t=======8、 输出成绩最值学生信息 =======\n"); printf("\t\t=======9、 销毁班级 =======\n"); printf("\t\t=======0、 退出 =======\n"); //菜单int menu =0;char value[20];//定义指针接收申请的班级结构体内存class_ptr P = NULL;do{printf("请输入选项>>>");scanf("%d",&menu);getchar();//多分支选择执行对应功能switch(menu){case 1://创建班级//指针接收申请的班级结构体内存P =Create_Stu();break;case 2://录入学生信息Enter_Stu(P);break;case 3://浏览学生信息Print_Stu(P);break;case 4://查找学生信息{printf("请输入您需要查找的学生姓名:");scanf("%s",value);getchar();//按姓名查找学生位置int res4 = Search_name(P,value);//按位置输出学生信息Print_pos( P,res4);}break;case 5://修改学生信息 {printf("请输入您需要修改的学生姓名:");scanf("%s",value);getchar();//按姓名查找学生位置int res5 = Search_name(P,value);//按位置修改学生新信息Update_pos(P,res5);}break;case 6://删除学生信息 {printf("请输入您需要删除的学生姓名:");scanf("%s",value);getchar();//按姓名查找学生位置int res6 = Search_name(P,value);//按位置删除学生新信息Delete_pos(P,res6);}break;case 7://按成绩降序排序Sort_Stu(P);//输出排序后信息Print_Stu(P);break;case 8://输出成绩最值学生信息Print_Best(P);break;case 9://销毁班级容器destroy(P);P = NULL;printf("销毁成功\n");break;case 0://退出break;default:printf("输入错误,请重新输入\n");break;}} while(menu !=0);return 0;
}