【学生成绩管理信息系统_C语言实现】

1.需求分析

学生成绩管理信息系统
(1)使用结构体数组实现。N=100;
(2)基于结构体数组,实现初始化、插入、删除、查找等基本操作;
(3)利用文件实现学生信息的保存、读取操作。

#define STUDSIZE 100
#define SCSIZE 3
struct Student
{
	unsigned int id;				//学号
	char name[10];					//姓名
	char sex[4];					//性别
	unsigned int age;				//年龄
	float score[SCSIZE];			//科目成绩
	float sum;						//总分
	float ave;						//平均分
};
struct StudentMan
{
	struct Student data[STUDSIZE];	//成绩科目(语文、数学、物理)
	int cursize;					//学生数量
	int maxsize;					//容量
};

2.系统设计

2.1、设计目的:
(1)系统界面简洁易操作;
(2)能够从磁盘文件夹中加载数据;
(3)可以将信息保存到磁盘中;
(4)系统具有增加、查询、显示和删除的功能;
2.2、系统功能:

1.添加学生信息
2.保存学生信息
3.加载学生信息
4.显示学生信息
5.查找学生信息
6.删除学生信息
7.修改学生信息

2.3、模块划分:

在这里插入图片描述

1.添加学生信息模块:该模块根据提示信息分别输入学生的学号、姓名、性别、年龄以及语文、数学和物理三门课程的考试成绩,输入的信息保存在结构体数组中。
struct Student InputStudent(struct StudentMan* sp)
{
	assert(sp != NULL);
	struct Student st = { 0 };
	printf("请输入学生学号:\n");
	scanf_s("%d", &st.id);
	while (Find_Id(sp, st.id) != -1)
	{
		printf("输入学号重复\n");
		printf("请输入学生学号:\n");
		scanf_s("%d", &st.id);
	}
	rewind(stdin);					//清空缓冲区
	printf("请输入学生姓名:\n");
	gets_s(st.name, 10);
	printf("请输入学生性别:\n");
	gets_s(st.sex, 4);
	while (!(strcmp(st.sex, "男") == 0 || strcmp(st.sex, "女") == 0))
	{
		printf("请输入正确学生性别: \n");
		gets_s(st.sex, 4);
	}
	printf("请输入学生年龄:\n");
	scanf_s("%d", &st.age);
	while (st.age < 14 || st.age>49)
	{
		printf("请输入正确学生年龄:\n");
		scanf_s("%d", &st.age);
	}
	printf("请输入学生成绩:\n");
	for (int i = 0; i < SCSIZE; ++i)
	{
		printf("输入 第 %d 门成绩: \n", i + 1);
		scanf_s("%f", &st.score[i]);
		if (st.score[i] < 0 || st.score[i]>100)
		{
			printf("输入 第 %d 门成绩: \n", i + 1);
			scanf_s("%f", &st.score[i]);
		}
		st.sum = st.sum + st.score[i];
	}
	st.ave = st.sum / SCSIZE;
	return st;
}
bool Add_Student(struct StudentMan* sp)
{
	assert(sp != NULL);
	if (Is_Full(sp)) return false;
	struct Student st = InputStudent(sp);
	sp->data[sp->cursize] = st;
	sp->cursize += 1;
	return true;
}

由于是结构体数组里面存的是随机值,利用起来不方便,所以需要一个初始化、获取学生数量、判空和判满函数!

