学生成绩管理系统实习报告附代码.doc
唐 山 学 院 数据结构 课 程 设 计 题 目 学生成绩管理系统设计与实现 系 (部) 计算机科学与技术系 班 级 姓 名 学 号 指导教师 2013 年 1 月 4 日至 1 月 11 日 共 1 周2013 年 1 月 11 日 数据结构 课程设计任务书一、设计题目、内容及要求1、设计题目:学生成绩管理系统设计与实现。2、设计内容及要求: (1)查询功能:可以通过姓名、学号进行查询学生成绩,同时可以查询有不及格科目的学生。(2)录入功能:能够录入学生成绩(包括:学号、姓名、至少3门课程的成绩、总分、平均分等信息)。总分和平均分自动计算。(3)排序功能:能够对学生成绩进行排序并可以浏览排序结果。(4)统计功能:能够统计出优秀、良好、中等、及格和不及格这五个等级的人数。二、要求的设计成果(课程设计说明书、设计实物、图纸等)1、用C语言进行程序设计,实现系统的功能。注重算法效率,代码要有适当的注释;2、撰写课程设计说明书一份,不少于2000字。课程设计说明书应包括封面、任务书、成绩评定表、正文(设计思路、设计步骤等)、参考文献(资料)、附录(程序代码)等内容。三、进程安排12月31日:进行需求分析,确定系统的主要功能和算法思路;1月1日1月2日:进行详细设计,确定各模块的算法思路;1月3日1月4日:进行编码实现;1月7日1月10日:进行测试调试,完善设计;撰写设计说明书,准备答辩;1月11日:答辩。四、主要参考资料 1.严蔚敏,吴伟民.数据结构.清华大学出版社,2007.2.苏仕华.数据结构课程设计.机械工业出版社,2010.3.滕国文.数据结构课程设计.清华大学出版社,2010.指导教师(签名):教研室主任(签名):课程设计成绩评定表出勤情况出勤天数 缺勤天数成绩评定出勤情况及设计过程表现(20分)课设答辩(20分)设计成果(60分)总成绩(100分)提问(答辩)问题情况综合评定 指导教师签名: 年 月 日1 引 言1.1 背景在21世纪,以高科技为核心的知识经济将占主导地位,国家的综合国力和国际竞争力将越来越取决于科学技术创新水平。教育作为知识创新、传播和应用的基础,培养和输送人才的摇篮,已经成为经济发展和社会进步的基础。尽管人类进步的程度随着不同时代,不同地区而有所变化,教育的口径却在不断扩宽,以便使过去仅供少数人使用的教育资源能够为更多各种年龄、不同社会阶层和背景的人们所用。在信息爆炸的时代,传统教学管理面临着诸多挑战。管理现代化,办公自动化和决策科学化,是现代办公管理发展的必然趋势。随着信息社会的不断发展,计算机的使用已经深入到人们工作生活中的每一个角落。而人们对数据库的运作和依赖同样也是计算机出现后的一大优势,在学校管理领域,引入计算机管理系统,可以大大提高管理效率和质量,是学校进行现代化、标准化建设的必然趋势。学生成绩管理工作被视作高校管理工作中一项不容忽视的重要分支,其工作量大,涉及面广,学生成绩管理工作运行的好坏直接影响着整个高校管理工作的各个环节。由于成绩管理工作的本身特点及特殊性质,单纯依靠人力,会使从事这项工作的管理人员过度缠身于繁琐的业务中,难免会发生许多错误,难以做到管理的规范化,这不符合管理工作的今后发展趋势。因此,需要开发一种功能全面,操作简便的管理系统软件来补助作用,人机配合,能够使机器承担部分工作,使管理员逐步摆脱一些无谓的,琐碎的业务,这对充分利用人力资源的主导作用及使管理工作逐步步入规范化轨道有着重要意义。1.2 内容 学生成绩管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性1和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。本系统主要完成对学生成绩的管理,包括添加、修改、删除,查询,打印等几个方面。系统可以完成对各类信息的浏览、查询、添加、删除、修改等功能。系统的核心是添加、修改和删除三者之间的联系,每一个表的修改都将自动地影响其它的表,当完成添加或删除操作时系统会自动地完成学生成绩的修改。查询功能也是系统的核心之一。2 问题分析(1)本题目主要涉及到顺序表的使用及排序的基本操作。(2)学生成绩管理系统的主要目的就是利用软件实现成绩的录入、查询、修改等功能,使教师对学生成绩的管理更加容易,提高工作效率、降低管理成本,同时也方便于学生对自己信息的查询。 (3)成绩管理系统主要涉及到对大量学生信息的操作,因此选用线性表。又因为该软件主要是对学生各科成绩求总和和平均值及对按学生成绩分等级,很少有插入和删除操作,通过以上分析,我选择了顺序表的存储方式,成绩管理系统的存储结构如下:struct student /定义学生信息 int No; /学号 char name20; /姓名 char grade20; /班别 char term20; /年级 float score1; /大学物理 float score2; /电子技术 float score3; /英语 float score4; /数据结构 float sort; /排序成绩 float ave; /平均分 float sum; /总分3总体设计该成绩管理系统采用顺序表存储学生信息及成绩。顺序表的每一条记录又包括好几个一维数组。班级、学号、姓名都是一维数组,各科成绩都是整型变量。因为该系统主要是对每条记录进行的操作,所以顺序表比较容易实现。学生成绩管理系统查询某一学生成绩输出所有学生成绩求总分和平均分排序查找不及格学生修改和删除某同学成绩输入学生成绩图3-1 系统模块结构图输入:输入学生相关信息己各科成绩。求和:软件自动计算总分和平均分。与此同时在表的下方显示优秀,良好,中等,及格,不及格五个等级的学生人数。查询:人用的输入某一同学学号或姓名,系统进行输出。修改:修改原先输入有错的学生信息。删除:查找不及格学生:四门成绩中有一门不及格就算不及格输出:用一个循环将所有成绩输出。退出:退出学生成绩管理系统。4详细设计程序分为录入、显示、添加、修改、删除、查询显示不及格情况六个部分。录入部分根据提示由用户自己输入学生的信息和成绩,然后系统会自行通过一个for循环实现对每个同学的总成绩和平均成绩的一个运算。然后是对同学的平均分进行排序。同时在表的最下方显示优秀、良好、中等、及格及不及格五个等级的同学人数(这里的等级分布为平均分的等级分布)。实现这一结果用的是一个switch语句。switch(int(stuj.ave/10) *利用switch语句统计各个等级的学生人数*/case 10:case 9:A+;break;/*统计优秀学生人数*/case 8:B+;break;/*统计良好学生人数*/case 7:C+;break;/*统计中等学生人数*/case 6:D+;break;/*统计及格学生人数*/default :E+;/*统计不及格学生人数*/4.1 录入模块主要是最后执行的时候输入每个学生的信息和成绩。4.1.1设计思路 根据所有学生信息,按班级、学号、姓名、数字逻辑成绩、数据结构成绩、英语成绩、物理成绩的顺序依次将每个学生的信息输入。4.1.2 流程图 开始新建顺序表输入学生信息输入学期输入班别输入学号输入姓名输入成绩4输入成绩3输入成绩2输入成绩1返回主菜单结束4.2 计算模块用for循环,将每个学生的总分和平均分计算出来记在相应的位置。同时计算出优秀、良好、中等、及格和不及格五个等级的同学的个数。其流程图为开始及格并标记D不及格并标记E结束中等并标记C良好并标记B优秀并标记Aswitch4.3 查找和修改部分实现通过学号来查找和修改同学的信息及各科成绩。4.4 显示不及格情况用来显示同学不及格的科目。4.5整个程序模块整个程序的流程图为计算总分和平均分switch语句分级优秀并标记A良好并标记B中等并标记C及格并标记D不及格并标记E输出不及格学生新建顺序表结束返回主菜单查询某个学生5运行测试开始运行时程序页面如下图5.1登录页面按任意键继续为图5-2 菜单选择页面选择1为图5-3 信息录入功能输入学生的基本信息和各科成绩不继续输入时需要输入“n”。选择2时,显示学生的成绩信息图5-4 显示排序和统计功能选择3时可以添加错过的学生信息图5-5 添加功能我们可以看到“张飞”已经添加进去了图5-6选择4为删除学生的信息:图5-7删除功能返回后我们可以看到“刘备”删除了图5-8选择5时为修改学生信息,我们可以看到表中由一位同学的信息输入有误我们现在来对其进行修改。输入名字对其进行修改图5-9 修改功能 选择6时实现的是对学生信息的查询图5-10 查询功能选择7时实现的是学生不及格的情况图5-11不及格同学及不及格科目6总结整个程序的存储方式均是顺序链表,使得该系统在进行插入和删除时大大降低了效率,因为每删除或插入一个数据都要进行大量的移动,但是顺序表的存储和其他操作都较为简单易懂,所以基于现在编写的仅是一个较小的系统,输入数据也不会太多,根据自己对程序的掌握的程度还是选择了顺序表的存储结构。但是由于毕业设计时间较短,所以该系统还有许多不尽如人意的地方,比如用户界面不够美观,出错处理不够等多方面问题。这些都有待进一步改善。我受到了指导老师细心指导,老师严谨的指导态度与深厚的理论知识都让我受益非浅,从他身上我学到了很多的东西,无论是理论还是实践都使我的知识有很大的提高.借此我特提出感谢.通过这次课设,使我对C语言有了更深刻的了解,让我认识到,好多东西,学会并不一定了解,只有用这些东西去实践,才能更好理解这些,要真正消化所学的知识,实践是最好的办法。计算机有许多深奥的东西,只要我们肯钻研,会享受意想不到的快乐。作为国家的新一代,我们要肩负重任,努力学习。数据结构教会我们要独立思考,对一个问题要有自己的想法,有自己的思路。而且对同一个问题,要想法找最简单、少时最少、效率最高的方法。虽然这些天来很辛苦但是自己对C语言和数据结构的深入理解也使自己很开心很踏实。以后为了使自己能更加透彻的理解计算机方面的知识我会将理论与实践结合起来,使自己在不断的实践中完善自己,提升自己。参考文献1 严蔚敏,吴伟民数据结构北京:清华大学出版社,2008 2 苏仕华数据结构课程设计北京:机械工业出版社,2010.3 .滕国文数据结构课程设计北京:清华大学出版社,2010.附录全部代码如下#include<stdio.h> #include<conio.h> /*清屏*/ #include <stdlib.h> /*显示目录*/ #include<string.h> #define MAX 1000void input(); void sort(); /*排序数据函数*/ void display(); /*显示数据函数*/ void insert(); /*插入数据函数*/ void del(); /*删除数据函数*/ void modify(); /*修改数据函数*/ void sum(); /总分void average(); /*平均值函数*/ void fail(); /*不及格科目和学生*/void find(); /*查找数据函数*/ int now_No=0; struct student /定义学生信息 int No; /学号 char name20; /姓名 char grade20; /班别 char term20; /年级 float score1; /大学物理 float score2; /电子技术 float score3; /英语 float score4; /数据结构 float sort; /排序成绩 float ave; /平均分 float sum; /总分struct student stuMAX,*p; void main() /*主函数*/ int as; char ch; do start: printf("nnnnnnttt 欢迎使用学生成绩管理系统n"); printf("nnnnnntt*按任意键继续*"); ch=getch();while(!ch); system("cls"); /*清屏*/ /*以下为功能选择模块*/ do printf("nt$ *菜单* $n"); printf("nt$t录入学生信息 ->t1 t$"); printf("nt$t显示学生总成绩信息 ->t2 t$"); printf("nt$t添加学生信息 ->t3 t$"); printf("nt$t删除学生信息 ->t4 t$"); printf("nt$t修改学生信息 ->t5 t$"); printf("nt$t查询学生信息 ->t6 t$"); printf("nt$t显示不及格情况 ->t7t$"); printf("nt$t退出 ->t8 t$"); printf("nnt$ * $"); printf("n选择功能选项(输入所选功能前的数字):"); fflush(stdin); scanf("%d",&as); switch(as) case 1:system("cls"); input(); break; case 2:system("cls"); display(); break; case 3:system("cls"); insert(); break; case 4:system("cls"); del(); break; case 5:system("cls"); modify(); break; case 6:system("cls"); find(); break; case 7:system("exit"); fail(); break; case 8:system("cls"); exit(0); default:system("cls"); goto start; while(1); /*while(1)表示永远循环下去*/ /*至此功能选择模块结束*/ void input() /*学生信息录入模块*/ int i=0; char ch; doprintf("tttt1.录入学生信息n输入第%d个学生的信息n",i+1); printf("请输入学期:");fflush(stdin);gets(stui.term); printf("输入学生班别:"); fflush(stdin); gets(stui.grade); printf("输入学生学号:"); scanf("%u",&stui.No); fflush(stdin); printf("输入学生姓名:"); fflush(stdin); gets(stui.name); printf("输入学生大学物理成绩:"); scanf("%f",&stui.score1); printf("输入学生电子技术成绩:"); fflush(stdin); scanf("%f",&stui.score2); printf("输入学生英语成绩:"); fflush(stdin); scanf("%f",&stui.score3);printf("输入学生数据结构成绩:"); fflush(stdin); scanf("%f",&stui.score4); printf("n");i+; now_No=i; printf("是否继续输入?(Y/N)");fflush(stdin); ch=getch();while(ch!='n'&&ch!='N'); system("cls"); void sort() /*排序数据函数*/ struct student temp; int i,j; average(); for(i=1;i<now_No;i+) for(j=1;j<=now_No-i;j+) if(stuj-1.ave<stuj.ave) temp=stuj; stuj=stuj-1; stuj-1=temp; printf("排序已完成进入可进行显示n"); system("pause"); system("cls"); void display() /*显示数据函数*/ int i; char as; average(); sum(); doprintf("tttt班级学生信息列表nn"); printf("学期t班别t学号t姓名t大学物理t电子技术t英语t数据结构t总分t平均值n"); for(i=0;i<now_No&&stui.name0;i+)printf("%st%st%ut%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn",stui.term,stui.grade,stui.No,stui.name,stui.score1,stui.score2,stui.score3,stui.score4,stui.sum,stui.ave); int j,A=0,B=0,C=0,D=0,E=0;printf("统计不同等级学生人数的功能:n");for(j=0;j<i;j+)switch(int(stuj.ave/10)/*利用switch语句统计各个等级的学生人数*/case 10:case 9:A+;break;/*统计优秀学生人数*/case 8:B+;break;/*统计良好学生人数*/case 7:C+;break;/*统计中等学生人数*/case 6:D+;break;/*统计及格学生人数*/default :E+;/*统计不及格学生人数*/printf("优秀学生人数:%dn",A); printf("良好学生人数:%dn",B); printf("中等学生人数:%dn",C); printf("及格学生人数:%dn",D); printf("不及格学生人数:%dn",E); printf("n");printf("ttt按任意键返回主菜单"); fflush(stdin); as=getch(); while(!as);system("cls"); void insert() /*插入数据函数*/ char ch; int i; do printf("n输入新插入学生信息:n"); printf("请输入学期:");fflush(stdin);gets(stunow_No.term); printf("输入学生班别:"); fflush(stdin); gets(stunow_No.grade); printf("输入学生学号:"); scanf("%u",&stunow_No.No); fflush(stdin); printf("输入学生姓名:"); fflush(stdin); gets(stunow_No.name); printf("输入学生大学物理成绩:"); fflush(stdin); scanf("%f",&stunow_No.score1); printf("输入学生电子技术成绩:"); fflush(stdin); scanf("%f",&stunow_No.score2); printf("输入学生英语成绩:"); fflush(stdin); scanf("%f",&stunow_No.score3); printf("输入学生数据结构成绩:"); fflush(stdin); scanf("%f",&stunow_No.score4); printf("n"); now_No=now_No+1; sort(); printf("是否继续输入?(Y/N)"); fflush(stdin); ch=getch(); system("cls"); while(ch!='n'&&ch!='N'); void del() /*删除数据函数*/ unsigned long inum; int i; printf("输入要删除学生的学号:"); fflush(stdin); scanf("%u",&inum); for(i=0;i<now_No;i+)if(stui.No=inum) if(i=now_No) now_No-=1; else stui=stunow_No-1; now_No-=1; sort(); break; system("cls"); void find() /*查询函数*/ int i; char str20,as;average();sum(); do printf("输入要查询的学生姓名:"); fflush(stdin); gets(str); for(i=0;i<now_No;i+) if(!strcmp(stui.name,str) printf("班别t学号t姓名t大学物理t电子技术t英语t数据结构t总分t平均值n"); printf("%st%ut%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn",stui.grade,stui.No,stui.name,stui.score1,stui.score2,stui.score3,stui.score4,stui.sum,stui.ave); printf("ttt按任意键返回主菜单"); fflush(stdin); as=getch(); while(!as); system("cls"); void average() /*求平均数*/ int i; for(i=0;i<now_No;i+) stui.ave=(stui.score1+stui.score2+stui.score3+stui.score4)/4; void sum()int i; for(i=0;i<now_No;i+) stui.sum=(stui.score1+stui.score2+stui.score3+stui.score4); void modify() /*修改数据函数*/ int i=0; char str20; stui.ave=stui.sum/4; printf("输入要修改的学生姓名:"); fflush(stdin); gets(str); for(i=0;i<now_No;i+)if(!strcmp(stui.name,str)system("cls"); printf("ntt输入修改后学生信息n");printf("n输入学生学期:"); fflush(stdin); gets(stui.term); printf("n输入学生学号:"); fflush(stdin); scanf("%u",&stui.No); printf("n输入学生班别:"); fflush(stdin); gets(stui.grade); printf("n输入学生大学物理成绩:"); fflush(stdin); scanf("%f",&stui.score1); printf("n输入学生电子技术成绩:"); fflush(stdin); scanf("%f",&stui.score2); printf("n输入学生英语成绩:"); fflush(stdin); scanf("%f",&stui.score3); printf("n输入学生数据结构成绩:"); fflush(stdin); scanf