版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、运动会分数统计一、需求分析1、本演示程序中,可以输入参加运动会的学校编号及项目编号,学校编号要求为1<<N,男子比赛项目编号要求为1M,女子比赛项目编号要求为M+1M+W;根据具体情况选择输入参加项目的男女类别和取成绩名次类别;最后选择输入名次。2、演示程序以用户和计算机对话方式进行,即在计算机终端上显示提示信息之后,由用户输入进行查询成绩的操作:产生各学校的成绩单,包括:各学校所取得的每项成绩的项目号、名次(成绩)、姓名和得产生团体总分报表,内容包括校号、男子团体总分、女子团子总分和团体总分,然后进行数据保存操作。3、本程序执行命令包括:1)输入比赛数据2)查询相关记录3)显示各
2、学校的成绩单4)显示各校团体总分报表4、 测试数据N=4,M=3,W=2,编号为奇数的项目取前五名,为偶数的项目取前三名。具体数据如下:输入学校编号:1 2 4输入项目编号:1 3 2性别选择: 男 女 男取成绩名次: 前3名 前5名 前3名名次选择: 第1名 第4名 第2名二、概要设计1. 程序中所有数据类型有:int , struct , char , struct * , struct , char;2. 整形定义nsc学校总数msp男子项目总数wsp女子项目总数ntsp项目总数serial学校编号item得分项目range得分名次score得分成绩overgame已结束的项目编号men
3、score男子团体总分womenscore女子团体总分totalscore校团体总分3. 本程序包含六个模块:1)主程序模块main ( ) 初始化; If(“命令”=“输入”) 判断数据是否合法;接受输入数据;数据处理运算; If(“命令”=“查询”)接受具体指令; 显示相应数据;2)Input()比赛结果录入3)Cout()范围判断4)School()各学校取得成绩细表5)Overall()各校男、女及总团体总分6)Calculate()数据处理4. 程序流程图如下:Case2Y成绩查询N继续查询团体总分N结束退出NY继续输出查询学校成绩Case1Case3查询各学校成绩N输入某项目各名次
4、成绩Y继续输入输入学校及男女项目范围YY输入开始-初始化三、详细设计1. 元素类型、变量、指针类型struct athletestruct /*参赛运动员*/ char name20; char xingming20; /*姓名*/ int score; /*得分成绩*/ int range; /*得分名次*/ int item; /*得分项目*/;struct schoolstruct /*参赛学校*/ int count; /*计算实际运动员个数*/ int serial; /*学校编号*/ int menscore; /*男子团体总分*/ int womenscore; /*女子团体总分
5、*/ int totalscore; /*团体总分*/ struct athletestruct athleteMaxSize; /*参赛运动员*/ struct schoolstruct *next; /*参赛学校*/;int nsc,msp,wsp; /*实际参赛学校个数,男子、女子项目*/int ntsp; /*项目总数*/int i,j; /*循环控制变量*/int overgame; /*已结束的项目编号*/int serial,range; /*获奖的学校编号 & 获奖名次*/int n; /*用来判断项目类型(奇&偶)*/struct schoolstruct *
6、head,*pfirst,*psecond; /*用于开辟存储区域*/int *phead=NULL,*pafirst=NULL,*pasecond=NULL; /*用于项目数组指针*/2. 输入模块,建立链表,然后存储数据。包括学校、男女项目范围、各项目成绩及对输入数据合法性判断等。1) 输入学校及项目的范围并判断输入范围合法性: Is_Star_DoMain: printf("n请输入参赛学校总数(<= 20): "); scanf("%d",&nsc); if(nsc<=0|nsc>20) printf("输入错
7、误,请重新输入!n"); goto Is_Star_DoMain; Is_Msp_DoMain:输入男子项目总数并判断男子项目范围大小是否合法 Is_Wsp_DoMain:输入女子项目总数并判断女子项目范围大小是否合法2) 输入记录:char answer; /*接受判断所有项目是否结束:'y'结束,'n'没结束*/ head = (struct schoolstruct *)malloc(sizeof(struct schoolstruct); head->next = NULL; pfirst = head; /*工作指针*/ answer
8、= 'y' while ( answer = 'y' ) Is_Game_DoMain: 提示用户选择取前三名还是前五名,奇数项为取五名,偶数项取前三名,判断是否已经输入过或者是否超出范围。 overgame = *pafirst; if ( pafirst != phead ) for ( pasecond = phead ; pasecond < pafirst ; pasecond + ) if ( overgame = *pasecond ) printf("n*此运动项目已经输入过,请重新选择其他项目序号!n"); goto
9、Is_Game_DoMain; pafirst = pafirst + 1; if ( overgame > ntsp|overgame<=0 ) printf("n没有这样的运动项目!"); printf("n请重新输入!"); goto Is_Game_DoMain; switch ( overgame%2 ) /*判断奇偶性*/ case 0: n = 3;break; case 1: n = 5;break; for ( i = 1 ; i <= n ; i+ ) Is_Serial_DoMain: printf("n
10、请输入第 %d名学校的编号(>0&<=%d): ",i,nsc); scanf("%d",&serial); if ( serial > nsc ) /*判断是否存在该校*/ printf("n编号超出学校总数!n请重新输入!"); goto Is_Serial_DoMain; if ( head->next = NULL ) /*建立第一个节点*/ create(); psecond = head->next ; /*遍历指针*/ while ( psecond != NULL ) /*遍历链表判
11、断是否已存在该校*/ if ( psecond->serial = serial ) pfirst = psecond; pfirst->count = pfirst->count + 1; goto Store_Data; else psecond = psecond->next; create();Store_Data:/*存储数据*/ pfirst->athletepfirst->count.item = overgame; pfirst->athletepfirst->count.range = i; pfirst->serial
12、= serial; printf("请输入学校名称: "); scanf("%s",pfirst->athletepfirst->); printf("请输入运动员姓名: "); scanf("%s",pfirst->athletepfirst->count.xingming); 3. 计算统计模块,通过遍历链表,将各参赛学校的成绩统计出来并存入结构成员中,来修改链表中的数据.判断运动项目奇偶性予以不通名字赋值: if ( pfirst->athletei.item
13、 % 2 = 0 ) /*偶数项目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 5;break; case 2:pfirst->athletei.score = 3;break; case 3:pfirst->athletei.score = 2;break; else /*奇数项目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 7;break; case 2:pfirst->at
14、hletei.score = 5;break; case 3:pfirst->athletei.score = 3;break; case 4:pfirst->athletei.score = 2;break; case 5:pfirst->athletei.score = 1;break; 计算男女项目的各自成绩及团体总成绩: if ( pfirst->athletei.item <=msp ) /*男子项目*/ pfirst->menscore = pfirst->menscore + pfirst->athletei.score; else
15、 /*女子项目*/ pfirst->womenscore = pfirst->womenscore + pfirst->athletei.score; pfirst->totalscore = pfirst->menscore + pfirst->womenscore; pfirst = pfirst->next;4. 成绩的输入,即成绩的查询。1) 查询单个学校的成绩表。School()printf("请选择要查询的学校编号(1-%d):",nsc);pfirst = head->next; psecond = head-&
16、gt;next; while ( pfirst->next != NULL ) /*学校*/scanf("%d",&a); if(a<=0|a>nsc) printf("输入学校编号超出范围,请重新输入!"); School(); 在小于总项目数范围呢,从第一个项目开始察看是否有学校代码与要察看的学校代码相同的,如果有输出。 printf("n编号为%d的学校的成绩如下:n",a); printf("n项目编号t运动员姓名t名次t得分"); for (i=1;i<=ntsp;i+)
17、/*运动员*/ for(j=1;j<=5;j+) if(pfirst->athletej.serial=a)printf("n%dtt%st%dt%dn",j,pfirst->athletepfirst->count.xingming, pfirst->athletej.range,pfirst->athletej.score); 2) 男女总分及团体总分输出。由于男女团体总分,和团体总分在计算过程中已经计算完成,这里可以直接调用。Overall() printf("n比赛情况结果显示:n学校编号t学校名称tt男子团体总分t女子
18、团体总分t团体总分"); pfirst = head->next; while ( pfirst->next != NULL ) printf("n %dtt %stt %dtt %dtt %d",pfirst->serial,pfirst->athletepfirst->,pfirst->menscore,pfirst->womenscore,pfirst->totalscore); pfirst = pfirst->next; pfirst = pfirst->next; 5. 主
19、函数和其他函数算法。 main() /*主函数:主函数很简单,大部分是调用其他函数来实现功能的*/ 初始化 Firstout(); Inserts(); Firstout() printf("n*n"); printf("* 运动会分数统计系统 *n"); printf("*n"); printf("* 1.开始输入数据 *n"); printf("* 2.退出系统 *n"); printf("*n"); printf("请选择操作:n"); i=getc
20、he(); switch(i)/*根据选择进行操作*/ 其他一些提示性操作6. 函数的调用关系图反映了演示程序的层次结构:MainCputCalculateStartFirstoutFindSchoolOverallInsertsInputSceondoutIs_Star_DoMainIs_Wsp_DoMainIs_Msp_DoMainStore_DataIs_Game_DoMainIs_Serial_DoMain四、测试分析1. 调试中所遇到的较重要问题的回顾:1) 提出问题:所有输入输出内容只能在一屏内显示,学过c语言,很知道”n”是换行,”f”是换屏的,可是在这里就是无法实现。解决问题:
21、 输入clrscr();2)提出问题:设置选项,供用户输入选择时,当按任意键时都会跳入下一步操作,或者直接退出系统。分析问题:在供用户选择时,提供了几个选项,就写几个case语句,但是当用户输入的并不是这几个数字时,系统就不能做出正确判断。解决问题:修改case语句,添加default语句提示出错,要求重新输入; Default: clrscr(); /*清屏*/ printf("输入错误,请重新选择"); 3)提出问题:当同一项目中有同一学校的两个人时,便不能正确输出或者输出相同人名。 分析问题:由于同时有两个相同学校编号的人存在,系统在输出时,不能确定那个是正确的,或者
22、用后来的覆盖以前的。 解决问题:用for函数实现从开始到结尾的遍历。2. 算法的效率及改进设想 算法的效率:总的来讲,严重引响执行速度的便是查找,查找任意一个数据,便要将其所在的结构从头至尾遍历一次,耗费大量的时间。 改进设想:因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关学校的各种信息为集合的结构。五、用户手册1) 运行可执行程序sport.exe;2) 出现提示:* 运动会分数统计系统 * 1.开始输入数据 * 2.退出系统 *请选择操作:选择1,进入数据录入;3) 根据提示输入学校个数,男子项目个数及女子项目个数,如果输入超出范围,会出现提示:“输入错误
23、,请重新输入!”并返回重新输入; 4) 出现如下提示:奇数项目取前五名偶数项目取前三名请输入运动项目序(<=ntsp)根据需要输入项目编号; 如果输入编号超出范围,会提示“没有这样的运动项目!请重新输入!” ,如果该项目已经输入过,则提示:“此运动项目已经输入过,请重新选择其他项目序号!” ; 5) 根据屏幕提示输入各个名次学校编号、学校名称和运动员姓名,如果输入学校编号超出范围会提示:“编号超出学校总数!n请重新输入!”;特别说明:如果两次对同一编号的学校输入不通的校名,将保留后来输入的校名; 6) 输入完毕,提示用户是否继续输入下一个项目数据,“y”是“n”否;7) 选择否后进入下一
24、界面:* 运动会分数统计系统 * 1.成绩查询 * 2.全部重录(重新开始) * * 3.退出 * *请选择继续操作:选择1进程成绩查询,选择2返回2);8) 选择1后进入查询选择页面:* 运动会分数统计系统查询 * 1.各学校成绩单 * 2.团体总分 * 3.返回上一级 * 请选择继续操作:选择1按学校编号进行查询,选择2查询学校男女团体总分和团体总分表,选择3返回到上一界面;9) 选择1后,提示用户输入查询学校编号,输入即显示改校成绩,包括项目编号、运动员姓名、分数和名次,并可根据提示选择其他操作;* * 运动会分数统计系统-各学校成绩查询 * 1.继续各学校成绩查询 * 2.团体总分查询
25、 * 3.返回上一级菜单 * 4.退出系统 * 编号为%d的学校的成绩如下: 项目编号 运动员姓名 名次 得分 * * * * 10) 选择2后,显示各学校编号、男子团体总分、女子团子总分和团体总分,并可根据提示选择其他操作,显示如下: * 运动会分数统计系统-团体总分查询 * 1.各学校成绩查询 * 2.返回上一级菜单 * 3.退出 * 比赛情况结果显示:学校编号 学校名称 男子团体总分 女子团体总分 团体总分"* * * * *六、测试结果: 输入学校数目:8,男子项目5,女子项目5; 输入成绩如下:(注:名次从左往右依次递增,其它同一)项目编号:1 得分类型: 五级制取得名次1
26、2345学校编号12345学校名称青岛理工大学青岛科技大学青岛大学中国海洋大学石油大学项目编号:4 得分类型: 三级制学校编号461学校名称中国海洋大学青岛滨海学院青岛理工大学项目编号:3 得分类型:五级制学校编号3178(10)2学校名称青岛大学青岛理工大学青岛职业学院莱阳农学院青岛科技大学项目编号:8 得分类型:三级制学校编号(0)362学校名称 青岛大学青岛滨海学院青岛科技大学项目编号:5 得分类型:五级制学校编号82144学校名称莱阳农学院青岛科技大学青岛理工大学中国海洋大学中国海洋大学项目编号:7 得分类型:五级制学校编号23517学校名称青岛科技大学青岛大学华东石油大学青岛理工大学
27、青岛职业学院项目编号:6 得分类型:三级制学校编号353学校名称青岛大学华东石油大学青岛大学输入数据后所得的不同方式查询的结果:1、 从主菜单起的路径:1开始输入数据进行数据输入继续输入数据1.查询成绩2.团体总分查询显示结果如下:学校编号学校名男子团体总分女子团体总分团体总分8莱阳农学院9097青岛职业学院3146青岛滨海学院3365华东石油大学1674中国海洋大学100103青岛大学1017272青岛科技大学119201青岛理工大学172192、从1显示提示起的路径:1.各学校成绩查询输入学校编号查询输入编号:1项目编号学校名称名次得分1青岛理工大学173青岛理工大学254青岛理工大学32
28、5青岛理工大学337青岛理工大学423. 从2显示提示起的路径:1.各学校成绩查询输入学校编号查询输入编号:4项目编号学校名称名次得分1中国海洋大学424中国海洋大学155中国海洋大学425中国海洋大学515. 从3显示提示起的路径:1.各学校成绩查询输入学校编号查询 输入编号:9 输入学校编码超出范围,请重新输入!6. 从4显示提示起的路径4退出,退出系统.七、心得体会在此次设计中,明显感到自己所学知识不够,而且运用不是很熟练。在数据结构分析和使用上还有待改进和提高。在今后的学习中,一定得认真学习,多做练习,多写程序。对于指针的使用,由于之前在c语言的学习过程中,没有很好的掌握,在数据处理和
29、调用过程中导致调用失败,结果无法显示.经过几天的学习,对数据结构的知识有了更深一步的了解,对c语言的知识也有了深一步的巩固,知道了一个系统设计的大体步骤和方法,特别的是函数的调用问题有了更深的理解,由于调用的出现可以减少很多不必要的麻烦,可同时也造成了系统处理的缓慢.总之,作这个系统让我收获很多,给我将来的设计之路作好了很好的准备. 八、附录:程序原代码如下:/*包含的头文件有:*/#include <malloc.h> /*分配size个字节的内存空间*/#include <stdio.h> /*输入输出函数*/#include <stdlib.h> /*
30、动态存储分配函数或其他函数*/#define NULL 0#define MaxSize 30/*变量的定义一:*/struct athletestruct /*参赛运动员*/ char name20; int score; /*得分成绩*/ int range; /*得分名次*/ int item; /*得分项目*/;struct schoolstruct /*参赛学校*/ int count; /*计算实际运动员个数*/ int serial; /*学校编号*/ int menscore; /*男子团体总分*/ int womenscore; /*女子团体总分*/ int totalsco
31、re; /*团体总分*/ struct athletestruct athleteMaxSize; /*参赛运动员*/ struct schoolstruct *next; /*参赛学校*/;/*变量的定义二:*/int nsc,msp,wsp; /*实际参赛学校个数,男子项目,女子项目*/int ntsp; /*项目总数*/int i,j; /*循环控制变量*/int overgame; /*已结束的项目编号*/int serial,range; /*获奖的学校编号 & 获奖名次*/int n; /*用来判断项目类型(奇&偶)*/struct schoolstruct *he
32、ad,*pfirst,*psecond; /*用于开辟存储区域*/int *phead=NULL,*pafirst=NULL,*pasecond=NULL; /*用于项目数组指针*/*A:输入模块*/* 建立链表,然后存储数据。*/ /*建立链表*/cput () Is_Star_DoMain: printf("n请输入参赛学校总数(<= 20): "); scanf("%d",&nsc); if(nsc<=0|nsc>20) printf("输入错误,请重新输入!n"); goto Is_Star_DoMa
33、in; Is_Msp_DoMain: printf("请输入男子项目总数(<=30): "); scanf("%d",&msp); if(msp<=0|msp>30) printf("输入错误,请重新输入!n"); goto Is_Msp_DoMain; Is_Wsp_DoMain: printf("请输入女子项目总数(<=20): "); scanf("%d",&wsp); if(wsp<=0|wsp>20) printf("输入错
34、误,请重新输入!n"); goto Is_Wsp_DoMain;input () char answer; /*接受判断所有项目是否结束:'y'结束,'n'没结束*/ head = (struct schoolstruct *)malloc(sizeof(struct schoolstruct); head->next = NULL; pfirst = head; /*工作指针*/ answer = 'y' while ( answer = 'y' ) Is_Game_DoMain: printf("n奇
35、数项目取前五名n偶数项目取前三名"); printf("n请输入运动项目序号(<=%d):",ntsp); scanf("%d",pafirst); overgame = *pafirst; if ( pafirst != phead ) for ( pasecond = phead ; pasecond < pafirst ; pasecond + ) if ( overgame = *pasecond ) printf("n*此运动项目已经输入过,请重新选择其他项目序号!n"); goto Is_Game_D
36、oMain; pafirst = pafirst + 1; if ( overgame > ntsp|overgame<=0 ) printf("n没有这样的运动项目!"); printf("n请重新输入!"); goto Is_Game_DoMain; switch ( overgame%2 ) case 0: n = 3;break; case 1: n = 5;break; for ( i = 1 ; i <= n ; i+ ) Is_Serial_DoMain: printf("n请输入第 %d名学校的编号(>0
37、&<=%d): ",i,nsc); scanf("%d",&serial); if ( serial > nsc ) /*判断是否存在该校*/ printf("n编号超出学校总数!n请重新输入!"); goto Is_Serial_DoMain; if ( head->next = NULL ) /*建立第一个节点*/ create(); psecond = head->next ; /*遍历指针*/ while ( psecond != NULL ) /*遍历链表判断是否已存在该校*/ if ( pse
38、cond->serial = serial ) pfirst = psecond; pfirst->count = pfirst->count + 1; goto Store_Data; else psecond = psecond->next; create();Store_Data: /*存储数据*/ pfirst->athletepfirst->count.item = overgame; pfirst->athletepfirst->count.range = i; pfirst->serial = serial; printf(&
39、quot;请输入学校名称: "); scanf("%s",pfirst->athletepfirst->); printf("n是否是否继续输入运动项目?(y&n) "); answer = getch(); printf("n"); /*B:计算统计模块*/* 通过遍历链表,将各参赛学校的成绩统计出来并存入结构成员中,来修改链表中的数据。*/*计算*/calculate() pfirst = head->next; while ( pfirst->next != NULL
40、 ) for (i=1;i<=pfirst->count;i+) if ( pfirst->athletei.item % 2 = 0 ) /*偶数项目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 5;break; case 2:pfirst->athletei.score = 3;break; case 3:pfirst->athletei.score = 2;break; else /*奇数项目*/ switch (pfirst->athletei.range) case 1:pfirst->athletei.score = 7;break; case 2:pfirst->athletei.score = 5;break; case 3:pfirst->athletei.score = 3;break; case 4:pfirst->a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年绿色生态建筑农民工劳动合同示范3篇
- 二零二五年度防盗门行业市场分析报告合同2篇
- 二零二五版加油站智能监控与数据分析合同3篇
- 二零二五白云区观白活力中心房地产合作开发投资框架合同2篇
- 二零二五年度智能家电产品研发与销售合同3篇
- 二零二五版养殖企业与个体养牛户合作合同3篇
- 二零二五版数据中心机房租赁及数据备份服务合同2篇
- 基于2025年度5G网络技术研发合作合同2篇
- 二零二五版拌和站产品质量追溯与售后服务合同2篇
- 二零二五版建筑工程土方中介合同纠纷调解机制3篇
- 物业费收取协议书模板
- 电工(中级工)理论知识练习题(附参考答案)
- 工业设计概论试题
- 2024-2030年中国商务服务行业市场现状调查及投资前景研判报告
- 起重机的维护保养要求与月度、年度检查记录表
- 消防设施维护保养记录表
- 城区生活垃圾填埋场封场项目 投标方案(技术方案)
- 垃圾分类巡检督导方案
- 大一护理生涯发展展示
- 五年级上册数学应用题100题及答案
- 新生儿急救与复苏培训
评论
0/150
提交评论