一、思维导图
二、顺序表实现学生管理系统
//头文件
#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;
}