班级学生成绩管理
1.设计题目与要求
设计实现一个模拟的班级学生成绩管理系统目的:通过学生成绩管理系统的设计,培养学生综合利用 C/C++ 语言进行程序设计的能力,加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力,培养学生利用系统提供的标准函数及典型算法进行设计。
基本要求:该系统用于管理学生的基本信息、课程成绩。要求实现以下功能:
① 通过此模块来管理课程信息,包括查询、添加、修改、删除等功能。在进行课程信息添加时,系统会自动监测所添加的信息是否已经存在,如果存在,会提示已经存在。在进行课程信息删除时,同样要求再次确定。
② 实现对学生信息、课程成绩的文件存取(分别存储在 StudentInfo.txt、StudentScore.txt 文件中),实现对学生信息、课程成绩的记录增加、删除及修改;
③ 实现输入学生学号或姓名查询并显示学生的课程成绩。
学生的基本信息记录,如:
学号 | 姓名 | 性别 | 出生日期 | 专业 |
---|---|---|---|---|
20050999 | 张三 | 男 | 1980 年 6 月 1 日 | 软件工程 |
…… | …… | …… | …… | …… |
学生的课程成绩记录,如:
学号 | 课程名称 | 学分 | 成绩 |
---|---|---|---|
20050999 | 毛泽东思想概论 | 4 | 60 |
20050999 | 高级语言程序设计 | 3 | 70 |
20050999 | Web 程序设计 | 2 | 80 |
20050999 | IT 企业管理 | 1 | 90 |
…… | …… | …… | …… |
2.设计软硬件环境
计算机:Surfacepro6 处理器:I5-8250U1.8GHZ 内存容量:8.00GB 操作系统:Windows10 企业版 IDE:Devc++
3.功能设计与描述
(一)班级学生成绩管理系统功能:
1.按学号/姓名查询学生成绩
2.查询学生信息
3.按学号/姓名查询学生信息
4.学生信息的增加/修改/删除
5.查询课程信息
6.课程信息的增加/修改/删除
7.对存有学生信息及成绩信息的文件进行读写功能模块图如下:
图 1:班级学生成绩管理系统的功能模块图
(二)班级学生成绩管理系统算法设计:
1.学生成绩查询流程图:
图 2:学生成绩查询算法流程图
2.学生信息查询流程图:
图 3:学生信息查询算法流程图 3.学生信息修改算法流程图
图 4:学生信息修改算法流程图
4.学生信息添加算法流程图
图 5:学生信息添加算法流程图 5.学生信息删除算法流程图
图 6:学生信息删除算法流程图 6.课程信息查询算法流程图:
图 7:课程信息查询算法流程图
7.课程信息增加算法流程图:
图 8:课程信息增加算法流程图
8.课程信息修改算法流程图:
图 9:课程信息修改算法流程图 9.课程信息删除算法流程
图 10:课程信息删除算法流程图
4.源程序代码清单
# include<stdio.h>
# include<stdlib.h>
# include <unistd.h>
# include"validation.h"
# include"stmanagement.h"
# include"clmanagement.h"
# include"Linklist.h"
# include"searchway.h"
int validation(int,int); //合法性验证
void classmenu(NodeB **TB,NodeA **TA); //课程信息管理菜单
void studentmenu(NodeB **TB,NodeA **TA); //学生信息管理菜单
void classqeury(NodeB **TB,NodeA **TA); //课程信息显示
void classmanagement(NodeB **TB,NodeA **TA); //课程信息管理
void studentquery(NodeB **TB,NodeA **TA); //学生信息查询
void studentmanagement(NodeB **TB,NodeA **TA); //学生信息管理
void stresult(NodeB **TB,NodeA **TA); //学生成绩查询
void themenu(NodeB **TB,NodeA **TA); //主菜单
int main(void){
NodeA *TA=NULL;//学生信息
NodeB *TB=NULL;//学生成绩
TA=initializeA();//学生信息初始化
TB=initializeB();//学生成绩初始化
themenu(&TB,&TA);//主菜单
return 0;
}
void themenu(NodeB **TB,NodeA **TA){
int x=-1,y=2;
printf("**************************************欢迎使用班级学生成绩管理系统**************************************\n");
printf("* 请选择需要使用的功能 *\n");
printf("* 1.课程信息管理 *\n");
printf("* 2.学生信息管理 *\n");
printf("* 3.学生成绩查询 *\n");
printf("* 0.退 出 *\n");
printf("********************************************************************************************************\n");
while(x==-1){
scanf("%d",&x);
x=validation(x,3);//合法性验证
switch(x){
case 1:system("cls"); classmenu(TB,TA); break;//课程信息管理
case 2:system("cls"); studentmenu(TB,TA); break;//学生信息管理
case 3:system("cls"); stresult(TB,TA); break;//成绩查询
case 0: printf("再见");stdatewritten(TA);cldatewritten(TB); exit(1); //数据写入文件并退出
case -1: break;
}
}
}
void classmenu(NodeB **TB,NodeA **TA){
int x=-1;
printf("**********************************************课程信息管理**********************************************\n");
printf("* 请选择需要使用的功能 *\n");
printf("* 1.课程信息查询 *\n");
printf("* 2.课程信息管理 *\n");
printf("* 3.返回上一级 *\n");
printf("* 0.退出 *\n");
printf("********************************************************************************************************\n");
while(x==-1){
scanf("%d",&x);
x=validation(x,3);//合法性验证
switch(x){
case 1:system("cls");TraverseNodeB(*TB); themenu(TB,TA); break;
case 2:system("cls"); classmanagement(TB,TA); themenu(TB,TA); break;//课程查询
case 3:system("cls"); themenu(TB,TA); break;//课程管理
case 0: printf("再见");stdatewritten(TA);cldatewritten(TB); exit(1); //数据写入文件并退出
}
}
}
void studentmenu(NodeB **TB,NodeA **TA){
int x=-1;
printf("**********************************************学生信息管理**********************************************\n");
printf("* 请选择需要使用的功能 *\n");
printf("* 1.学生信息查询 *\n");
printf("* 2.学生信息管理 *\n");
printf("* 3.返回上一级 *\n");
printf("* 0.退出 *\n");
printf("********************************************************************************************************\n");
while(x==-1){
scanf("%d",&x);
x=validation(x,3);//合法性验证
switch(x){
case 1:system("cls");studentquery(TB,TA); break;//学生信息查询
case 2:system("cls");studentmanagement(TB,TA); break;//学生信息管理
case 3:system("cls");themenu(TB,TA); break;//主菜单
case 0:printf("再见");stdatewritten(TA);cldatewritten(TB); exit(1); //数据写入文件并退出
case -1: break;
}
}
}
void classmanagement(NodeB **TB,NodeA **TA){//课程信息管理
printf("**********************************************课程信息管理**********************************************\n");
printf("* 请选择需要使用的功能 *\n");
printf("* 1.课程信息添加 *\n");
printf("* 2.课程信息修改 *\n");
printf("* 3.课程信息删除 *\n");
printf("* 4.返回上一级 *\n");
printf("* 0.退出 *\n");
printf("********************************************************************************************************\n");
int x=-1;
while(x==-1){
scanf("%d",&x);
x=validation(x,4);//合法性验证
switch(x){
case 1:system("cls"); classadd(TB); break;//课程信息添加
case 2:system("cls"); classchange(TB); break;//课程信息修改
case 3:system("cls"); classdel(TB); break;//课程信息删除
case 4:system("cls"); classmenu(TB,TA); break;//课程菜单
case 0: printf("再见");stdatewritten(TA);cldatewritten(TB); exit(1); //数据写入文件并退出
case -1: break;
}
}
}
void studentquery(NodeB **TB,NodeA **TA){//学生信息查询
printf("**********************************************学生信息查询**********************************************\n");
printf("* 1.加载全部信息 *\n");
printf("* 2.按学号/姓名查询 *\n");
printf("********************************************************************************************************\n");
int i=0;
scanf("%d",&i);
if(i==1){
system("cls");
bool x=1;
i=-1;
printf("*******************************************正在加载学生信息*********************************************\n");
x=TraverseNodeA(*TA);//学生信息加载
printf("********************************************************************************************************\n");
while(i==-1){
printf("键入0以结束浏览\n");
scanf("%d",&i);
i=validation(i,0);//合法性验证
if(i==0){
system("cls");
themenu(TB,TA); //返回主菜单
}else i=-1;
}
}
else{
system("cls");
printf("*******************************************请输入学号或者姓名*******************************************\n");
char a[11],c[11];
scanf("%s",c);
system("cls");
printf("********************************************************************************************************\n");
search(TA,c);//查询并显示
printf("********************************************************************************************************\n");
int i=-1;
while(i==-1){
printf("键入0以结束浏览\n");
scanf("%d",&i);
i=validation(i,0);//进行合法性验证
if(i==0){
system("cls");
themenu(TB,TA); //返回主菜单
}
else
i=-1;
}
}
studentmenu(TB,TA); //返回上一级菜单
}
void studentmanagement(NodeB **TB,NodeA **TA){//学生信息管理
printf("*****************************************学生信息管理***************************************************\n");
printf("* 请选择需要使用的功能 *\n");
printf("* 1.学生信息添加 *\n");
printf("* 2.学生信息修改 *\n");
printf("* 3.学生信息删除 *\n");
printf("* 4.返回上一级 *\n");
printf("* 0.退出 *\n");
printf("********************************************************************************************************\n");
int x=-1;
while(x==-1){
scanf("%d",&x);
x=validation(x,4);//合法性验证
switch(x){
case 1:system("cls"); newstudent(TB,TA);studentmanagement(TB,TA); break;//学生信息添加
case 2:system("cls"); changestudent(TB,TA);studentmanagement(TB,TA);break;//学生信息修改
case 3:system("cls"); delstudent(TB,TA);studentmanagement(TB,TA); break;//学生信息删除
case 4:system("cls"); studentmenu(TB,TA); break;//学生管理菜单
case 0: printf("再见");stdatewritten(TA);cldatewritten(TB); exit(1); //将内存中的数据写入文件并关闭程序
case -1:break;
}
}
}
void stresult(NodeB **TB,NodeA **TA){//学生成绩查询
printf("*******************************************请输入学号或者姓名*******************************************\n");
char c[11];
scanf("%s",c);
system("cls");
printf("********************************************************************************************************\n");
searchresult(TA,TB,c); //调用成绩查找函数
printf("********************************************************************************************************\n");
int i=-1;
while(i==-1){
printf("键入0以结束浏览\n");
scanf("%d",&i);
i=validation(i,0);
if(i==0){
system("cls");
themenu(TB,TA); //返回主菜单
}
else
i=-1;
}
}
5.程序运行结果
1.学生信息查看
2.学生信息修改
3.学生信息增加
4.学生信息删除
5.学生成绩查询
6.课程信息查询
7.课程信息增加
8.课程信息修改
9.课程信息删除
6.设计总结
本次设计班级学生成绩管理系统采用了模块化的程序设计结构,即将程序分为菜单模块、数据处理模块、学生信息管理模块、课程信息管理模块、合法性验证模块、结构体模块、查询模块这 7 大模块,实现了对单独模块的调试与修改,减少了开发难度并提升了可维护性。在程序设计上,按照要求绘制了程序流程图简化设计流程,提高开发速度。
为满足开发需求,程序中运用了 c 标准库函数以及链表数据结构。通过使用带有头节点的循环单链表实现学生信息、课程信息的增删读写查。c 标准库函数和文件读写函数实现了字符串的规律读写。
在程序的编写以及调试过程中遇到了一些问题,并加以修正。下面列出一些显著问题:
1.链表指针问题
最开始使用指针值的传递来进行对链表的修改,但这极大的消耗资源并带来不必要的编写难度,后来选择了指针引用/地址传递避免了指针的回传。
2.文件读写问题
由于文件读写指针的特性会导致某些字符在读写时丢失,采用指针复位的方法进行了优化。
3.循环条件问题
在链表遍历过程中循环条件很重要,针对头结点的特殊标记显然起了很大作用。
本次程序的设计与编写锻炼了我的代码编写能力以及调试能力。通过对指针的使用对 c/c++ 最为重要的特性加深了理解,因为时间关系,对于合法性验证模块做的并不是很完整,今后将继续完善此设计并尝试图形化界面的绘制。
♻️ 资源
**大小:**3.52MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87404242