运动会赛程安排课程设计报告.doc_第1页
运动会赛程安排课程设计报告.doc_第2页
运动会赛程安排课程设计报告.doc_第3页
运动会赛程安排课程设计报告.doc_第4页
运动会赛程安排课程设计报告.doc_第5页
免费预览已结束,剩余10页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

合肥学院题目: 运动会赛程安排 在一个田径运动会上,已知有m个选手参加比赛,运动项目共有n个,这包括若干个诸如100m之类的以个人形式参加的单项和4100m之类的多人参加的集体项目。另外,每位选手最多可参加3个单项,集体项目则不限制。为使选手能正常比赛,需要对赛程作合理安排。请构造出有关模型和数据结构,设计出合理安排赛程的算法和程序,以使每位选手都能正常地参加比赛,并要求比赛时间尽可能短。1、问题分析和任务定义随着计算机技术的发展,自动化普及。在学校的管理中可以用计算机实现许多项目,比如学生信息管理以及本题目运动会赛程安排。针对本题目,首先应当解决的是人员的分组问题。题目要求有m个选手参加比赛,运动项目共有n个,这包括若干个诸如100m之类的以个人形式参加的单项和4100m之类的多人参加的集体项目,每位选手最多可参加3个单项,集体项目则不限制。分组要实现每个人参加的单项比赛小于等于3,集体项目则无需考虑。每位运动员不得重复报名。其次,应当解决比赛项目的安排问题。有的比赛项目有场地冲突,比如径赛。这就需要在一项径赛进行完后安排另一项径赛。有的比赛项目没有场地冲突,比如田赛,每个田赛项目都有相应的场地进行比赛。再次,应当解决比赛项目时间的安排问题。每进行一个比赛项目都有一定的时间,而运动会的时间一般是上午8点到12点,下午2点到6点。分配好哪项比赛在什么时间段进行,以求赛程进行的时间最短。在我看来,完成以上功能的实现需要定义一下结构体:每一个项目的报名、所有的项目、选手参加信息、每项比赛的信息、比赛的存放等对于数据的输入,为了简单方便选择了内部确定。对于数据的输出,是输出一个赛程的安排表,包括赛程的举行时间段、场地、参赛人数。若是以个人参赛的,还包括分组情况等。测试时,比赛项目选为:单项:跳高 跳远 铅球 跨栏 100米 /多人参加的集体项目:4*100米 8*100米2、数据结构的选择和概要设计根据本实验的要求,不需要复杂的数据结构进行处理,选择顺序表即可。用顺序表存储比赛的项目信息,以便于输出。概要设计如下:(1)为了实现上述功能,定义如下结构体:typedef struct int n; /n=1为单项,n1时为集体项目int data; /记录参加了什么项目int TF; /参加标志符node1; /参加比赛项目typedef struct node1 itemmaxitem;int length1; /单项比赛项目数int length2; /集体比赛项目数int length; /比赛总项目数node2; /所有项目typedef structnode2 pepMaxman; /存放每位选手参加项目信息int size; /选手个数node3;typedef struct int ite; /比赛项目char a; /比赛时间段char ch; /举行场地int time; /比赛需要时间int num; /参加人数node5;typedef struct node5 itemmaxitem;int leng;node6; /顺序表存放比赛项目int timemaxitem; /每个项目一组比赛需要时间(2)本程序的子函数定义及调用关系如下:int countitem(node3 *Link,int i) /第i个人参加单项总个数int countpeople(node3 *Link,int i) /第i个项目参加人数void dele(node3 *Link,int i) /取消第i个选手参赛资格void put1(node6 *Link,int *m,int *n,int i,char a1,char a2) /输出径赛void put2(node6 *Link,int *m,int *n,int i,char a1,char a2) /输出田赛Mainint countitem(node3 *Link,int i)int countpeople(node3 *Link,int i)void dele(node3 *Link,int i)void put1(node6 *Link,int *m,int *n,int i,char a1,char a2)void put2(node6 *Link,int *m,int *n,int i,char a1,char a2)图1主函数及子函数的调用关系图3、详细设计和编码详细设计及编码如下:#define maxitem 50 /比赛项目个数最大值#define Maxman 300 /选手个数最大值/单项:跳高 跳远 铅球 跨栏 100米 /多人参加的集体项目:4*100米 8*100米int countitem(node3 *Link,int i) /第i个人参加单项总个数 int count;只统计单项比赛总数第i个人参加第j个单项count+;return count;int countpeople(node3 *Link,int i) /第i个项目参加人数int count=0;循环遍历选手,若选手的参赛标志为1count+return count;void dele(node3 *Link,int i) 取消第i个选手参赛资格 i以后的选手依次前移 选手个数减少一个/输出径赛void put1(node6 *Link,int *m,int *n,int i,char a1,char a2) 形参是项目的指针,小时,分,第几个项目,举行时间,类型第i项比赛a1时间段进行第i项比赛a2场地进行根据项目的编号输出项目的类型 举办场地if(Link-itemi.ite=1) printf( 项目类型:跳高 举行场地:运动场A ); if(Link-itemi.ite=2) printf( 项目类型:跳远 举行场地:运动场A);if(Link-itemi.ite=3) printf( 项目类型:铅球 举行场地:运动场A);if(Link-itemi.ite=4) printf( 项目类型:跨栏 举行场地:运动场A);if(Link-itemi.ite=5) printf( 项目类型:100米 举行场地:运动场B);if(Link-itemi.ite=6) printf( 项目类型:4*100米 举行场地:运动场B);if(Link-itemi.ite=7) printf( 项目类型:8*100米 举行场地:运动场B);输出此项比赛参加人数100米or4*100米满足条件即是径赛,则须分组由人数来确定分成的组数计算第i项下一项比赛开始时间/输出田赛void put2(node6 *Link,int *m,int *n,int i,char a1,char a2) 形参是项目的指针,小时,分,第几个项目,举行时间,类型 在a1时间段进行 不在a2场地进行if(Link-itemi.ite=1) printf( 项目类型:跳高 举行场地:运动场A ); if(Link-itemi.ite=2) printf( 项目类型:跳远 举行场地:运动场A);if(Link-itemi.ite=3) printf( 项目类型:铅球 举行场地:运动场A);if(Link-itemi.ite=4) printf( 项目类型:跨栏 举行场地:运动场A);if(Link-itemi.ite=5) printf( 项目类型:100米 举行场地:运动场B);if(Link-itemi.ite=6) printf( 项目类型:4*100米 举行场地:运动场B);if(Link-itemi.ite=7) printf( 项目类型:8*100米 举行场地:运动场B);输出此项比赛参加人数计算第i项下一项比赛开始时间void main()输出参赛的体育项目及项目编号如下单项比赛:t项目1:跳高t项目2:跳远t项目3:铅球t项目4:跨栏t项目5:100米集体项目:t项目6:4*100米t项目7:8*100米初始化报名表,采用随机数生成!赛事编排原则:先排径赛项目,后排田赛项目.:径赛宜先短距离,后长距离./初始化选手个数/初始化 每个选手可以选报的项目个数:单项、集体项目、总项目确定单项Link1.pepi.itemj.n=1; 前5个n=1为单项,n1时为集体项目1代表跳高2代表跳远3代表铅球4代表跨栏5代表100米Link1.pepi.item6.n=2; n1时为集体项目6代表4*100米7代表8*100米举行所在场地的确定A场地举行田赛(无场地冲突) B场地举行径赛(有场地冲突)跳高在A场地举行跳远在A场地举行铅球在A场地举行跨栏在A场地举行100米在B场地举行4*100米在B场地举行8*100在B场地举行项目举行时间的确定跳高上午进行铅球上午进行100米上午进行8*100上午进行跳远下午进行跨栏下午进行4*100米下午进行各项目每人或每组需要时间(分钟)time1=2; /跳高time2=2; /跳远time3=2; /铅球time4=4; /跨栏time5=3; /100米time6=10; /4*100米time7=18; /8*100米随机产生报名表初始化随机发生器a=rand()%2; /取余数Link1.pepi.itemj.TF=a; /若a=1,则第i个人参加了第j项比赛,反之否统计选手参加的单项比赛数并将参加单项多余3项的选手取消资格统计第i个项目参加总人数计算各项比赛过程需要时间100米 4*100米分组,人数不是8的整数倍则加1组,计算总共占用时间不分组的时间输出赛程安排如下大会赛程:一: 8:00 开幕式,运动员入场,校领导致开幕词,学生代表发言.nn二:比赛赛程);上午比赛从8:30开始,记录时针和分针及其指针char c1; 以表示上午还是下午进行char c2; 记下在那个场地进行c1=a; 上午进行c2=B; 径赛循环调用put1输出径赛c2=B; 径赛循环调用put2输出田赛c1=b; /下午进行循环调用put1输出径赛循环调用put2输出田赛三: 颁奖典礼,院长致闭幕词.n);4、上机调试因为本程序选则内部输入,所以程序运行时不需要从外部向程序输入数据。输出呢,采取分步显示输出内容,首先显示可以参加的比赛项目,然后利用随机数函数rand产生随机数进行报名。开始时不知道怎么用随机数函数,只是将产生的随机数当作运动项目的编号,直接赋值给参赛选手,导致了程序运行错误。后来采用了增添选手的参赛标志,将产生的随机数对2求模。若结果为1则赋值给选手的参赛标志,表明选手参加这项比赛;若结果为0也赋值给选手的参赛标志,表明选手未参加这项比赛。开始没有考虑到比赛进行场地的问题,结果在赛程安排上出现了2-3个径赛同时进行的错误安排。后来增加了比赛项目的场地信息,定义了变量表示比赛项目的场地信息,在赛程安排的时候优先考虑比赛项目的场地冲突。定义了一个时间的数组,用来表示比赛的时间。开始只定义了一个时间变量,使得赛程进行的时间不容易判别。后来考虑到人性化,定义了时间的小时和分钟,使赛程安排比较明朗。对于单人比赛,会有分组的问题。按照每组8人分组,若人数是8的整数倍,则组数等于人数除以8;若人数不是8的整数倍,则组数等于人数除以8然后加1。最后就是显示赛程部分了。开始只显示了比赛项目、参赛人数、分组信息、场地,忽略了比赛的开始时间和时间段的问题。增加了时间段的信息以及根据比赛的进行时间计算出下一场比赛的开始时间。每组比赛的时间由程序内赋值,没有进行外部输入。写完这个程序后,感觉最重要的是首先应该把程序的需要解决的问题罗列出来。程序编好后,感觉有些方面不全,就听取老师的建议,这样设计出来的程序就更加完善。这次修改最多的是对赛程进行合理的安排,既要考虑到比赛的时间问题,又要考虑到比赛的场地问题。这次课程设计,它让我又系统的去复习和巩固了以前学过的一些知识,同时又对课本的知识又有了一定理解和掌握,从老师以及同学们获得了很多心得和体会。5、测试结果及其分析程序的运行结果截图如下设计完后,本程序仍有许多不足之处。首先,是比赛的比赛项目以及比赛时间都是自己定的,没有这些信息的外部输入,导致本程序的灵活性降低,如要更改比赛内容的话必须从源代码中修改。其次,是人员的的分组问题。本程序采用的是利用随机数进行分组,有疏漏的地方。比如1个人参加的2项比赛在同一时间段进行的话,程序就判别不出来。本程序的各函数时间复杂度如下:int countitem(node3 *Link,int i) 时间复杂度为O(n)int countpeople(node3 *Link,int i) 时间复杂度为O(n)void dele(node3 *Link,int i) 时间复杂度为O(n)void put1(node6 *Link,int *m,int *n,int i,char a1,char a2) 时间复杂度为O(n)void put2(node6 *Link,int *m,int *n,int i,char a1,char a2) 时间复杂度为O(n)图2程序部分结果图3 程序部分结果6、用户使用说明 由于本程序没有外部输入,所以按照提示信息操作即可。7、参考文献1 王昆仑,李红. 数据结构与算法. 北京:中国铁道出版社,2006年5月。2 其它。8、附录#includestdio.h#includestdlib.h#includemath.h#define maxitem 50 /比赛项目个数最大值#define Maxman 300 /选手个数最大值/单项:跳高 跳远 铅球 跨栏 100米 /多人参加的集体项目:4*100米 8*100米typedef struct /将每一个项目的报名定义为结构体int n; /n=1为单项,n1时为集体项目int data; /记录参加了什么项目int TF; /参加标志符node1; /参加比赛项目typedef struct node1 itemmaxitem;int length1; /单项比赛项目数int length2; /集体比赛项目数int length; /比赛总项目数node2; /所有项目typedef structnode2 pepMaxman; /存放每位选手参加项目信息int size; /选手个数node3;node3 Link1;typedef struct int ite; /比赛项目char a; /比赛时间段char ch; /举行场地int time; /比赛需要时间int num; /参加人数node5;typedef struct node5 itemmaxitem;int leng;node6; /顺序表存放比赛项目node6 Link2;int timemaxitem; /每个项目一组比赛需要时间int countitem(node3 *Link,int i) /第i个人参加单项总个数 int count=0;for(int j=1;jpepi.length1;j+) /只统计单项if(Link-pepi.itemj.TF=1) /第i个人参加第j个单项count+; /printf(第%d个人参加单项总个数为%dn,i,count1);return count;int countpeople(node3 *Link,int i) /第i个项目参加人数int count=0;for(int j=1;jsize;j+) /第j个选手if(Link-pepj.itemi.TF=1)count+;printf(第%d个项目参加人数为%dn,i,count);return count;void dele(node3 *Link,int i) /取消第i个选手参赛资格 for(int j=i;jsize;j+) /i以后的选手依次前移Link-pepj=Link-pepj+1; Link-size-; /选手个数减少一个/输出径赛void put1(node6 *Link,int *m,int *n,int i,char a1,char a2) /项目的指针,小时,分,第几个项目,举行时间,类型if(Link-itemi.a=a1) /第i项比赛a1时间段进行if(Link-itemi.ch=a2) /第i项比赛a2场地进行 printf(t 项目%d开始时间 %d:,i,(*m); /i项比赛开始时间(时针)if(*n)itemi.ite=1) printf( 项目类型:跳高 举行场地:运动场A ); if(Link-itemi.ite=2) printf( 项目类型:跳远 举行场地:运动场A);if(Link-itemi.ite=3) printf( 项目类型:铅球 举行场地:运动场A);if(Link-itemi.ite=4) printf( 项目类型:跨栏 举行场地:运动场A);if(Link-itemi.ite=5) printf( 项目类型:100米 举行场地:运动场B);if(Link-itemi.ite=6) printf( 项目类型:4*100米 举行场地:运动场B);if(Link-itemi.ite=7) printf( 项目类型:8*100米 举行场地:运动场B);printf(ntt此项比赛参加人数%d人,Link-itemi.num); /输出此项比赛参加人数if(Link-itemi.ite=5|Link-itemi.ite=6) /100米or4*100米满足条件即是径赛,则须分组int r1=Link-itemi.num%8; /由人数来确定分成的组数if(r1)printf( 分成%d组n,Link-itemi.num/8+1);elseprintf( 分成%d组n,Link-itemi.num/8);else if(Link-itemi.ite!=7) printf(n); /8*100米 elseprintf( 8*100米总共分成%d队,Link-itemi.num/4);int r2=Link-itemi.num/4%8; /由人数来确定分成的组数if(r2)printf( 8*100米总共分成%d组,Link-itemi.num/4/8+1);elseprintf( 8*100米总共分成%d组,Link-itemi.num/4/8);*n=Link-itemi.time+(*n); /计算第i项下一项比赛开始时间if(*n)=60)*m=*m+*n/60;*n=*n%60;printf(n);/输出田赛void put2(node6 *Link,int *m,int *n,int i,char a1,char a2) /项目的指针,小时,分,第几个项目,举行时间,类型if(Link-itemi.a=a1) /a1时间段进行if(Link-itemi.ch!=a2) /不在a2场地进行printf(t 项目%d开始时间 %d:,i,(*m);if(*n)itemi.ite=1) printf( 项目类型:跳高 举行场地:运动场A ); if(Link-itemi.ite=2) printf( 项目类型:跳远 举行场地:运动场A);if(Link-itemi.ite=3) printf( 项目类型:铅球 举行场地:运动场A);if(Link-itemi.ite=4) printf( 项目类型:跨栏 举行场地:运动场A);if(Link-itemi.ite=5) printf( 项目类型:100米 举行场地:运动场B);if(Link-itemi.ite=6) printf( 项目类型:4*100米 举行场地:运动场B);if(Link-itemi.ite=7) printf( 项目类型:8*100米 举行场地:运动场B);printf(ntt此项比赛参加人数%d人n,Link-itemi.num); /输出此项比赛参加人数*n=Link-itemi.time+(*n); /计算第i项下一项比赛开始时间if(*n)=60)*m=*m+*n/60;*n=*n%60;printf(n);void main()int i,j;node3 *p; node6 *q; /定义指针 printf(n); printf(ttn);printf(tt 田径运动会赛程安排 n); printf(ttn); getchar();printf(参赛的体育项目及项目编号如下:n);printf(单项比赛:t项目1:跳高t项目2:跳远t项目3:铅球t项目4:跨栏t项目5:100米n);printf(集体项目:t项目6:4*100米t项目7:8*100米n);printf(初始化报名表,采用随机数生成!n);printf(nt赛事编排原则:nn);printf(:先排径赛项目,后排田赛项目.n);printf(:径赛宜先短距离,后长距离.n);getchar();Link1.size=100; /初始化选手个数/初始化 每个选手可以选报的项目个数for( i=1;i=Link1.size;i+) Link1.pepi.length1=5; /单项 Link1.pepi.length2=2; /集体项目 Link1.pepi.length=7; /总项目for( i=1;i=Link1.size;i+)for( j=1;j1时为集体项目Link1.pepi.item1.data=1; /1代表跳高Link1.pepi.item2.data=2; /2代表跳远Link1.pepi.item3.data=3; /3代表铅球Link1.pepi.item4.data=4; /4代表跨栏Link1.pepi.item5.data=5; /5代表100米 Link1.pepi.item6.n=2; /n1时为集体项目Link1.pepi.item6.data=6; /6代表4*100米Link1.pepi.item7.n=2; /n1时为集体项目Link1.pepi.item7.data=7; /7代表8*100米/举行所在场地的确定/A场地举行田赛(无场地冲突) B场地举行径赛(有场地冲突)Link2.item1.ite=1; /跳高Link2.item1.ch=A; /跳高在A场地举行Link2.item2.ite=2; /跳远Link2.item2.ch=A; /跳远在A场地举行Link2.item3.ite=3; /铅球Link2.item3.ch=A; /铅球在A场地举行Link2.item4.ite=4; /跨栏Link2.item4.ch=A; /跨栏在A场地举行Link2.item5.ite=5; /100米Link2.item5.ch=B; /100米在B场地举行Link2.item6.ite=6; /4*100米Link2.item6.ch=B; /4*100米在B场地举行Link2.item7.ite=7; /8*100Link2.item7.ch=B; /8*100在B场地举行printf(项目比赛场地的确定!n);getchar();/项目举行时间的确定Link2.item1.a=a; /跳高上午进行Link2.item3.a=a; /铅球上午进行Link2.item5.a=a; /100米上午进行Link2.item6.a=a; /8*100上午进行Link2.item2.a=b; /跳远下午进行Link2.item4.a=b; /跨栏下午进行Link2.item7.a=b; /4*100米下午进行printf(项目举行时间的确定!n);getchar();/各项目每人或每组需要时间(分钟)time1=2; /跳高time2=2; /跳远time3=2; /铅球time4=4; /跨栏time5=3; /100米time6=10; /4*100米time7=18; /8*100米printf(各项目每人或每组需要时间确定!n);getchar();q=&Link2; /项目int a,k=25; /临时变量 /k用来改变随机发生器,初值可任意定for(i=1;i=Link1.size;i+)for(int j=1;j=Link1.pepi.length;j+) /随机产生报名表k+;srand(k); /初始化随机发生器a=rand()%2; /取余数Link1.pepi.itemj.TF=a; /若a=1,则第i个人参加了第j项比赛,反之否p=&Link1;printf(随机报

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论