《数据结构课程设计-运动会分数统计(C语言版)(21页).doc》由会员分享,可在线阅读,更多相关《数据结构课程设计-运动会分数统计(C语言版)(21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-目 录第一章 绪 论1 1.1 运动会分数统计系统的背景1 1.2 运动会分数统计系统的任务和目标1第二章 运动会分数统计系统的需求分析2 2.1 功能需求2 2.2 功能模块2 2.3 数据要求3 2.4 性能要求3第三章 系统开发工具及关键技术4 3.1 系统开发工具4 3.1.1 CodeBlocks4 3.2 关键技术4 3.2.1 C语言4 3.2.2 数组4 3.2.3 链表4第四章 运动会分数统计系统的实现5 4.1 数据结构设计5 4.2 结构定义5 4.3 系统界面的实现6 4.3.1 主菜单窗口6 4.3.2 输入各个项目成绩并存储文件6 4.3.3 统计各学校总分8 4
2、.3.4 按学校编号排序输出84.3.5 按学校总分排序输出84.3.6 按男团体总分排序输出94.3.7 按女团体总分排序输出94.3.8 按学校编号查询学校某个项目情况104.3.9 按项目编号查询取得名次的学校10第五章 结束语11 5.1 课程设计总结115.2 致谢11参考文献12附录13-第 20 页-第一章 绪 论1.1 运动会分数统计系统的背景在信息技术已经深入人类工作生活的今天,计算机软件得到了广泛的应用,越来越多的政府和企业将其业务纳入计算机软件系统 。随着社会进步,体育事业的发展,为了提高运动会成绩统计准确,减少设计者们的工作量,开发了本系统。1.2 运动会分数统计系统的
3、任务和目标任务:参加运动会有n个学校,学校编号为1n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1m,女子m+1m+w。不同的项目取前前三名积分;前三名的积分分别为:5、3、2。(m、w=20,n=10)。目标:1.可以输入各个项目的前三名或前五名的成绩;2.能统计各学校总分;3.可以按学校编号、学校总分、男女团体总分排序输出;4.可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)。第二章 运动会分数统计系统的需求分析2.1功能需求运动会分数统计方案适合采用结构体数
4、组,为了实现系统功能,主要应实现以下几部分:比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果。2.2功能模块根据分析整个系统主要划分为4个功能模块,分别执行要求中的功能。该系统分为比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果。比赛成绩输出模块有四个子模块,分别是:按学校编号输出模块、按学校总分输出模块、安南员总分输出模块和按女团总分输出模块;查询比赛成绩模块分为按学校编号查询模块河岸项目编号查询两个子模块。功能模块图如图2-1所示。 图2-1功能模块图(1) 比赛成绩输入模块:比赛成绩输入模块分为:创建信息部分,该部分需输入学校编号,项目编号,取得的名次,以及哪些名次;算法部分
5、,得到排序结果。 (2) 比赛成绩输出模块:将以输入的数据按照输出比赛菜单的选择输出相应的数据。(3) 查询比赛成绩模块:按照查询比赛结果菜单和其查询方式子菜单查询需要的数据。(4) 调用统计结果:将输入的各学校运动会成绩排序输出。2.3数据需求需要输入学校编号,项目编号,取得的名次,以及哪些名次。2.4性能需求本程序在运行期间,为了避免在运行大量数据时不会出错,并且能够在很短的时间内将运行结果稳定输出,就需要系统达到安全性能好,可靠性高,稳定性强,处理数据迅速等特点。第三章 系统开发工具及关键技术3.1 系统开发工具3.1.1 Code:BlocksCode:Blocks是一个开放源码的全功
6、能的跨平C/C+集成开发环境。Code:Blocks是开放源码。Code:Blocks由纯粹的C+语言开发完成,它使用了蓍名的图形界面库wxWidgets(2.6.2 unicode)版。对于追求完美的C+程序员,再也不必忍受Eclipse的缓慢,再也不必忍受VS.NET的庞大和高昂的价格。3.2 关键技术3.2.1 C语言C语言是一种计算机程序设计语言它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖
7、计算机硬件的应用程序。它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。具体应用比如单片机以及嵌入式系统开发。3.2.2 数组数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。3.2.3 链表链表(Linked list)是一种常见的
8、基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类
9、型中就包含了链表的存取和操作。程序语言或面向对象语言,如C/C+和Java依靠易变工具来生成链表。第四章 运动会分数统计系统的实现4.1数据结构设计学校的存储结构为链表,Prev school1 next头结点Prev school(最后) next其中school类为:class school:public athlete /*学校*/ public: int item; /*学校获奖数*/ int school; /*学校编号*/ int boys; /*男团体总分*/ int girls; /*女团体总分*/ int score; /*学校总分*/ athlete athMaxSize;
10、 /*获奖运动员信息数组,包括分数,名次,项目*/ school *prev;/前指针 school *next; /后指针其中部分主要的函数:添加操作add(school* &head)查询操作checkFunc(school *head,int &n)文件保存save(school *head)总分快速排序tquicksort(vector& v, int first, int last)总分基数排序 tbaseSort(vector& v, int d) 4.2结构体定义typedef struct node1 int school; /*学校编号*/ int record; /*项目成
11、绩*/ struct node1 *next; /*链域*/ Schools; typedef struct int item; /*项目编号*/ Schools *firstschool; /*链域指向链表中第一个结点*/ ITEM; typedef struct int z; /* 项目总数 */ ITEM aMAX; ALLitems; typedef struct node2 int item; /*该学校获奖的项目*/ int record; /*项目成绩*/ struct node2 *next; /*链域*/ Items; typedef struct int school; /
12、*学校编号*/ int score; /*学校总分*/ int boys; /*男团体总分*/ int girls; /*女团体总分*/ Items *firstitem; /*链域指向链表中第一个获奖项目的结点*/ SCHNode; typedef struct int n; /* 学校总数 */ SCHNode bMAX; ALLNode; 4.3 系统界面的实现4.3.1主菜单窗口图4-14.3.2. 输入各个项目成绩并存储文件请选择(08):1进入输入各个项目成绩并存储文件图4-21.输入男子项目总数m;1 2.输入男子项目总数m;1 3.输入参加运动会的学校总数3图4-3 输入 项目
13、:1 请选择1(1.前三名2.前五名)第3名:学校3第2名:学校2第1名:学校1项目:2 请选择1(1.前三名2.前五名)第3名:学校1第2名:学校2第1名:学校3项目:3 请选择1(1.前三名2.前五名)第3名:学校1第2名:学校3第1名:学校2图4-4然后输入项目:0 返回到菜单主页面图4-54.3.3. 统计各学校总分请选择(08):2进入统计各学校总分图4-64.3.4 按学校编号排序输出按按任意键继续 返回到菜单主界面 请选择(08):3 图4-74.3.5. 按学校总分排序输出按按任意键继续 返回到菜单主界面 请选择(08):4图4-8 4.3.6. 按男团体总分排序输出按按任意键
14、继续 返回到菜单主界面 请选择(08):5图4-94.3.7. 按女团体总分排序输出按按任意键继续 返回到菜单主界面 请选择(08):6图4-104.3.8. 按学校编号查询学校某个项目情按按任意键继续 返回到菜单主界面 请选择(08):7图4-114.3.9. 按项目编号查询取得名次的学校按按任意键继续 返回到菜单主界面 请选择(08):8图4-12第五章 结束语5.1 课程设计总结经过此次的课程设计,可以很明确的了解到自己哪些知识点掌握的比较好,哪些知识点运用的还不够熟练。通过此次课程设计也学会综合运用理论知识来分析和解决实际问题的能力、养成严谨的科学态度和良好的程序设计习惯,实现由知识向
15、智能的初步转化;学会遵循软件开发过程的基本规范,运用结构化程序设计的方法,按照课程设计的题目要求,并与同组成员共同完成设计、编写、调试和测试应用程序及编写文档的任务。5.2 致谢本设计的完成是在我们的导师李菁老师的细心指导下进行的。在每次设计遇到问题时老师不辞辛苦的讲解才使得我的设计顺利的进行。从设计的选题到资料的搜集直至最后设计的修改的整个过程中,花费了郭老师很多的宝贵时间和精力,在此向导师表示衷心地感谢!导师严谨的治学态度,开拓进取的精神和高度的责任心都将使学生受益终生!还要感谢帮助我的几位同学,是你们在我平时设计中和我一起探讨问题,并指出我设计上的误区,使我能及时的发现问题把设计顺利的进
16、行下去,没有你们的帮助我不可能这样顺利地结稿,在此表示深深的谢意。参考文献:1 严蔚敏 吴伟民著.数据结构(C语言版)M.北京:清华大学出版社. 1997.4.; 2 苏小红 陈惠鹏等著.C语言大学实用教程(第2版)M.北京:电子工业出版社;3 苏小红 陈惠鹏等著.C语言大学实用教程学习指导(第2版).电子工业出版社。附录详细代码:#include #include #include #include /#include /*屏幕操作函数*/ #define MAX 50 /#define NULL 0 typedef struct node1 int school; /*学校编号*/ int
17、 record; /*项目成绩*/ struct node1 *next; /*链域*/ Schools; typedef struct int item; /*项目编号*/ Schools *firstschool; /*链域指向链表中第一个结点*/ ITEM; typedef struct int z; /* 项目总数 */ ITEM aMAX; ALLitems; typedef struct node2 int item; /*该学校获奖的项目*/ int record; /*项目成绩*/ struct node2 *next; /*链域*/ Items; typedef struct
18、 int school; /*学校编号*/ int score; /*学校总分*/ int boys; /*男团体总分*/ int girls; /*女团体总分*/ Items *firstitem; /*链域指向链表中第一个获奖项目的结点*/ SCHNode; typedef struct int n; /* 学校总数 */ SCHNode bMAX; ALLNode; ALLitems *g1; ALLNode *g2; void funct1(ALLitems *g1,ALLNode *g2) Schools *p1; Items *p2; int i,j,k,m,w,h,x; p1=(
19、Schools *)malloc(sizeof(Schools); p2=(Items *)malloc(sizeof(Items); if(!p1|!p2) exit(1); printf(n *输入各个项目信息 * nn); printf( 输入男子项目总数m:); scanf(%d,&m); if(m20) printf( 输入有误,m是20以内的整数,请重新输入:); scanf(%d,&m); printf( 输入女子项目总数w:); scanf(%d,&w); if(w20) printf( 输入有误,w是20以内的整数,请重新输入:); scanf(%d,&w); printf(
20、 输入参加运动会的学校总数n:); scanf(%d,&g2-n); if(g2-nn20) printf( 输入有误,n是20以内的整数,请重新输入:); scanf(%d,&g2-n); g1-z=m+w; printf( 则项目编号为男子1-%d,女子%d-%d,m,m+1,g1-z); printf(nn *记录运动会成绩*); printf(nn (输入0标志结束)n); for(k=1;kz;k+) g1-ak.item=k; g1-ak.firstschool=NULL; for(k=1;kn;k+) g2-bk.school=k; g2-bk.firstitem=0; g2-b
21、k.score=0; g2-bk.boys=0; g2-bk.girls=0; g2-b0.score=0; g2-b0.boys=0; g2-b0.girls=0; while(i!=0) printf(n 项目:); scanf(%d,&i); if(i!=0) printf( 1.前三名 2.前五名n); printf( 请选择:); scanf(%d,&j); if(j!=1&j!=2) printf( 输入有误,请重新选择:); scanf(%d,&j); if(j=1) h=3; do printf( 第%d名:学校(学校编号为数字),h); scanf(%d,&x); p1=(S
22、chools *)malloc(sizeof(Schools); p1-school=x; p2=(Items *)malloc(sizeof(Items); p2-item=i; if(h=3) p2-record=p1-record=2; if(h=2) p2-record=p1-record=3; if(h=1) p2-record=p1-record=5; p1-next=g1-ai.firstschool; g1-ai.firstschool=p1; p2-next=g2-bx.firstitem; g2-bx.firstitem=p2; g2-bx.score=g2-bx.scor
23、e+p2-record; /* 累计总分 */ if(ibx.boys=g2-bx.boys+p2-record; /* 累计男团体总分 */ else g2-bx.girls=g2-bx.girls+p2-record; /* 累计女团体总分 */ h-; while(x!=0&h!=0); if(j=2) h=5; do printf( 第%d名:学校(学校编号为数字),h); scanf(%d,&x); p1=(Schools *)malloc(sizeof(Schools); p1-school=x; p2=(Items *)malloc(sizeof(Items); p2-item=
24、i; if(h=5) p2-record=p1-record=1; if(h=4) p2-record=p1-record=2; if(h=3) p2-record=p1-record=3; if(h=2) p2-record=p1-record=5; if(h=1) p2-record=p1-record=7; p1-next=g1-ai.firstschool; g1-ai.firstschool=p1; p2-next=g2-bx.firstitem; g2-bx.firstitem=p2; g2-bx.score=g2-bx.score+p2-record; /* 累计总分 */ if
25、(ibx.boys=g2-bx.boys+p2-record; /* 累计男团体总分 */ else g2-bx.girls=g2-bx.girls+p2-record; /* 累计女团体总分 */ h-; while(x!=0&h!=0); void save() FILE *fp1,*fp2; fp1=(FILE *)malloc(sizeof(FILE); fp2=(FILE *)malloc(sizeof(FILE); if(fp1=fopen(sports1,wb)=NULL) printf(cannot open file.n); return; if(fwrite(g1,size
26、of(ALLitems),1,fp1)!=1) printf(file write error.n); fclose(fp1); if(fp2=fopen(sports2,wb)=NULL) printf(cannot open file.n); return; if(fwrite(g2,sizeof(ALLNode),1,fp2)!=1) printf(file write error.n); fclose(fp2); void funct2(ALLNode *g2) /* 输出各学校总分 */ int k; printf(nn * 输出各学校总分 *n); printf( 学校编号t 总分
27、 n); for(k=1;kn;k+) printf( %dttt %dn,k,g2-bk.score); printf(n); system(pause); printf( 按任意键返回主菜单.); getchar(); void funct3(ALLNode *g2) /* 按学校编号排序输出 */ int k; Items *p2; p2=(Items *)malloc(sizeof(Items); printf(nn * 按学校编号排序输出 *n); printf( 学校编号ttt获奖情况 n); scanf(%d,&k); for(k=1;kn;k+) printf(tttttt%d
28、t,k); p2=g2-bk.firstitem; while(p2!=NULL) printf(项目%d:得%d分 ,p2-item,p2-record); p2=p2-next; printf(n); printf(n); system(pause); printf(按任意键返回主菜单.); getchar(); void funct4(ALLNode *g2) /* 按学校总分排序输出 */ int i,j,k; Items *p2; printf(nn * 按学校总分排序输出 *n); printf( 学校编号tt总分 n); scanf(%d,&k); /printf(输入要查询的项
29、目编号:); for(i=2;in;i+) printf(%dt,k); p2=g2-bk.firstitem; while(p2!=NULL) printf(%d tt%dn,g2-bk.school,g2-bk.score); p2=p2-next; printf(n); g2-b0.score=g2-bi.score; g2-b0.boys=g2-bi.boys; g2-b0.girls=g2-bi.girls; g2-b0.school=g2-bi.school; j=i-1; while(g2-b0.scorebj.score&j0) g2-bj+1.score=g2-bj.scor
30、e; g2-bj+1.boys=g2-bj.boys; g2-bj+1.girls=g2-bj.girls; g2-bj+1.school=g2-bj.school; j-; g2-bj+1.score=g2-b0.score; g2-bj+1.boys=g2-b0.boys; g2-bj+1.girls=g2-b0.girls; g2-bj+1.school=g2-b0.school; for(k=1;kn;k+) printf(%d tt%dn,g2-bk.school,g2-bk.score); system(pause); printf(按任意键返回主菜单.); getchar();
31、void funct5(ALLNode *g2) /* 按男团体总分排序输出 */ int i,j,k; Items *p2; p2=(Items *)malloc(sizeof(Items); printf(nn * 按男团体总分排序输出 *n); printf(学校编号tt男团体总分 n); scanf(%d,&k); /printf(输入要查询的学校编号:); for(i=2;in;i+) printf(%dt,k); p2=g2-bk.firstitem; while(p2!=NULL) printf(%dtt %dn,g2-bk.school,g2-bk.boys); p2=p2-next; printf(n); g2-b0.score=g2-bi.score; g2-b0.boys=g2-bi.boys; g2-b0.girls=g2-bi.girls; g2-b0.school=g2-bi.school; j=i-1; while(g2-b0.boysbj.boys&j0) g2-bj+1.score=g2-bj.score; g2-bj+1.boys=g2-bj.boys; g2-bj+1.girls=g2-bj.girls; g2-bj+1
限制150内