学生信息管理系统
主要功能:
1、开辟空间
2、学生姓名编号及成绩输入
3、全部学生信息输出
4、计算平均成绩
5、优秀学生信息
6、待提高学生信息
7、退出程序
主要使用的知识点:
结构体:自定义一个存放学生信息的结构体数据类型
枚举:用来存放一些返回值,以及操作数对应的值
malloc、memset、free:对空间进行操作
结构体指针、二级指针、自定义函数、while循环结构、switch选择结构等
头文件、结构体、枚举内容
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum VALUE
{
NUM_ERROR = -4,
NULL_ERROR = -3,
MALLOC_ERROR,
ERROR,
OK,
MALLOC,
INPUT,
OUTPUT,
AVE,
GOOD,
BAD,
QUIT,
};
//学生信息结构体
typedef struct student
{
char name[20];
int ID;
float Score; //成绩
}Stu;
主函数内容
int main(int argc, const char *argv[])
{
//定义即将存储申请到空间的首地址
Stu *person = NULL;
//指向临时新空间的首地址
Stu *pTemp = NULL;
//代表临时空间中学生的个数
int TempCount = 0;
int Option;
//count代表班级人数
int count;
//存储第一门成绩的平均分
float first_ave;
//使用死循环进行选择
while(1)
{
//菜单函数
menu();
printf("请输入需要进行的选择:\n");
scanf("%d",&Option);
//判断啥时候退出
if(QUIT == Option)
{
printf("退出程序OK!\n");
break;
}
switch(Option)
{
case MALLOC:
{
printf("请输入班级的人数:\n");
scanf("%d",&count);
//申请
if(MyMalloc(&person, count) < 0)
{
return ERROR;
}
printf("申请%d个学生的地址空间成功!\n",count);
//在申请以后可能还会用到的空间
if(MyMalloc(&pTemp, count) < 0)
{
printf("申请临时新空间失败!\n");
free(person);
person = NULL;
return ERROR;
}
printf("申请最多可以存储%d个学生信息的临时新空间成功!\n",count);
break;
}
case INPUT:
{
//输入
if(MyInput(person, count) < 0)
{
//释放空间
free(person);
person = NULL;
return ERROR;
}
printf("输入学生信息完毕!\n");
break;
}
case OUTPUT:
{
//输出---》默认查看所有学生信息
if(MyOutput(person, count) < 0)
{
free(person);
person = NULL;
return ERROR;
}
printf("输出学生信息完毕!\n");
break;
}
case FIR_AVE:
{
if(MyFirAve(person, count,&first_ave) < 0)
{
printf("第一门成绩平均分失败!\n");
}
else
{
printf("第一门成绩平均分为:%.1f\n",first_ave);
}
break;
}
case TWO_BAD:
{
//对于pTemp的空间进行清空
TempCount = 0;
memset(pTemp, '\0', sizeof(Stu) * count);
if(MyTwoBad(person, count, pTemp, &TempCount) < 0)
{
printf("查找两门成绩不合格的操作失败!\n");
}
else
{
printf("查找两门成绩不合格的操作成功,信息分别如下:\n");
MyOutput(pTemp, TempCount);
}
break;
}
case GOOD:
{
//对于pTemp的空间进行清空
TempCount = 0;
memset(pTemp, '\0', sizeof(Stu) * count);
if(MyGood(person, count, pTemp, &TempCount) < 0)
{
printf("获得优秀学生信息失败!\n");
}
else
{
printf("获得优秀学生信息成功,输出为:\n");
MyOutput(pTemp, TempCount);
}
break;
}
default:
printf("输入指令不对!!!\n");
}
}
//释放空间
free(person);
person = NULL;
return 0;
}
子函数内容
1、开辟空间
int MyMalloc(Stu** pper,int n) //定义一个二级指针存放指向 指向结构体首地址
{ //的地址,n接收学生个数
if( NULL == pper) //对接收的地址进行判断,为空的话返回空错误
{
return NULL_ERROR;
}
if( n < 0 ) //判断输入学生人数是否合法
{
return NUM_ERROR;
}
//申请空间 pper == &per -->*pper = per,也即使结构体指针的首地址
* pper = (Stu*)malloc(sizeof(Stu) * n); //指向新申请的空间
if(NULL == *pper)
{
//printf("申请失败!\n");
return MALLOC_ERROR;
}
memset(* pper,'\0',sizeof(Stu) * n); //对空间初始化
return OK;
}
2、信息输入
int MyInput(Stu* fper,int n)
{
if(NULL == fper)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
printf("按照姓名、编号、成绩(三门)的顺序进行输入!\n");
int i = 0;
for (i = 0;i < n;i++)
{
printf("请输入第%d个学生的信息:",i+1);
//信息输入,(fper+i)-》name是地址
scanf("%s%*c%d%f",(fper+i)->name,&(fper+i)->ID,&(fper+i)->Score);
}
printf("信息输入成功!\n");
return OK;
}
3、信息输出
int MyOutput(Stu* fper,int n)
{
if(NULL == fper)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
printf("输出学生信息:\n");
int i = 0;
for (i = 0;i < n;i++)
{
printf("第%d个学生的信息为:",i+1);
printf("%s %d %f\n",(fper+i)->name,(fper+i)->ID,(fper+i)->Score);
}
return OK;
}
4、计算平均成绩
int MyAve(Stu* fper,int n,float* ave) //用一个指向float的指针来接收平均成绩的地址
{
if(NULL == fper || NULL == ave)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
float sum = 0;
int i = 0;
for (i = 0;i < n; i++)
{
sum += (fper+i)->Score;
}
*ave = sum / n;
return OK;
}
5、查看谁是成绩好的学生,并存入临时空间
int MyGOOD(Stu *fper,int n,Stu *fpstu,int* m)
{
if(NULL == fper || NULL == fpstu||NULL == m)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
int i = 0;
int index = 0;
for (i = 0; i < n;i++)
{
if((fper+i)->Score >= 180) //对成绩进行判断,大于180为优秀,在临时空间存下该学生信息
{
*(fpstu+index) = *(fper+i);
index++;
}
}
*m = index;
if(*m == 0)
{
printf("该班无好学生!\n");
}
return OK;
}
6、查看谁是成绩差的学生,并存入临时空间
int MyBAD(Stu *fper,int n,Stu *fpstu,int* m)
{
if(NULL == fper || NULL == fpstu||NULL == m)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
int i = 0;
int index = 0;
for (i = 0; i < n;i++)
{
if((fper+i)->Score < 180)
{
*(fpstu+index) = *(fper+i);
index++;
}
}
*m = index;
if(*m == 0)
{
printf("该班无坏学生!\n");
}
return OK;
}
全部代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum VALUE
{
NUM_ERROR = -4,
NULL_ERROR = -3,
MALLOC_ERROR,
ERROR,
OK,
MALLOC,
INPUT,
OUTPUT,
AVE,
GOOD,
BAD,
QUIT,
};
//学生信息结构体
typedef struct student
{
char name[20];
int ID;
float Score; //成绩
}Stu;
//菜单的实现
void menu()
{
printf("*****1、开辟空间(输入班级人数)**\n");
printf("*****2、学生姓名编号及三门成绩输入\n");
printf("*****3、全部学生信息输出**********\n");
printf("*****4、计算平均成绩**************\n");
printf("*****5、优秀学生信息**************\n");
printf("*****6、待提高学生信息************\n");
printf("*****7、使用完毕,退出程序!******\n");
}
//空间开辟
int MyMalloc(Stu** pper,int n) //定义一个二级指针存放指向 指向结构体首地址
{ //的地址,n接收学生个数
if( NULL == pper) //对接收的地址进行判断,为空的话返回空错误
{
return NULL_ERROR;
}
if( n < 0 ) //判断输入学生人数是否合法
{
return NUM_ERROR;
}
//申请空间 pper == &per -->*pper = per,也即使结构体指针的首地址
* pper = (Stu*)malloc(sizeof(Stu) * n); //指向新申请的空间
if(NULL == *pper)
{
//printf("申请失败!\n");
return MALLOC_ERROR;
}
memset(* pper,'\0',sizeof(Stu) * n); //对空间初始化
return OK;
}
//信息输入
int MyInput(Stu* fper,int n)
{
if(NULL == fper)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
printf("按照姓名、编号、成绩(三门)的顺序进行输入!\n");
int i = 0;
for (i = 0;i < n;i++)
{
printf("请输入第%d个学生的信息:",i+1);
//信息输入,(fper+i)-》name是地址
scanf("%s%*c%d%f",(fper+i)->name,&(fper+i)->ID,&(fper+i)->Score);
}
printf("信息输入成功!\n");
return OK;
}
//信息输出
int MyOutput(Stu* fper,int n)
{
if(NULL == fper)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
printf("输出学生信息:\n");
int i = 0;
for (i = 0;i < n;i++)
{
printf("第%d个学生的信息为:",i+1);
printf("%s %d %f\n",(fper+i)->name,(fper+i)->ID,(fper+i)->Score);
}
return OK;
}
//计算平均成绩
int MyAve(Stu* fper,int n,float* ave) //用一个指向float的指针来接收平均成绩的地址
{
if(NULL == fper || NULL == ave)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
float sum = 0;
int i = 0;
for (i = 0;i < n; i++)
{
sum += (fper+i)->Score;
}
*ave = sum / n;
return OK;
}
//找出好学生,将好学生的信息存到临时空间,再通过输出函数进行输出;
int MyGOOD(Stu *fper,int n,Stu *fpstu,int* m)
{
if(NULL == fper || NULL == fpstu||NULL == m)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
int i = 0;
int index = 0;
for (i = 0; i < n;i++)
{
if((fper+i)->Score >= 180) //对成绩进行判断,大于180为优秀,在临时空间存下该学生信息
{
*(fpstu+index) = *(fper+i);
index++;
}
}
*m = index;
if(*m == 0)
{
printf("该班无好学生!\n");
}
return OK;
}
//输出成绩不好的学生,思路跟好的一致
int MyBAD(Stu *fper,int n,Stu *fpstu,int* m)
{
if(NULL == fper || NULL == fpstu||NULL == m)
{
return NULL_ERROR;
}
if(n < 0)
{
return NUM_ERROR;
}
int i = 0;
int index = 0;
for (i = 0; i < n;i++)
{
if((fper+i)->Score < 180)
{
*(fpstu+index) = *(fper+i);
index++;
}
}
*m = index;
if(*m == 0)
{
printf("该班无坏学生!\n");
}
return OK;
}
int main(int argc, const char *argv[])
{
//定义一个结构体指针,用来存储即将申请到的空间的首地址
Stu* per = NULL;
Stu* pstu = NULL; //存放临时新空间的首地址,用来对
//好学生,坏学生的输入输出
int Num; //定义学生人数
int pNUm = 0; //好学生坏学生的人数,每次需要置0完成动态变化
int Opt; //定义一个操作数,根据操作数进行操作,输入为7时退出系统
//使用死循环进行输入
float ave = 0; //存放平均成绩
while(1)
{
menu(); //打印菜单
printf("输入需要进行的操作:"); //操作数输入
scanf("%d",&Opt);
if(7 == Opt) //操作数为7时退出循环
{
printf("程序退出!");
break;
}
switch(Opt)
{
case MALLOC: //输入1时,进行空间开辟,分别开辟存放全部学生信息
{ //的空间以及临时空间
printf("输入班级人数:\n");
scanf("%d",&Num);
if(MyMalloc(&per,Num) < 0)
{
printf("申请失败!\n");
return ERROR;
}
if(MyMalloc(&pstu,Num) < 0) //临时空间
{
free(per);
per = NULL;
return MALLOC_ERROR;
}
printf("空间申请成功!\n");
break;
}
case INPUT:
{
if(MyInput(per,Num) < 0) //信息输入
{
//信息输入有问题,释放申请的空间
free(per);
per = NULL;
return ERROR;
}
printf("输入成功!\n");
break;
}
case OUTPUT:
{
if(MyOutput(per,Num) < 0) //信息输出
{
free(per);
per = NULL;
return ERROR;
}
printf("输出成功!\n");
break;
}
case AVE:
{
if(MyAve(per,Num,&ave) < 0) //平均成绩输出
{
free(per);
per = NULL;
return ERROR;
}
printf("平均成绩为:%f\n",ave);
break;
}
case GOOD: //成绩好的学生输出
{
//先把存放临时学生信息的空间进行置空
pNUm = 0;
memset(pstu,'\0',sizeof(Stu) * Num);
if(MyGOOD(per,Num,pstu,&pNUm) < 0)
{
return ERROR;
}else
{
MyOutput(pstu,pNUm);
printf("优秀学生信息输出完成!\n");
}
break;
}
case BAD: //成绩坏的学生
{
pNUm = 0;
memset(pstu,'\0',sizeof(Stu) * Num);
if(MyBAD(per,Num,pstu,&pNUm) < 0)
{
return ERROR;
}else
{
MyOutput(pstu,pNUm);
printf("待提高学生信息输出完成!\n");
}
break;
}
default:
{
printf("指令有误,程序退出!\n");
Opt = 7;
}
}
}
free(per);
per = NULL;
return 0;
}