【C语言】实现一个学生信息管理系统

主要功能:

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值