C语言简易学生管理系统

C语言实现简易学生管理系统(有源码)

一、实现方式

内存存储: 结构体数组
持久化: 二进制(.dat)
多文件操作: √
开发工具: VS2022
功能: 学生信息增删改查
开发目的:学习C语言多文件工程,结构体使用、文件操作、函数封装等

二、工程文件目录

工程文件目录

注: control.c封装的是各类菜单控制,包括主菜单控制、删除菜单控制、修改菜单控制,实现主体是一个switch语句

三、关键代码

结构体设计:

typedef struct pstStuInfo 
{
	/*学号、姓名、年龄、绩点*/
	char szNumber[20];
	char szName[10];
	int nAge;
	float fGPA;
	_Bool existStatus; /*存在状态*/
}STSTUDENT;
typedef STSTUDENT* PSTSTUDENT;

增加操作:

int AddStuInfo(PSTSTUDENT pstStuInfo) 
{
	int nPos = 0;
	char szTmpNmber[20], szTmpName[10];
	int nTmpAge;
	float fTmpGPA;

	/*
		找到结构体数组中的空位,赋值给nPos
	*/
	while (nPos < MAX_STUDENT_COUNT && (pstStuInfo + nPos)->existStatus)
	{
		nPos++;
	}
	system("cls");
	printf("\n\n");
	printf("\t\t依次输入学号、姓名、年龄、绩点\n");
	printf("\t\t学号:   ");
	scanf("%s", szTmpNmber);
	printf("\n");
	printf("\t\t姓名:   ");
	scanf("%s", szTmpName);
	printf("\n");
	printf("\t\t年龄:   ");
	scanf("%d", &nTmpAge);
	printf("\n");
	printf("\t\t绩点:   ");
	scanf("%f", &fTmpGPA);
	printf("\n");

	/*学号查重,重复则拒绝*/
	if (FindStuInLST(pstStuInfo, szTmpNmber) != -1)
	{
		printf("\t\t添加学生信息失败--学号已存在\n\t\t");
		system("pause");
		return -1;
	}
	/*检查姓名是否为中文,不是中文则重新输入*/
	while (!CheckNameInput(szTmpName))
	{
		printf("\t\t姓名必须为中文,请重新输入姓名\n");
		printf("\n");
		printf("\t\t姓名:   ");
		scanf("%s", szTmpName);
	}

	/*信息读入结构体*/
	strcpy((pstStuInfo + nPos)->szNumber, szTmpNmber);
	strcpy((pstStuInfo + nPos)->szName, szTmpName);
	(pstStuInfo + nPos)->nAge = nTmpAge;
	(pstStuInfo + nPos)->fGPA = fTmpGPA;
	/*标志位激活*/
	(pstStuInfo + nPos)->existStatus = true;

	/*写入文件*/
	WriteStuInSource(pstStuInfo + nPos, nPos);
	printf("\t\t增加学生 %s 成功\n\t\t", (pstStuInfo + nPos)->szName);
	system("pause");
	return nPos;
}

删除操作:

void DelStuInfoByNum(PSTSTUDENT pstStuInfo)
{
	char szNumDel[20];
	int nPosInLST;

	/*
		1. 先要找到对应学生在结构体中的位置
		2. 在结构体中删除学生(状态为置为false);
		3. 在文件中执行'假删除'操作--修改存在状态(执行一次修改操作)
	*/
	printf("\n\n");
	printf("\t\t输入要删除学生的学号:");
	getchar(); /*捕获从deleteMenu遗留的换行符*/
	gets(szNumDel);
	printf("\n");
	/*步骤1,找到位置*/
	nPosInLST = FindStuInLST(pstStuInfo,szNumDel);
	if (nPosInLST == -1)
	{
		printf("\t\t学生不存在,无法删除!\n\t\t");
		system("pause");
		return;
	}

	/*步骤2:在结构体数组中删除*/
	DelAStuInLST(pstStuInfo, nPosInLST);
	/*步骤3:在文件中删除*/
	DelAStuInResource(pstStuInfo, nPosInLST);

	printf("\t\t删除学生信息成功!\n");
}