void Init_StudentMan(struct StudentMan* sp)
{
	assert(sp != NULL);
	sp->cursize = 0;
	sp->maxsize = STUDSIZE;
	memset(sp->data, 0, sizeof(struct Student) * sp->maxsize);
}
int Get_StudentSize(const struct StudentMan* sp)
{
	assert(sp != NULL);
	return sp->cursize;
}
bool Is_Full(const struct StudentMan* sp)
{
	assert(sp != NULL);
	return Get_StudentSize(sp) == sp->maxsize;
}
bool Is_Empty(const struct StudentMan* sp)
{
	assert(sp != NULL);
	return Get_StudentSize(sp) == 0;
}
2.查找学生信息模块:该模块可以实现按学号和姓名查询;
int Find_Id(const struct StudentMan* sp, int id)
{
	int pos = -1;
	if (NULL == sp) return pos;
	for (int i = 0; i < sp->cursize; ++i)
	{
		if (sp->data[i].id == id)
		{
			pos = i;
			break;
		}
	}
	return pos;
}
int Find_Name(const struct StudentMan* sp, char* name)
{
	int pos = -1;
	if (NULL == sp || NULL == name) return pos;
	for (int i = 0; i < sp->cursize; ++i)
	{
		if (strcmp(sp->data[i].name,name) == 0)
		{
			pos = i;
			break;
		}
	}
	return pos;
}
void Find_Student(const struct StudentMan* sp)
{
	assert(sp != NULL);
	int id;
	char name[10];
	int selete = 0;
	int pos = -1;
	do
	{
		printf("****************\n");
		printf("* 1.按学号查询 *\n");
		printf("* 2.按姓名查询 *\n");
		printf("* 0.退出查询   *\n");
		printf("****************\n");
		printf("请输入你的选择\n");
		scanf_s("%d", &selete);
		switch (selete)
		{
		case 0: printf("退出查询\n");  break;
		case 1:
			printf("请输入要查询的学生学号:\n");
			scanf_s("%d", &id);
			if ((pos = Find_Id(sp, id)) != -1)
			{
				PrintStudent(sp,pos);
			}
			else
			{
				printf("无此学生信息\n");
			}
			break;
		case 2:
			printf("请输入要查询的学生姓名:\n");
			scanf_s("%s", &name,10);
			if ((pos = Find_Name(sp, name)) != -1)
			{
				PrintStudent(sp,pos);
			}
			else
			{
				printf("无此学生信息\n");
			}
			break;
		default:
			printf("输入错误,请重新选择");
			break;
		}

	} while (selete != 0);
}

既然查询到了当然需要将此学生信息打印出来呀~

