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");
}
四、运行截图
主菜单
展示所有
增加
查询
修改
删除