《程序设计课程设计学生成绩管理系统.doc》由会员分享,可在线阅读,更多相关《程序设计课程设计学生成绩管理系统.doc(16页珍藏版)》请在三一办公上搜索。
1、淮北师范大学程序设计课程设计简单学生成绩统计软件学 院 计算机科学与技术 专 业 计算机科学与技术(师范) 学 号 学 生 姓 名 指导教师姓名 2011年03月 31 日一、 程序设计的内容与目的内容:1. 学生记录应该包括学号、姓名、C 语言课设成绩等信息,是本程序的核心数据结构,定义如下:typedef structchar num11; /*学号*/char name10; /*姓名*/int cgrade; /*c 语言课设成绩*/elemtype ;使用链表实现学生记录的存储,链表中的结点结构如下:typedef struct node elemtype data;struct n
2、ode * next; NODE,*Nodeptr;int n=0;2程序应具有以下基本功能:(1)以菜单形式显示主界面,提示用户进行选择,完成相应任务,如图1-1 所示。(2)创建学生记录链表:从键盘输入一定数量的学生记录。(3)插入学生记录:从键盘输入待插入的学生记录,插入到指定位置。(4)对学生记录中的C 语言课设成绩按指定顺序(升序、降序)进行排序;(5)删除学生记录:在指定位置上删除学生记录。(6)能统计各分数段的人数,并以分布图显示,如图1-2 所示。(7)输出学生记录到屏幕目的: (1)每个学生记录中包含学号、姓名和C 语言课设成绩等信息;(2)创建学生记录链表;(3)更新学生记
3、录(插入、排序、删除);(4)能统计各分数段的人数,并以分布图显示;(5)输出学生记录到屏幕。二、算法的基本思想这是一个简单的学生信息管理程序,包括学生信息的创建,显示,删除,插入,排序和汇总等功能。本程序使用了结构体来存放学生信息。将学生的信息以链表的形式存储在内存中。typedef structchar num11; /*学号*/char name10; /*姓名*/int cgrade; /*c 语言课设成绩*/ elemtype ; typedef struct node elemtype data;struct node * next; Node,*Nodeptr; 程序运行前先创建
4、学生信息,创建完成后显示刚才创建的信息,然后根据需要进行删除学生信息,插入学生信息和对学生成绩进行汇总显示的操作。创建学生信息的函数如下:int CreateLink( Nodeptr L,int M5)for(int i=0;inext; while (p)L-next = p-next; delete(p); p = L-next;nCount+;L-data.cgrade = 0;for(int i=0;inext)&( (r-next-data.cgrade p-data.cgrade)|(r-next-data.cgrade data.cgrade) ) r = r-next;/r向
5、后移动p-next = r-next;r-next = p;/将p和r结点接在一起L-data.cgrade+; /链表长度加1AculateScore(x.cgrade,M); 该函数的传入参数是指向链表头结点的指针,存放学生信息的结点,和一个一维数组。在该函数中,首先申请一块新的内存用于存放学生信息,然后调用CopyElem(p,x)函数将存放学生信息的结点的数据拷贝到新申请的内存中,并与链表的头结点连接起来。最后调用AculateScore(x.cgrade,M); 来汇总学生信息。void CopyElem (elemtype *x,const char* num,const char
6、* name,const int cgrade)strcpy(*x).name,name);/将姓名拷贝到结点中strcpy(*x).num,num);/将学号拷贝到结点中(*x).cgrade=cgrade;/将成绩拷贝到结点中传入参数为存放学生信息的结构体指针,两个字符型指针分别用显示放学号和姓名,一个整形用来显示成绩。int AculateScore (const int cgrade,int M5,int optCode)函数的传入参数是一个整形的参数用来表示成绩,一个一维数组用来保存汇总信息,和一个具有默认值的形参。int AculateScore (const int cgrade
7、,int M5,int optCode)/统计分数段 if (optCode) if (60cgrade) M0+;return 1; if (90cgrade) M4+;return 5; if (cgrade80) if (cgradecgrade) M0-; return 1; if (90cgrade) M4-; return 5; if (cgrade80) if (cgrade70) M1-; return 2; else M2-; return 3; else M3-; return 4; 该函数用来计算小于60分,小于70分,小于80分,小于90分和小于100分的人的个数并将结
8、果保存在一维数组中,然后在showGrid函数中将结果以图形的方式显示出来。void ShowGrad(int M5)int i,nCount=0;int tmp5,max=0;int k;/放大系数 for (i=0;i5;i+) nCount += Mi;if (nCount15)k=nCount;else k=10;for (i=0;imax)max=tmpi;for (i=max+2;i0;i-) printf( %c%*c%c%*c%c%*c%c%*c%cn,(tmp0i)? :I,4, ,(tmp1i)? :I,4, ,(tmp2i)? :I,4, ,(tmp3i)? :I,4,
9、,(tmp4i)? :I);printf(%s %s %s %s %sn,60,70,80,90,100);for (i=0;inext;/P指向下一个结点for(j=0;jdata.num)11)?11:strlen(p-data.num);/判断输入的学号是否大于11个字符namelen = (strlen(p-data.name)10)?10:strlen(p-data.name);/判断输入的学号是否大于11个字符printf(%d%*c%s%*c%s%*c%dn,i+,ConsoleLength/4-i/10-1, ,p-data.num,ConsoleLength/4-numlen
10、, ,p-data.name,ConsoleLength/4-namelen, ,p-data.cgrade);/打印学生信息p = p-next;/将指针移到下一个结点for(j=0;jConsoleLength;j+)printf(*);printf(n);简单学生成绩统计软件二、 主要功能模块流程图创 建显 示删 除退 出插 入排 序条形图显示示四、系统测试程序运行实例如下:1选择1,运行界面如下:2选择2,运行界面如下: 3选择3,运行界面如下:4选择4,运行界面如下:5选择5,运行界面如下:6选择6,运行界面如下:五、结论通过这次长达两个星期的程序设计,我受益匪浅。深刻认识到自己知识
11、的不牢固以及编程实践能力的低下。自学能力和自我认识都有一定的增强,也对编程有更深刻的认识。在做这个程序的时候,我遇到了不少问题。编译的过程:开始的时候找了这个题目,因为不会数据库那方面的东西,所以最简单的思路只能在程序本身弄。然后最容易想到的数据结构就是结构体,再用动态链表来处理,这样效率比较高,插入删除什么的比较方便。问题主要是在排序那边,结构体要排序比较复杂,所以我记得我好像是开了个数组来存放结构体的指针,然后,实际上结构体链表来操作。然后排完了按照那个数组的顺序输出,这里比较难弄。其次比较棘手的是链表的使用,由于自己在学习过程中这部分知识掌握的很差,导致了程序写的难死了。通过老师的指导、网上的搜索学习、图书馆相关资料的查阅及同学们之间的讨论,我终于理解并能简单运用这部分知识。同时由于是第一次合作编写这么大的设计程序,很多知识都需要自己主动地去汲取和探究,所以程序本身就存在相当多的缺陷。那都是因为当时的思路实在不够严谨,导致最终一些问题难以得到解决。这一切的问题都因于自己能力不足和知识的欠缺。总之,课程设计考察的是一个学生理论联系实际并真正理解知识的能力,在这次考察中,我收获了很多,也使我对C语言的理解运用有一定的提高。很期待能在下一次的设计中有更好的表现。希望老师能多多开展这样的课程。