void PrintStudent(const struct StudentMan* sp,int Index)
{
	if (NULL == sp || Index<0 || Index>sp->cursize) return;
	printf("*************学生信息**************\n");
	printf("学号:      %d\n", sp->data[Index].id);
	printf("姓名:      %s\n", sp->data[Index].name);
	printf("性别:      %s\n", sp->data[Index].sex);
	printf("年龄:      %d\n", sp->data[Index].age);
	printf("语文成绩:  %.2f\n", sp->data[Index].score[0]);
	printf("数学成绩:  %.2f\n", sp->data[Index].score[1]);
	printf("物理成绩:  %.2f\n", sp->data[Index].score[2]);
	printf("总分:      %.2f\n", sp->data[Index].sum);
	printf("平均分:    %.2f\n", sp->data[Index].ave);
	printf("***********************************\n");
}
3.修改学生信息模块:该模块可以实现按学号和姓名删除;
void ModifyStudent(struct StudentMan* sp)
{
	assert(sp != NULL);
	char name[10];
	char sex[4];
	int age;
	int selete = 0;
	int id;
	int pos;
	char ch;
	do
	{
		printf("请输入修改学生的学号\n");
		scanf_s("%d", &id);
		pos = Find_Id(sp, id);
		if (pos != -1)
		{
			do
			{
				if (pos != -1)
				{
					printf("*   %s 学生信息修改程序  *\n",sp->data[pos].name);
					printf("****************************\n");
					printf("*       1.修改姓名         *\n");
					printf("*       2.修改性别         *\n");
					printf("*       3.修改年龄         *\n");
					printf("*  0.退出当前学生信息修改  *\n");
					printf("****************************\n");
					printf("请输入你的选项\n");
					scanf_s("%d", &selete);
					switch (selete)
					{
					case 0: printf("退出当前学生信息修改\n"); break;
					case 1:
						printf("请输入你需要修改的名字\n");
						scanf_s("%s", &name,10);
						strcpy(sp->data[pos].name, name);
						printf("修改成功\n");
						break;
					case 2:
						printf("请输入你需要修改的性别\n");
						scanf_s("%s", &sex,4);
						while (!(strcmp(sex, "男") == 0 || strcmp(sex, "女") == 0))
						{
							printf("请输入正确学生性别: \n");
							scanf_s("%s", &sex, 4);
						}
						strcpy(sp->data[pos].sex, sex);
						printf("修改成功\n");
						break;
					case 3:
						printf("请输入你需要修改的年龄\n");
						scanf_s("%d", &age);
						sp->data[pos].age = age;
						printf("修改成功\n");
						break;
					default:
						printf("无此属性进行修改\n");
						break;
					}
				}
			} while (selete != 0);
			printf("* 修改后的学生信息 *\n");
			PrintStudent(sp, pos);
		}
		else
		{
			printf("查无此学生");
		}
		printf("是否继续修改其他学生的信息(Y/N)\n");
		rewind(stdin);
		ch = getchar();
	} while (ch == 'Y' || ch == 'y');
}
void ModifyScore(struct StudentMan* sp)
{
	assert(sp != NULL);
	float cn;
	int selete = 0;
	int id;
	int pos;
	char ch;
	do
	{
		printf("请输入修改学生的学号\n");
		scanf_s("%d", &id);
		pos = Find_Id(sp, id);
		if (pos != -1)
		{
			
			do
			{
				if (pos != -1)
				{
					printf("*   %s 学生成绩息修改程序  *\n", sp->data[pos].name);
					printf("********************************\n");
					printf("*       1.修改语文成绩         *\n");
					printf("*       2.修改数学成绩         *\n");
					printf("*       3.修改物理成绩         *\n");
					printf("*    0.退出当前学生成绩修改    *\n");
					printf("********************************\n");
					printf("请输入你的选项\n");
					scanf_s("%d", &selete);
					switch (selete)
					{
					case 0: printf("退出当前学生成绩修改\n"); break;
					case 1:
						printf("输入语文成绩: \n");
						scanf_s("%f", &cn);
						sp->data[pos].score[0] = cn;
						printf("修改成功");
						break;
					case 2:
						printf("输入数学成绩: \n");
						scanf_s("%f", &cn);
						sp->data[pos].score[1] = cn;
						printf("修改成功\n");
						break;
					case 3:
						printf("输入物理成绩: \n");
						scanf_s("%f", &cn);
						sp->data[pos].score[2] = cn;
						printf("修改成功\n");
						break;
					default:
						printf("无此科目的成绩可进行修改\n");
						break;
					}
				}
			} while (selete != 0);
			sp->data[pos].sum = 0;
			for (int i = 0; i < SCSIZE; ++i)
			{
				sp->data[pos].sum += sp->data[pos].score[i];
			}
			sp->data[pos].ave = sp->data[pos].sum / SCSIZE;
			printf("输出修改后的学生信息\n");
			PrintStudent(sp, pos);
		}
		else
		{
			printf("查无此学生");
		}
		printf("是否继续修改其他学生的成绩(Y/N)\n");
		rewind(stdin);
		ch = getchar();
	} while (ch == 'Y' || ch == 'y');
}
4.删除学生信息模块:该模块可以实现按学号和姓名删除;
void Remove_Student(struct StudentMan* sp,int pos)
{
	if (NULL == sp) return;
	if(pos<0 || pos>sp->cursize - 1) return;
	for (int i = pos; i < sp->cursize - 1; ++i)
	{
		sp->data[i] = sp->data[i + 1];
	}
	sp->cursize -= 1;
}
void Del_Student(struct StudentMan* sp)
{
	assert(sp != NULL);
	int id;
	char name[10];
	int selete = 0;
	int pos = -1;
	do
	{
		printf("****************\n");
		printf("* 1.按学号删除 *\n");
		printf("* 2.按姓名删除 *\n");
		printf("* 0.退出删除   *\n");
		printf("****************\n");
		printf("请输入你的选项\n");
		scanf_s("%d", &selete);
		switch (selete)
		{
		case 0: printf("退出删除程序\n");  break;
		case 1:
			printf("请输入要删除的学生学号:\n");
			scanf_s("%d", &id);
			if ((pos = Find_Id(sp, id)) != -1)
			{
				PrintStudent(sp, pos);
				printf("是否确定删除(Y/N):\n");
				rewind(stdin);
				char ch = getchar();
				//rewind(stdin);
				if (ch == 'y' || ch == 'Y')
				{
					Remove_Student(sp, pos);
					printf("删除成功\n");
				}
				else
				{
					break;
				}
			}
			else
			{
				printf("无此学生信息");
			}
			break;
		case 2:
			printf("请输入要删除的学生姓名:\n");
			scanf_s("%s", &name, 10);
			if ((pos = Find_Name(sp, name)) != -1)
			{
				PrintStudent(sp, pos);
				printf("是否确定删除(Y/N):\n");
				rewind(stdin);
				char ch = getchar();
				//rewind(stdin);
				if (ch == 'y' || ch == 'Y')
				{
					Remove_Student(sp, pos);
					printf("删除成功\n");
				}
				else
				{
					break;
				}
			}
			else
			{
				printf("无此学生信息");
			}
			break;
		default:
			printf("输入错误,请重新选择");
			break;
		}
	} while (selete != 0);
}
5.学生信息显示模块:该模块显示数组中所有学生信息;
void Show_Student(const struct StudentMan* sp)
{
	assert(sp != NULL);
	if (Is_Empty(sp)) return;
	printf("---------------------------------------------------------------------------------\n");
	printf("  学号  |  姓名  |  性别  |  年龄  |  语文  |  数学  |   物理  |  总分  | 平均分 |\n");
	//			9		9		 9		  9		  ...
	for (int i = 0; i < sp->cursize; ++i)
	{
		printf("%5d", sp->data[i].id);
		printf("%8s", sp->data[i].name);
		printf("%8s", sp->data[i].sex);
		printf("%9d", sp->data[i].age);
		for (int j = 0; j < SCSIZE; ++j)
		{
			printf("%10.2f", sp->data[i].score[j]);
		}
		printf("%10.2f", sp->data[i].sum);
		printf("%8.2f", sp->data[i].ave);
		printf("\n");
		printf("---------------------------------------------------------------------------------\n");
	}
}
6.保存学生信息模块:该模块将存储在数组中的学生信息保存到磁盘文件中;
void Save_Student(const struct StudentMan* sp)
{
	assert(sp != NULL);
	//打开文件
	FILE* fp = fopen("student.data", "wb");
	if (NULL == fp)
	{
		printf("打开文件失败\n");
		return;
	}
	//
	fwrite(&sp->cursize, sizeof(int), 1, fp);
	//
	fwrite(sp->data, sizeof(struct Student), sp->cursize, fp);
	//
	fclose(fp);
	fp = NULL;
}
7.加载学生信息模块:该模块将磁盘文件中保存的学生信息读取到内存的数组中;
void Load_Student(struct StudentMan* sp)
{
	assert(sp != NULL);
	FILE* fp = fopen("student.data", "rb");
	if (NULL == fp)
	{
		printf("打开文件失败\n");
		return;
	}
	fread(&sp->cursize, sizeof(int), 1, fp);
	int n = sp->cursize;
	fread(sp->data, sizeof(struct Student), n, fp);

	fclose(fp);
	fp = NULL;
}

简易学生管理系统就此完成了,如果需要完整代码可以滴滴我~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千北@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值