查找操作

void SearchStuByNum(PSTSTUDENT pstStuInfo)
{
	char c = ' ';
	char szNumberForSearch[20];

	system("cls");
	getchar(); /** 获取从主菜单跳转过来的换行符 */
	printf("\n\n");
	printf("\t\t输入查找学生的学号\n");
	printf("\t\t学号:");
	/*输入学号*/
	gets(szNumberForSearch);

	/*找到学生在结构体数组中的位置*/
	int nResult = FindStuInLST(pstStuInfo, szNumberForSearch);
	if (nResult == -1) {
		printf("\t\t学生【%s】不存在\n", szNumberForSearch);
	}
	else
	{
		printf("\t\t学生【%s】信息如下:\n", szNumberForSearch);
		printf("\t\t\t姓名: 【%s】 \t\t", (pstStuInfo + nResult)->szName);
		printf("\t年龄: 【%d】 \n", (pstStuInfo + nResult)->nAge);
		printf("\t\t\t绩点: 【%-5.2f】 \t", (pstStuInfo + nResult)->fGPA);
	}
	printf("\n\t\t");
	system("pause");
}

修改操作

void MdfStuInfoByNum(PSTSTUDENT pstStuInfo)
{
	char szNumMdf[20];
	int nPosInLST;
	_Bool flag = true;

	system("cls");
	printf("\n\n");
	printf("\t\t输入需要修改信息的学生学号\n");
	printf("\t\t学号:");
	/*捕获主菜单回车*/
	getchar(); 
	/*输入学号*/
	gets(szNumMdf);

	/*找到学生在结构体数组中的位置,-1表示不存在*/
	nPosInLST = FindStuInLST(pstStuInfo, szNumMdf);
	if (nPosInLST == -1)
	{
		printf("\t\t学生不存在,无法修改!\n\t\t");
		system("pause");
		return;
	}

	/*循环修改信息,直到选择退出*/
	while (flag)
	{
		printf("\t\t学生【%s】信息如下\n", szNumMdf);
		printf("\t\t\t姓名: 【%s】 \t\t", (pstStuInfo + nPosInLST)->szName);
		printf("\t\t\t年龄: 【%d】 \n", (pstStuInfo + nPosInLST)->nAge);
		printf("\t\t\t绩点: 【%-5.2f】 \t", (pstStuInfo + nPosInLST)->fGPA);
		flag = ModifyMenuControl(pstStuInfo, nPosInLST);
		system("cls");
	}
}

展示所有

void ShowStuInfo(PSTSTUDENT pstStuInfo) 
{
	system("cls");
	if (pstStuInfo == NULL)
	{
		printf("暂无学生信息");
		return;
	}

	/*打印选定学生信息*/
	printf("\n\n");
	printf("\t\t学号\t\t姓名\t\t年龄\t\t绩点\t\t学费\n");
	printf("\t\t--------------------------------------------------------------------\n");
	for (int i = 0; i < MAX_STUDENT_COUNT; i++)
	{
		if(!(pstStuInfo + i)->existStatus) continue;
		printf("\t\t%-10s\t%-10s\t%-10d\t%-10.2f\t%-10d\n", (pstStuInfo + i)->szNumber, (pstStuInfo + i)->szName,
															(pstStuInfo + i)->nAge, (pstStuInfo + i)->fGPA)
															
		printf("\t\t--------------------------------------------------------------------\n");
	}
	printf("\n\t\t");
	system("pause");
}

四、运行截图

主菜单
主菜单
展示所有
在这里插入图片描述
增加
在这里插入图片描述
查询
在这里插入图片描述
修改
在这里插入图片描述删除
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值