《数据结构运动会分数统计课程设计(共22页).doc》由会员分享,可在线阅读,更多相关《数据结构运动会分数统计课程设计(共22页).doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 数据结构课程设计 目录1. 需求分析-2 1.1问题描述-21.2基本任务-22. 概要设计-22.1主界面设计-22.2数据结构设计-32.3系统功能设计-33. 模块设计-33.1模块设计-33.2系统子模块及功能设计-43.3系统模块之间的调用关系-44. 详要设计-54.1数据结构设计-54.2系统主要模块设计-65. 调试分析-85.1创建学校链表-85.2添加获奖学生-85.3按项目查学校成绩-115.4按学校编号查参加项目-146. 用户使用说明-157. 参考文献-158. 对软件自我评价-159. 程序设计源代码-1610. 心得体会-22一需求分
2、析 1.1 问题描述1. 课程设计题目:运动会分数统计。2. 任务:加运动会有n个学校,学校编号为1n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1m,女子m+1m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m=20,n=20)3. 问题分析:1)、每个学校有运动员要参加运动项目,故存储结构要有三个,项目结构体,学生信息结构体和学校链表。每个结点存储一个学校,每个学校可以有多名运动员参加运动项目。由此,存储结构就建立了。2)、要求不同的项目根据具体情况取去前五名或前三名积分,则可
3、以设定标准,即当参加某项目的运动员数等于或多于五人时,就取该项目的前五名进行积分,取前五名的积分分别为:7,5,3,2,1。当参加某一项目的人数少于五人时,则去该项目的前三名进行积分,去取前三名的积分分别为:5,3,2。3)、要求能统计学校的总分,并可以按学校编号输出每个学校的参赛信息及每个学校每个运动员的信息和所有运动项目清单。以上这些功能可以通过遍历学校链表来实现。4)、要求可以学校编号查询学校某个项目的情况,用户输入学校编号和项目编号,通过遍历学校链表即可实现。5)、要求可以按编号查询取得前三或前五名的学校,用户输入要查询的项目的编号,通过遍历学校链表即可实现。6)、设置菜单函数menu
4、(),产生用户界面。 规定: 输入数据形式和范围:可以输入学校的名称,运动项目的名称输出形式:有中文提示,各学校分数为整形界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。 1.2 基本任务通过用户调查分析及实际需求,系统需要实现如下基本任务:1) .输入各个项目的前三名或前五名的成绩;2) .统计各学校总分;3).按学校编号或名称、男女团体总分排序输出;4).按学校编号查询
5、学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。数据存入文件并能随时查询。二概要设计为了完成需求分析的基本任务,主要从以下3个方面进行设计: 2.1 主界面设计为了实现运动会分数统计的各项功能,设计了一个含有多个菜单项的主控菜单模块以链接系统的各项功能,以方便用户使用系统。系统主控菜单运行界面如图1所示:图1 运动会分数统计主菜单 2.2 数据结构设计系统采用数据的存储结构定义:运动项目结构体、 运动员信息结构体、学校链表此外,还定义了一些全局变量:学校总数SchoolCount、男生项目总数BoyProject、女生项目总数GirlProject、项目总数TotalProjec
6、t、项目表Project_T41。 2.3 系统功能设计创建学校的链表: void CreatSchoolLink(School &head);添加获奖学生: void AddStudentLink(School &head); 按项目编号查询取得前三或前五名的学校。 void Find_Project_ID(School &head,int Project_ID); 按学校编号查询学校某个项目。 void Find_School_Project(School &head,int School_ID,int Project_ID);成绩统计: void ScoreCount(School &h
7、ead);输出参赛结果: void OutPut_Link(School head);(7) .添加学生数据: void AddStudent(School &head);(8).菜单函数: int menu();(9).主函数: int main();三模块设计 3.1 模块设计系统主要包含主程序模块和其它链表操作模块。其调用关系如图2所示。ScoreCount(School&head)main()CreatSchoolLink(head)AddStudent(head)OutPut_Link(head)FindProject_ID(head,Project_ID)Find_School_P
8、roject(head,School_ID,intProject_ID)menu()AddStudentLink(head) 图2 模块调用示意图 3.2 系统子模块及其功能设计系统设计了8个子功能模块,8个子功能模块的描述如下:创建学校的链表: void CreatSchoolLink(School &head);添加获奖学生: void AddStudentLink(School &head); 按项目编号查询取得前三或前五名的学校。 void Find_Project_ID(School &head,int Project_ID); 按学校编号查询学校某个项目。 void Find_Sc
9、hool_Project(School &head,int School_ID,int Project_ID);成绩统计: void ScoreCount(School &head);输出参赛结果: void OutPut_Link(School head);(8) .添加学生数据: void AddStudent(School &head);(8).菜单函数: int menu(); 3.3 系统模块之间的调用关系系统的10个子模块之间的主要调用关系如图3所示:Menu() 图3 系统函数调用关系图四详细设计 4.1 数据结构设计系统采用线性表的链式存储结构存储学校信息。结点定义如下:typ
10、edef struct SchoolNodeint number;/学校编号 char name10; int count;/运动员人数 int boyscore;/男子团体总分 int girlscore;/女子团体总分 int totalscore;/团体总分 int jifen;/积分 Student students20;/参赛学生 struct SchoolNode *next;SchoolNode,*School; 4.2 系统主要模块设计(1) 创建学校链表算法思想及程序代码:void CreatSchoolLink(School &head)/创建学校的链表 School p;
11、 int i; head=p=(School)malloc(sizeof(SchoolNode); for(i=1;inext=(School)malloc(sizeof(SchoolNode); printf(请输入编号为%d的学校的名称:n,i); scanf(%s,p-name); p-number=i; p-count=0; p-boyscore=0; p-girlscore=0; p-totalscore=0; p-jifen=0; p-next=NULL;/使指针指向空 head=head-next;/头指针后移(2) 添加获奖学生函数程序代码:void AddStudentLin
12、k(School &head)/添加获奖学生 School L,p; int School_ID; /学校编号 char StudentName20; /学生姓名 int sex;/性别 int Project_ID; /项目编号 int score; /成绩 int ranking; /名次 printf(请输入学生的姓名:n); scanf(%s,StudentName); printf(请输入该学生所在学校的编号:n); scanf(%d,&School_ID); printf(请输入该学生的性别(0-女,-男):n); scanf(%d,&sex); printf(请输入该学生参加的项
13、目编号:n); scanf(%d,&Project_ID); if(sex=0) GirlProject=Project_ID; if(sex=1) BoyProject=Project_ID; printf(请输入该学生该项目的得分:n); scanf(%d,&score); printf(请输入该学生在该项目中的名次:n); scanf(%d,&ranking); L=head; while(L) if(L-number=School_ID) p=L; p-count=p-count+1; /运动员数+1 strcpy(p-studentsp-count.name, StudentName
14、); /学生姓名 p-studentsp-count.Project=Project_ID ;/得分项目 Project_TProject_ID.count=Project_TProject_ID.count+1; /该项目得分人数+1 p-studentsp-count.ranking=ranking;/得分名次 p-studentsp-count.score=score;/得分 p-studentsp-count.sex=sex; /性别 break; else L=L-next; (3) 按学校项目查询前三名和前五名学校函数程序代码:void Find_Project_ID(School
15、 &head,int Project_ID) /按项目编号查询取得前三或前五名的学校。 School h,p; p=h=head; /保存链表头指针 int i; printf(查询结果如下:n); while(h) for(i=1;icount;i+) if(h-studentsi.Project=Project_ID) printf(学校:%s 姓名:%s 名次:%dn,h-name,h-studentsi.name,h-studentsi.ranking); printf(n-n); h=h-next; (4) 按学校编号查询学校的某个项目程序代码:void Find_School_Pr
16、oject(School &head,int School_ID,int Project_ID)/按学校编号查询学校某个项目 School h,p; int Project_i=0; int i; p=h=head; /保存链表头指针 while(h) if(h-number=School_ID)p=h;break; h=h-next; for(i=1;icount;i+) if(p-studentsi.Project=Project_ID) printf(查询结果如下:n); printf(姓名:%sn,p-studentsi.name); Project_i=p-studentsi.Pro
17、ject; if(p-studentsi.sex=0) printf(性别:女n); Project_i=Project_i+20; else printf(性别:男n); printf(项目编号:%d 项目名称%s 该项目得分%d 名次:%dn,p-studentsi.Project,Project_TProject_i.name,p-studentsi.score,p-studentsi.ranking); 五调试分析各子功能测试运行结果如下: 5.1创建学校链表运行结果: 创建5个学校,分别为重庆工商大学、重庆邮电大学、重庆交通大学、重庆师范大学、重庆大学 5.2添加获奖学生运行结果:详
18、细添加学生人数,我们组徐维维已截图,总共输入重庆工商大学9人,其中项目2有5人,项目1、3、4、5各一人,重庆邮电大学1人参加项目5,重庆交通大学2人,,参加项目2、5各一人。 5.3按项目查找前三名或前五名学校运行结果:由运行结果可以知道,当每个项目人数大于等于5时,按第一种积分计算,第一名取7分,当每个项目总数小于5时,按第二种积分计算,第一名取得是5分。其次还计算了每个学校女子团体总分、男子团体总分、学校总分。 5.4按学校编号查找某个项目参加人数函数运行结果:六用户使用说明该运动会分数统计程序用C语言编写,实现了所要求的大部分功能。(1)按数字键1,使用前首先要进行参数统计,包括参赛学
19、校数(不多余20个),男生项目数(不多于20个)和女生项目数(不多于20个)。设置时同时输入学校及项目的名称,要求输入英文字符。(2)按数字键2用户可以添加获奖学习信息,包括所在学校编号,性别,参赛项目编号,成绩和名次。(3)按数字键3,可以按学校编号输出学校参赛的信息,包括学校的编号名称,男子团体总分,女子团体总分,团体总分,积分。可以输出每个学校的每个运动员的信息,包括姓名,性别,得分项目名称,成绩,名次。可以输出所有的运动项目。(4)按数字键4,可以查询某个学校某个项目的信息。(5)按数字键5,可以按项目编号查询取得前三或前五名的学校。(6)按15之外的数字键可以退出程序。七参考文献在编
20、程过程中所参考的文献:数据结构第三版、C语言教程八对所设计的软件进行自我评价 此源程序代码还存在两点点没有解决的问题,第一学校总分成绩排序没有编写代码,第二男女生参加项目人数没有统计,其他的相关要求基本上达到。在实验过程中出现以下几点问题:第一,在创建链表时,忽略了不带头结点的指针头指针需要向后移,是由于长期的定式思维,头指针是不能发生改变导致;第二,对链表的掌握不是足够的扎实,因此在处理相关问题的时候,存在很大的障碍,譬如对遍历链表,表头指针的后移;第三,在处理每个项目的前三名和前五名积分是花费了一段时间去理解。九程序源代码:#includestdio.h#includemalloc.h#i
21、ncludestdlib.h#includestring.htypedef struct Projectint number;/项目编号 char name10;/项目名称 int count;/该项目得分人数Project_Table;typedef struct Studentchar name10; int sex; int Project;/参加的项目 int score;/成绩 int ranking;/名次Student;typedef struct SchoolNodeint number;/学校编号 char name10; int count;/运动员人数 int boysc
22、ore;/男子团体总分 int girlscore;/女子团体总分 int totalscore;/团体总分 int jifen;/积分 Student students20;/参赛学生 struct SchoolNode *next;SchoolNode,*School;int SchoolCount=0;/学校总数int BoyProject=0;/男生项目总数int GirlProject=0;/女生项目总数int TotalProject=0; /项目总数Project_Table Project_T41;/项目表void CreatSchoolLink(School &head)/创
23、建学校的链表 School p; int i; head=p=(School)malloc(sizeof(SchoolNode); for(i=1;inext=(School)malloc(sizeof(SchoolNode); printf(请输入编号为%d的学校的名称:n,i); scanf(%s,p-name); p-number=i; p-count=0; p-boyscore=0; p-girlscore=0; p-totalscore=0; p-jifen=0; p-next=NULL;/使指针指向空 head=head-next;/头指针后移 void AddStudentLin
24、k(School &head)/添加获奖学生 School L,p; int School_ID; /学校编号 char StudentName20; /学生姓名 int sex;/性别 int Project_ID; /项目编号 int score; /成绩 int ranking; /名次 printf(请输入学生的姓名:n); scanf(%s,StudentName); printf(请输入该学生所在学校的编号:n); scanf(%d,&School_ID); printf(请输入该学生的性别(0-女,-男):n); scanf(%d,&sex); printf(请输入该学生参加的项
25、目编号:n); scanf(%d,&Project_ID); if(sex=0) GirlProject=Project_ID; if(sex=1) BoyProject=Project_ID; printf(请输入该学生该项目的得分:n); scanf(%d,&score); printf(请输入该学生在该项目中的名次:n); scanf(%d,&ranking); L=head; while(L) if(L-number=School_ID) p=L; p-count=p-count+1; /运动员数+1 strcpy(p-studentsp-count.name, StudentName
26、); /学生姓名 p-studentsp-count.Project=Project_ID ;/得分项目 Project_TProject_ID.count=Project_TProject_ID.count+1; /该项目得分人数+1 p-studentsp-count.ranking=ranking;/得分名次 p-studentsp-count.score=score;/得分 p-studentsp-count.sex=sex; /性别 break; else L=L-next; void Find_Project_ID(School &head,int Project_ID) /按项目
27、编号查询取得前三或前五名的学校。 School h,p; p=h=head; /保存链表头指针 int i; printf(查询结果如下:n); while(h) for(i=1;icount;i+) if(h-studentsi.Project=Project_ID) printf(学校:%s 姓名:%s 名次:%dn,h-name,h-studentsi.name,h-studentsi.ranking); printf(n-n); h=h-next; void Find_School_Project(School &head,int School_ID,int Project_ID)/按
28、学校编号查询学校某个项目 School h,p; int Project_i=0; int i; p=h=head; /保存链表头指针 while(h) if(h-number=School_ID)p=h;break; h=h-next; for(i=1;icount;i+) if(p-studentsi.Project=Project_ID) printf(查询结果如下:n); printf(姓名:%sn,p-studentsi.name); Project_i=p-studentsi.Project; if(p-studentsi.sex=0) printf(性别:女n); Project
29、_i=Project_i+20; else printf(性别:男n); printf(项目编号:%d 项目名称%s 该项目得分%d 名次:%dn,p-studentsi.Project,Project_TProject_i.name,p-studentsi.score,p-studentsi.ranking); void OutPut_Link(School head) /向屏幕输出数据 School h; h=head; int i; int Project_ID; int Project_count_i; while(h) /遍历学校 printf(学校编号:%dn,h-number);
30、 printf(学校名称:%sn,h-name); printf(本次运动会积分%dn,h-jifen); printf(男子团体总分:%dn,h-boyscore); printf(女子团体总分:%dn,h-girlscore); printf(总分:%dn,h-totalscore); printf(运动员数:%dn,h-count); for(i=1;icount;i+) /输出该校学生运动员情况 printf(运动员姓名:%sn,h-studentsi.name); if(h-studentsi.sex=0)printf(性别:女n); else printf(性别:男n); Proj
31、ect_ID=h-studentsi.Project; if(h-studentsi.sex=0)Project_ID=Project_ID+20; /如果是女生则项目表向后移动 printf(得分项目:%sn,Project_TProject_ID.name); printf(得分:%dn,h-studentsi.score); printf(得分名次:%dn,h-studentsi.ranking); printf(n-n); h=h-next; /指针向后移动 printf(n-n); void ScoreCount(School &head)/成绩统计 School p; p=head
32、; /保存链表头指针 int boyscore=0; /男子团体总分 int girlscore=0; /女子团体总分 int totalscore=0; /团体总分 int i; int Project_i=0; int jifen=0;/积分 while(p) for(i=1;icount;i+) /计算分数 totalscore=totalscore+p-studentsi.score; /计算总分 if(p-studentsi.sex=0) girlscore=girlscore+p-studentsi.score;/女子团体总分 else boyscore=boyscore+p-st
33、udentsi.score;/男子团体总分 /计算积分 Project_i=p-studentsi.Project; if(Project_TProject_i.count=5) /取前名 if(p-studentsi.ranking=1)jifen=jifen+7; else if(p-studentsi.ranking=2)jifen=jifen+5; else if(p-studentsi.ranking=3)jifen=jifen+3; else if(p-studentsi.ranking=4)jifen=jifen+2; else if(p-studentsi.ranking=5)
34、jifen=jifen+1; if(Project_TProject_i.countstudentsi.ranking=1)jifen=jifen+5; else if(p-studentsi.ranking=2)jifen=jifen+3; else if(p-studentsi.ranking=3)jifen=jifen+2; /for p-jifen=jifen; /计算积分 p-girlscore=girlscore;/保存女子总分 p-boyscore=boyscore;/保存男子总分 p-totalscore=totalscore;/保存总分 jifen=0; boyscore=0; /男子团体总分 girlscore=0; /女子团体总分 totalscore=0; /总分 p=p-next; /向后