【开发细节】用C语言基础写学生管理系统(六)

前情回顾


自定义preconf.hkernel_list.hsysbrowsesysdoc.h四个个头文件,完成了核心头文件前的预配置、核心头文件的操作、信息浏览系统的功能、文件数据流的读写操作。

一、本次目标


实现信息修改系统中的相关基础功能,以便于主程序调用。

图片名称 GitHub:https://github.com/ITchujian/StudentManagementSystem_2022_C

注:为方便分享本次开发的经历,我把分析过程以及代码书写过程,以文字、图片形式合计放于开发记录中,但是一些非常基础的行为动作我将不会讲解或者阐述。
当前位置:【开发细节】用C语言基础写学生管理系统(六)
可跳转:

二、开发记录


步骤1

创建头文件sysmodify.h,并引用核心头文件kernel_list.h
创建sysmodify.h

#include "kernel_list.h"

步骤2

在这里插入图片描述
根据之前的结构设计图,我们依然是要先做一个菜单,如下:

Status changeMenu(void)
{
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("┃                            【副】信 息 修 改 系 统                            ┃\n");
	printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("┃请选择操作:                                                                    ┃\n");
	printf("┃                             1 > 添 加 学 生                                   ┃\n");
	printf("┃                             2 > 修改学生信息                                  ┃\n");
	printf("┃                             3 > [危]删除学生                                  ┃\n");
	printf("┃                             4 > [危]重置空表                                  ┃\n");
	printf("┃                             0 > 返回主系统                                    ┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("\nINPUT:");
	return OK;
}

在其功能2修改学生信息中,我们肯定需要修改的数据项有:姓名学号性别年龄语文数学英语
平均分总分是根据前三科计算的,因此不用算人为修改,所以对应还要做一个分支菜单:

Status selectChange(void)
{
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("┃                    【副】信息修改系统> 修 改 学 生 信 息                      ┃\n");
	printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("┃请选择操作:                                                                    ┃\n");
	printf("┃                             1 > 修 改 姓 名                                   ┃\n");
	printf("┃                             2 > 修 改 学 号                                   ┃\n");
	printf("┃                             3 > 修 改 性 别                                   ┃\n");
	printf("┃                             4 > 修 改 年 龄                                   ┃\n");
	printf("┃                             5 > 修 改 语 文                                   ┃\n");
	printf("┃                             6 > 修 改 数 学                                   ┃\n");
	printf("┃                             7 > 修 改 英 语                                   ┃\n");
	printf("┃                             0 > 返回副系统                                    ┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("\nINPUT:");
	return OK;
}

步骤3

实现信息修改系统中的第一个功能——添加学生
首先临时申请一块动态内存,用来存储学生的所有数据信息,在通过kernel_list.h核心头文件中的ListInsert(SqList* L, int i, ElemType e)方法,往往在最后一位同学后面插入(空表也并不影响),不要忘了,要成为优秀的C语言程序员,怎么能够忘记free()呢?最后细节清屏,因为添加太多学生,容易使界面输出的信息过于,所以清屏操作还是很有必要的。

Status addStudent(SqList* L)
{
	ElemType* e = (ElemType*)malloc(sizeof(ElemType));
	if (e == NULL)
		exit(INFEASIBLE);
	printf("\n姓名:");
	scanf("%s", e->name);
	printf("\n学号:");
	scanf("%d", &(e->num));
	printf("\n性别:");
	scanf("%s", e->sex);
	printf("\n年龄:");
	scanf("%d", &(e->age));
	printf("\n语文:");
	scanf("%f", &(e->score_literature));
	printf("\n数学:");
	scanf("%f", &(e->score_math));
	printf("\n英语:");
	scanf("%f", &(e->score_english));
	e->average_score = (e->score_literature + e->score_math + e->score_english) / 3;
	e->sum_score = e->score_literature + e->score_math + e->score_english;
	ListInsert(L, L->length + 1, *e);
	free(e);
	system("cls");
	return OK;
}

步骤4

如何去实现改变学生信息这个功能呢?

遍历寻找到被修改的学生(学号)→通过访问其内存地址的方式修改相关值即可

Status changeElem(SqList* L, int num)
{
	ElemType* r = L->elem;
	int i = 1;
	while (i <= L->length && num != r->num)
	{
		i++;
		r++;
	}
	if (i >= 1 && i <= L->length)
	{
		do
		{
			selectChange();
			int change_item;
			scanf("%d", &change_item);
			switch (change_item)
			{
			case 1:
				scanf("%s", r->name);
				break;
			case 2:
				scanf("%d", &(r->num));
				break;
			case 3:
				scanf("%s", r->sex);
				break;
			case 4:
				scanf("%d", &(r->age));
				break;
			case 5:
				scanf("%f", &(r->score_literature));
				break;
			case 6:
				scanf("%f", &(r->score_math));
				break;
			case 7:
				scanf("%f", &(r->score_english));
				break;
			case 0:
				system("cls");
				return OK;
			default:
				return ERROR;
			}
		} while (1);
		return OK;
	}
	else
		return INFEASIBLE;
}

步骤5

删除学生这个功能也比较好实现,基于学号搜索学生的思路,我们再通过核心头文件中的ListInsert(SqList* L, int i, ElemType e)方法删除找到的学生。

Status deleteElem(SqList* L, int num)
{
	ElemType* r = L->elem;
	ElemType* e = (ElemType*)malloc(sizeof(ElemType));
	if (e == NULL)
		exit(INFEASIBLE);
	int i = 1;
	while (i <= L->length && num != r->num)
	{
		i++;
		r++;
	}
	ListDelete(L, i, e);
	printf("您已经删除了学生%s的信息\n", e->name);
	free(e);
	return OK;
}

步骤6

最后的重置学生信息表,其实也比较好理解,就是清空表里的数据嘛,代码如下:
这里增加一个’y’验证,防止用户误操作。

Status resetAll(SqList* L)
{
	getchar();
	char is_yes;
	printf("请输入y或Y确认:");
	scanf("%c", &is_yes);
	if (is_yes == 'y' || is_yes == 'Y')
		ClearList(L);
	else
		printf("未重置\n");
	return OK;
}

sysmodify.hの完整代码:

#pragma once
/*********************************************************************
 * 转载请注明来源/Reprint please indicate the source
 * @FileName sysmodify.h
 * @Description 学生信息修改系统/Student Information Modification System
 * @History
 * version      author      data       introduction and operations
 *  1.0         初见     2022-01-23             Create
 *  ***         ***      ****-**-**             *******
 */

#include "kernel_list.h"
 /*********************************************************************
  * @chujian(cn) 引入自定义头文件
  * @chujian(en) Import custom header files
  */

Status changeMenu(void)
{
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("┃                            【副】信 息 修 改 系 统                            ┃\n");
	printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("┃请选择操作:                                                                    ┃\n");
	printf("┃                             1 > 添 加 学 生                                   ┃\n");
	printf("┃                             2 > 修改学生信息                                  ┃\n");
	printf("┃                             3 > [危]删除学生                                  ┃\n");
	printf("┃                             4 > [危]重置空表                                  ┃\n");
	printf("┃                             0 > 返回主系统                                    ┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("\nINPUT:");
	return OK;
}
/*********************************************************************
 * @chujian(cn) 信息修改系统
 * @chujian(en) Information revision system
 */

Status selectChange(void)
{
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	printf("┃                    【副】信息修改系统> 修 改 学 生 信 息                      ┃\n");
	printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
	printf("┃请选择操作:                                                                    ┃\n");
	printf("┃                             1 > 修 改 姓 名                                   ┃\n");
	printf("┃                             2 > 修 改 学 号                                   ┃\n");
	printf("┃                             3 > 修 改 性 别                                   ┃\n");
	printf("┃                             4 > 修 改 年 龄                                   ┃\n");
	printf("┃                             5 > 修 改 语 文                                   ┃\n");
	printf("┃                             6 > 修 改 数 学                                   ┃\n");
	printf("┃                             7 > 修 改 英 语                                   ┃\n");
	printf("┃                             0 > 返回副系统                                    ┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf("\nINPUT:");
	return OK;
}
/*********************************************************************
 * @chujian(cn) 对应信息修改系统中的第二项
 * @chujian(en) Corresponds to the second item in the information modification system
 */

Status addStudent(SqList* L)
{
	ElemType* e = (ElemType*)malloc(sizeof(ElemType));
	if (e == NULL)
		exit(INFEASIBLE);
	printf("\n姓名:");
	scanf("%s", e->name);
	printf("\n学号:");
	scanf("%d", &(e->num));
	printf("\n性别:");
	scanf("%s", e->sex);
	printf("\n年龄:");
	scanf("%d", &(e->age));
	printf("\n语文:");
	scanf("%f", &(e->score_literature));
	printf("\n数学:");
	scanf("%f", &(e->score_math));
	printf("\n英语:");
	scanf("%f", &(e->score_english));
	e->average_score = (e->score_literature + e->score_math + e->score_english) / 3;
	e->sum_score = e->score_literature + e->score_math + e->score_english;
	ListInsert(L, L->length + 1, *e);
	free(e);
	system("cls");
	return OK;
}
/*********************************************************************
 * @chujian(cn) 添加学生
 * @chujian(en) Add a student
 */

Status changeElem(SqList* L, int num)
{
	ElemType* r = L->elem;
	int i = 1;
	while (i <= L->length && num != r->num)
	{
		i++;
		r++;
	}
	if (i >= 1 && i <= L->length)
	{
		do
		{
			selectChange();
			int change_item;
			scanf("%d", &change_item);
			switch (change_item)
			{
			case 1:
				scanf("%s", r->name);
				break;
			case 2:
				scanf("%d", &(r->num));
				break;
			case 3:
				scanf("%s", r->sex);
				break;
			case 4:
				scanf("%d", &(r->age));
				break;
			case 5:
				scanf("%f", &(r->score_literature));
				break;
			case 6:
				scanf("%f", &(r->score_math));
				break;
			case 7:
				scanf("%f", &(r->score_english));
				break;
			case 0:
				system("cls");
				return OK;
			default:
				return ERROR;
			}
		} while (1);
		return OK;
	}
	else
		return INFEASIBLE;
}
/*********************************************************************
 * @chujian(cn) 改变学生信息
 * @chujian(en) Change information of student
 */

Status deleteElem(SqList* L, int num)
{
	ElemType* r = L->elem;
	ElemType* e = (ElemType*)malloc(sizeof(ElemType));
	if (e == NULL)
		exit(INFEASIBLE);
	int i = 1;
	while (i <= L->length && num != r->num)
	{
		i++;
		r++;
	}
	ListDelete(L, i, e);
	printf("您已经删除了学生%s的信息\n", e->name);
	free(e);
	return OK;
}
/*********************************************************************
 * @chujian(cn) 删除学生信息
 * @chujian(en) Delete information of student
 */

Status resetAll(SqList* L)
{
	getchar();
	char is_yes;
	printf("请输入y或Y确认:");
	scanf("%c", &is_yes);
	if (is_yes == 'y' || is_yes == 'Y')
		ClearList(L);
	else
		printf("未重置\n");
	return OK;
}
/*********************************************************************
 * @chujian(cn) 重置学生信息表
 * @chujian(en) Reset student information sheet
 */

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

顾平安6

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

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

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

打赏作者

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

抵扣说明:

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

余额充值