1、学生成绩管理系统C程序设计报告 作者: 日期:27 个人收集整理 勿做商业用途学生成绩管理系统C程序设计报告一、设计要求:1. 要求利用C语言面向过程的编程思想来完成系统的设计; 2. 突出C语言的函数特征,以多个函数实现每一个子功能; 3。 画出功能模块图; 4. 进行简单界面设计,能够实现友好的交互; 5。 具有清晰的程序流程图和数据结构的详细定义; 6。 熟练掌握C语言对文件的各种操作.二、设计的作用、目的通过程序设计,提高编程兴趣与编程水平。设计一个学生成绩管理系统,上学期的本班的学习成绩进行管理,可以用数组设计这个程序,具有查询和检索功能,并且能够对指定文件操作,也可将多个文件组成一
2、个文件.通过对此程序的设计熟练掌握c语言。三、课题分析输入N个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序。要求:含有:登记学生资料、删除学生资料、查询学生资料、修改学生资料、保存学生资料、退出系统等各项功能。四、设计的具体实现1、系统的组成模块结构及功能(1)、 当前学生信息:通过结构体struct student 来保存学生的姓名,学号,性别,语文,数学,英语和计算机等等相关信息,并且通过cin函数来进行给当前学生输入初始信息.具体使用的程序结构如下:printstart(); printc(); printe(s
3、); printstart(); printf(n”); return; s=s-next; p=(Node *)malloc(sizeof(Node); strcpy(pdata.num,num); printf(请你输入姓名:); scanf(”%s”,pdata.name); getchar(); printf(”请你输入性别:); scanf(s,pdata.sex); getchar(); printf(”请你输入c语言成绩:”); scanf(%d”,&pdata。cgrade); getchar(); printf(请你输入数学成绩:); scanf(d,pdata.mgrade
4、); getchar(); printf(”请你输入英语成绩:”); scanf(%d,pdata。egrade); getchar(); pdata.totle=p-data.egrade+pdata.cgrade+pdata.mgrade; pdata.ave=pdata.totle / 3; / 信息输入已经完成 */ 本文为互联网收集,请勿用作商业用途个人收集整理,勿做商业用途(2)、学生成绩查询: 输入一个学号, 在文件中查找此学生, 若找到则输出此学生的全部信息和成绩; 若找不到则输出查找失败的信息。 同时也可以全部把各科的平均成绩,最高和最低分输出.使用的函数结构:void Qu
5、r(Link l) /* 查询学生 / int sel; char findmess20; Node p; if(!l-next) printf(”n=提示:没有资料可以查询!n”); return; printf(”n=1按学号查找n=2按姓名查找n”); scanf(%d,&sel); if(sel=1)/* 学号 */ printf(请你输入要查找的学号:”); scanf(”%s”,findmess); p=Locate(l,findmess,”num”); if(p) printf(tttt查找结果n); (3)、学生资料删除:输入要删除的学生学学号,若找到则根据提示进行删除;若找不
6、到则提示没有资料删除。使用的函数结构:void Del(Link l) / 删除 / int sel; Node *p,r; char findmess20; if(!l-next) printf(”n=提示:没有资料可以删除!n”); return; printf(n=1按学号删除n=2按姓名删除n); scanf(”%d”,sel); if(sel=1) printf(请你输入要删除的学号:); scanf(”%s”,findmess); p=Locate(l,findmess,num); if(p) r=l; while(rnext!=p) r=r-next; r-next=p-next
7、; free(p); printf(”n=提示:该学生已经成功删除!n”); shoudsave=1; (4)、学生资料修改:输入要修改的学生号,若找到则输入新的学生信息,并提示资料修改成功;若找不到则输出查找失败的信息。使用的程序结构:void Modify(Link l) Node *p; char findmess20; if(!l-next) printf(”n=提示:没有资料可以修改!n”); return; printf(请你输入要修改的学生学号:); scanf(%s”,findmess); p=Locate(l,findmess,num”); if(p) printf(”请你输
8、入新学号(原来是%s):”,p-data。num); scanf(”%s”,pdata。num); printf(请你输入新姓名(原来是s):”,p-data.name); scanf(”%s”,p-data。name); getchar(); printf(请你输入新性别(原来是s):,pdata.sex); scanf(s,p-data.sex); printf(”请你输入新的c语言成绩(原来是%d分):,pdata。cgrade); scanf(%d”,p-data。cgrade); getchar(); printf(”请你输入新的数学成绩(原来是%d分):,p-data.mgrade
9、); scanf(”%d,&pdata.mgrade); getchar(); printf(请你输入新的英语成绩(原来是%d分):,pdata。egrade); scanf(”%d,&pdata。egrade); p-data。totle=p-data。egrade+pdata.cgrade+p-data.mgrade; pdata.ave=pdata。totle/3; printf(”n=提示:资料修改成功!n); (5)、学生成绩的排序,并统计单科的最高分。本文为互联网收集,请勿用作商业用途个人收集整理,勿做商业用途(6)、退出系统。2、系统程序流程图退出系统登记学生资料修改学生资料保存
10、学生资料删除学生资料查询学生资料开始图1。1 总流程图开始输入学生学号是否存在转为修改新建结束 图1。2 登记学生资料 输入是否合法按学号查询?退 出输入学号按姓名查询显示结果输入姓名显示结果开始结束图1.3 查询学生资料删除的是否合法选择1?输入删除学生学号输入删除学生姓名删除成功退 出开始结束 图1。4 删除学生资料输入是否存在输入学生新信息修改成功退 出输入要修改的学生学号开始结束 图1.5 修改学生资料 图1。6 保存文件与退出系统3、重要函数介绍数据输入函数“cin( )” 查看数据函数“lookdata( )” 插入数据的函数“insert( ) 查看数据的函数“find( ) 更
11、新数据的函数“update( )” 保留数据函数“save( )” 主函数 main()利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。初始化函数 STUDENT init()这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。比如:没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!菜单选择函数 int menu_select();这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间.等
12、执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!输入记录函数 STUDENT create()这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入,函数结束后,带回一个指向链表头的指针head.算法:先声明一个首节点head,并将head-next设为NULL。每输入一个数据就声明一个新节点p,把pnext设为NULL,并且链接到之前列表的尾端.在定义数据类型时,由于学生成绩管理信息需要由不同类型的数据反映出来.如:姓名、性别都需要用char型数据,而学号和成绩则需要用int型数据,并且每位同学的以上信息都需要一次性输入,所以采用结构体类型定义。如:typed
13、ef struct student /*定义结构体/ char name 20; - 定义char型姓名int num10; - 定义int型学号char sex - 定义char型性别 intcgrade; - 定义int型英语成绩 int mgrade; - 定义int型数学成绩int egrade; - 定义int型计算机成绩totle; struct student next; - 结构体指针 stu;五、程序运行背景:VC+ VC+简介现在说的VC就是指的VC+。是指编程工具。vc+就和tc 差不多,是一个调试,运行的环境,是微软开发的visual组件.VC+是微软公司开发的一个ID
14、E(集成开发环境),换句话说,就是使用c+的一个开发平台。有些软件就是这个编出来的。.另外还有VB,VF.只是使用不同语言。但是,vc+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。 VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究
15、其原因主要是大家对他错误的认识造成的,严格的来说VC+不是门语言,虽然它和C+之间有密切的关系,如果形象点比喻的话,可以C+看作为一种”工业标准,而VC+则是某种操作系统平台下的”厂商标准”,而厂商标准”是在遵循”工业标准”的前提下扩展而来的。VC+应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势。个人收集整理,勿做商业用途本文为互联网收集,请勿用作商业用途六、调试问题及解决方法:问题一、学生初始信息模块:其中包括学生的姓名、学号和性别以及学
16、生的语文、数学、英语和计算计相关信息;可用函数cin(stu p1)来实现此操作.当正确输入存在的学生学号,系统进行判断时,提示不存在此学生。解决办法及步骤:1、一个个输出所有的学生的学号,检查文件中是否有此学生,发现有。2、既然有此学生,那么检查循环判断是否有此学生的语句发现没有错3、输出用于循环检查语句中的学生信息,发现乱码4、仔细分析乱码的原因,最后发现是变量的类型错误,错将学生类型的结构体指针变量定义为了其他类型的指针变量。问题二、查询模块:可用stu *lookdata(stu p1) 来实现.找到就输出此学生全部信息包括学生的语文、数学、英语和计算机等的成绩。当正确输入查找信息时,
17、系统却不能够得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩。 解决办法及步骤:1、检查所编写的程序代码是否完全正确,若不是,则改之,然后再继续正确输入查找信息看能否得到所要查找的学生信息以及学生的语文、数学、英语和计算机的成绩. 2、检查当我们在输入查找信息时,看是否我们输入的信息有误,若是这样的话,我们应当仔细输入查找信息。七、心得课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发
18、技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。 回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整半个月的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的
19、问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针,链表通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。个人收集整理,勿做商业用途文档为个人收集整理,来源于网络 我做的是学生成绩管理系统,虽然是很简单的一个小的程序,但对我一个初学者来说却是一个很大的困难.更加是第一次做课程设计,所以连续做了几天却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。特别是结构体,指针的部分,几
20、乎是一片空白。不过经过几天的努力,大体上把课本上的知识点看了一遍,知识点也都基本是撑握了,所以一下一步就是开始正式的编程序了。不过毕竟是个新手,还是不知如何下手,于是就在网上下了一篇类似的程序,经过仔细的研究,终于读懂了C语言编程的基本过程和方法。 经过一波三折,终于开始正式编程. 编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。所以认真仔细就是非常重要的了。开始的时候真的感觉编程是一件很无聊的事情,不
21、过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C语言的一次实践作业,自己进步的证明。 通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践的学习,我认识到学好
22、计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。 在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!八、参考资料 : 1.秦友淑、曹化工.C语言程序设计教程。华中科技大学出版社.2.郭翠英.C语言课程设计案例精编。中国水利水电出版社.3.汪晓平。C语言高级实例解析。清华大学出版社.
23、4。张翔。 C语言函数大全。电子工业大学出版社.5田淑清.全国计算机等级考试二级教程。高等教育出版社。附:源程序及调试结果源程序:#include ”stdio.h” #include ”stdlib.h include ”string.h” int shoudsave=0; /* / struct student char num10;/* 学号 / char name20; char sex4; int cgrade; int mgrade; int egrade; int totle; int ave; char neartime10;/ 最近更新时间 */ ; typedef stru
24、ct node struct student data; struct node next; Node,Link; void menu() printf(”*); printf(t1登记学生资料ttttt2删除学生资料n); printf(”t3查询学生资料ttttt4修改学生资料n); printf(”t5保存学生资料ttttt0退出系统n); printf(*n); void printstart() printf(”-n); void Wrong() printf(n=提示:输入错误!n”); void Nofind() printf(”n=提示:没有找到该学生!n”); void pr
25、intc() / 本函数用于输出中文 */ printf( 学号t 姓名 性别 英语成绩 数学成绩 C语言成绩 总分 平均分n); void printe(Node p)/ 本函数用于输出英文 / printf(”-12s%st%stdtdt%dt %dt dn,pdata。num,p-data。name,pdata.sex,pdata.egrade,pdata.mgrade,p-data.cgrade,p-data。totle,p-data.ave); Node* Locate(Link l,char findmess,char nameornum) /* 该函数用于定位连表中符合要求的接点
26、,并返回该指针 */ Node r; if(strcmp(nameornum,”num”)=0) /* 按学号查询 */ r=lnext; while(r!=NULL) if(strcmp(r-data.num,findmess)=0) return r; r=rnext; else if(strcmp(nameornum,”name”)=0) / 按姓名查询 / r=lnext; while(r!=NULL) if(strcmp(r-data.name,findmess)=0) return r; r=r-next; return 0; void Add(Link l) /* 增加学生 /
27、Node *p,*r,s; char num10; r=l; s=lnext; while(rnext!=NULL) r=rnext; / 将指针置于最末尾 / while(1) printf(请你输入学号(以0返回上一级菜单:)”); scanf(”s”,num); if(strcmp(num,0)=0) break; while(s) if(strcmp(s-data.num,num)=0) printf(=提示:学号为%s的学生已经存在,若要修改请你选择4 修改!n”,num); printstart(); printc(); printe(s); printstart(); print
28、f(”n); return; s=s-next; p=(Node )malloc(sizeof(Node)); strcpy(pdata.num,num); printf(”请你输入姓名:”); scanf(s”,pdata.name); getchar(); printf(”请你输入性别:); scanf(s,p-data。sex); getchar(); printf(”请你输入c语言成绩:”); scanf(d,&pdata.cgrade); getchar(); printf(请你输入数学成绩:”); scanf(d”,p-data.mgrade); getchar(); printf
29、(”请你输入英语成绩:); scanf(d”,pdata.egrade); getchar(); p-data。totle=p-data。egrade+p-data。cgrade+pdata.mgrade; pdata。ave=pdata.totle / 3; / 信息输入已经完成 */ p-next=NULL; r-next=p; r=p; shoudsave=1; void Qur(Link l) / 查询学生 */ int sel; char findmess20; Node p; if(!lnext) printf(n=提示:没有资料可以查询!n); return; printf(”n
30、=1按学号查找n=2按姓名查找n”); scanf(”d,&sel); if(sel=1)/ 学号 */ printf(请你输入要查找的学号:”); scanf(”s,findmess); p=Locate(l,findmess,”num”); if(p) printf(tttt查找结果n”); printstart(); printc(); printe(p); printstart(); else Nofind(); else if(sel=2) / 姓名 */ printf(请你输入要查找的姓名:”); scanf(s”,findmess); p=Locate(l,findmess,na
31、me); if(p) printf(”tttt查找结果n); printstart(); printc(); printe(p); printstart(); else Nofind(); else Wrong(); void Del(Link l) /* 删除 / int sel; Node p,*r; char findmess20; if(!lnext) printf(n=提示:没有资料可以删除!n); return; printf(n=1按学号删除n=2按姓名删除n); scanf(”d”,sel); if(sel=1) printf(”请你输入要删除的学号:); scanf(%s”,
32、findmess); p=Locate(l,findmess,”num); if(p) r=l; while(r-next!=p) r=rnext; rnext=p-next; free(p); printf(”n=提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else if(sel=2) printf(请你输入要删除的姓名:”); scanf(”s”,findmess); p=Locate(l,findmess,name”); if(p) r=l; while(rnext!=p) r=r-next; r-next=p-next; free(p);
33、printf(”n=提示:该学生已经成功删除!n); shoudsave=1; else Nofind(); else Wrong(); void Modify(Link l) Node p; char findmess20; if(!lnext) printf(n=提示:没有资料可以修改!n”); return; printf(请你输入要修改的学生学号:”); scanf(%s,findmess); p=Locate(l,findmess,num); if(p) printf(请你输入新学号(原来是%s):,p-data。num); scanf(”s,p-data.num); printf(
34、请你输入新姓名(原来是s):”,pdata.name); scanf(”s,pdata。name); getchar(); printf(”请你输入新性别(原来是s):,p-data。sex); scanf(”s”,pdata.sex); printf(请你输入新的c语言成绩(原来是%d分):,pdata.cgrade); scanf(”d”,pdata。cgrade); getchar(); printf(”请你输入新的数学成绩(原来是%d分):,pdata。mgrade); scanf(”%d,pdata。mgrade); getchar(); printf(”请你输入新的英语成绩(原来是
35、%d分):,pdata.egrade); scanf(”d”,p-data.egrade); pdata.totle=pdata.egrade+pdata.cgrade+pdata.mgrade; pdata.ave=p-data。totle/3; printf(”n=提示:资料修改成功!n”); shoudsave=1; else Nofind(); void Disp(Link l) int count=0; Node *p; p=l-next; if(!p) printf(n=提示:没有资料可以显示!n); return; printf(”tttt显示结果n”); printstart(
36、); printc(); printf(n); while(p) printe(p); p=p-next; printstart(); printf(”n); void Tongji(Link l) Node pm,*pe,*pc,*pt,pa; /* 用于指向分数最高的接点 / Node *r=lnext; if(!r) printf(n=提示:没有资料可以统计!n”); return ; pm=pe=pc=pt=pa=r; while(r!=NULL) if(rdata。cgrade=pcdata.cgrade) pc=r; if(r-data。mgrade=pm-data.mgrade)
37、 pm=r; if(r-data.egrade=pe-data。egrade) pe=r; if(rdata。totle=pt-data.totle) pt=r; if(rdata.ave=padata.ave) pa=r; r=rnext; printf(”-统计结果-n); printf(总分最高者:t%s %d分n”,ptdata.name,ptdata.totle); printf(平均分最高者:ts %d分n,pa-data。name,pa-data。ave); printf(英语最高者:ts d分n”,pe-data.name,pedata。egrade); printf(数学最高
38、者:t%s %d分n,pm-data。name,pmdata。mgrade); printf(”c语言最高者:ts %d分n,pcdata。name,pc-data。cgrade); printstart(); void Sort(Link l) Link ll; Node *p,*rr,*s; ll=(Link)malloc(sizeof(Node)); /* 用于做新的连表 / llnext=NULL; if(l-next=NULL) printf(”n=提示:没有资料可以排序!n”); return ; p=l-next; while(p) s=(Node)malloc(sizeof(N
39、ode); / 新建接点用于保存信息 */ s-data=p-data; snext=NULL; rr=ll; while(rrnext!=NULL rrnext-data.totle=p-data.totle) rr=rrnext; if(rrnext=NULL) rrnext=s; else snext=rr-next; rr-next=s; p=pnext; free(l); lnext=llnext; printf(”n=提示:排序已经完成!n); void Save(Link l) FILE fp; Node p; int flag=1,count=0; fp=fopen(”c:student”,”wb); if(fp=NULL) printf(”n=提示:重新打开文件时发生错误!n); exit(1); p=lnext; while(p) if(fwrite(p,sizeof(Node),1,fp)=1) p=p