班级学生成绩管理
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++ 最为重要的特性加深了理解,因为时间关系,对于合法性验证模块做的并不是很完整,今后将继续完善此设计并尝试图形化界面的绘制。
参考文献
[1]StephenPrata.CPrimerPlus.第六版北京:人民邮电出版社.2016,6:219-240[2]李春葆.数据结构教程.第五版.北京:清华大学出版社,2017:31-42.
[3]菜鸟教程 c 标准库参考手册 www.runoob.com
♻️ 资源
大小:3.52MB
➡️资源下载:https://download.csdn.net/download/s1t16/87404242
注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!