运动会数据统计.docx
- 文档编号:23663541
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:19
- 大小:97.72KB
运动会数据统计.docx
《运动会数据统计.docx》由会员分享,可在线阅读,更多相关《运动会数据统计.docx(19页珍藏版)》请在冰豆网上搜索。
运动会数据统计
1、需求分析
学校每次举行运动会都是用的原始的计分方式——笔和纸,难道在如今的信息时代里我们仍然不能摆脱这种古老而又麻烦的计分方式吗?
我不信。
给我一台电脑,我会让计分从此变得简单,当然的加上我的程序。
这样一个实际而又稍显复杂的问题便迎刃而解了,当然让电脑做的东西必须是非常具体的:
也就是说必须在特定的条件下,我的程序才能算出结果,为此我们把问题描述的更为具体,如下:
参加运动会的n个学校编号为1~n,比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。
有些项目取前五名,得分依次为6,4,3,2,1;有些项目取前三名,得分依次为4,2,1。
写一程序产生各学校的成绩单(包括各校所取得的每项成绩的项目号、成绩、姓名和得分)和团体总分报表(包括校号、男子团体总分、女子团体总分和团体总分)。
2、概要设计
稍微分析了上面的问题,发现此问题的输入量有点大,如何处理好输入稍显复杂,我想就把输入和输出分别用一个函数模块,数据结构采用链表,创建链表也分为一个函数模块,再就是问题的关键所在——计算排名的函数模块,到此为止,问题分块已经完成。
这样问题立刻变得清晰明了:
大致就是输入->创建链表->计算->输出。
考虑到输入的种种可能出现的错误,设计了各种应对方法,所以输入略显繁杂,但思路是清晰的:
输入学校数目和项目数目,这个是下面输入的标准;
输入各项目的排名,超过范围或者重复输入则重新输入;
输入获奖学校,超出范围则重新输入;
输入获奖运动员姓名;
是否继续输入,是的话则返回继续输入;停止输入则跳出输入;进入计算函数;
计算时按按项目号位为奇数时取前五名,项目号位为偶数时取前三名计算得分。
到这里问题基本结束了,就只要按链表输出计算结果就完成了,输出时先输出各校所以运动员得分情况,再输出总的排名情况。
好!
退出主函数,问题结束。
流程图设计如下:
由上图看来问题已被分解的相当清晰了,分析其条理,没有出项Bug的可能,那么就让它实现吧。
3、详细设计
现在为运动员和学校定义两个结构体:
typedefstructathletestruct{/*运动员*/
charname[20];
intscore;/*分数*/
intrange;/**/
intitem;/*项目*/
}ATH;
typedefstructschoolstruct{/*学校*/
intcount;/*编号*/
intserial;/**/
intmenscore;/*男选手分数*/
intwomenscore;/*女选手分数*/
inttotalscore;/*总分*/
ATHathlete[MaxSize];/**/
structschoolstruct*next;
}SCH;
我和钟泽银商量了一下,决定分工完成四个函数模块,我负责输入和计算两个模块,我分别命名为input(),和calculate();
我们设计在主函数里面输入学校数目和男女项目数,把它们定义为全局变量intnsc,msp,wsp;
voidinput(){
charanswer;
head=(SCH*)malloc(sizeof(SCH));/*定义头节点*/
head->next=NULL;
pfirst=head;
answer='y';
while(answer=='y'){//当输入为y时,继续输入
Is_Game_DoMain:
printf("\n项目号位为奇数时取前五名\n项目号位为偶数时取前三名");
printf("\n输入运动项目序号x<=%d:
",ntsp);
scanf("%d",pafirst);
overgame=*pafirst;
if(pafirst!
=phead){
for(pasecond=phead;pasecond if(overgame==*pasecond){//判断是否重复输入 printf("\n这个项目已经存在请选择其他的数字\n"); gotoIs_Game_DoMain; } } } pafirst=pafirst+1; if(overgame>ntsp){//判断是否越界 printf("\n项目不存在"); printf("\n请重新输入"); gotoIs_Game_DoMain;//越界则重新输入 } switch(overgame%2){ case0: n=3;break; case1: n=5;break; } for(i=1;i<=n;i++){ Is_Serial_DoMain: printf("\n项目%d获得第%d名的学校序号0 ",overgame,i,nsc); scanf("%d",&serial); if(serial>nsc){ printf("\n超过学校数目,请重新输入"); gotoIs_Serial_DoMain; } if(head->next==NULL){ create(); } psecond=head->next; while(psecond! =NULL){//找到对应学校 if(psecond->serial==serial){ pfirst=psecond; pfirst->count=pfirst->count+1; gotoStore_Data; } else{ psecond=psecond->next; } } create();//新建school节点 Store_Data: pfirst->athlete[pfirst->count].item=overgame;//把数据写入节点 pfirst->athlete[pfirst->count].range=i; pfirst->serial=serial; printf("输入运动员姓名: "); scanf("%s",pfirst->athlete[pfirst->count].name); } printf("\n继续输入运动项目(y&n)? "); answer=getch(); printf("\n"); } } Input()写完了,虽然有点冗长,但它达到了我的要求,防止了一些我所能想到错误输入,长就长点吧。 下面写calculate()函数。 voidcalculate(){ pfirst=head->next; while(pfirst->next! =NULL){ for(i=1;i<=pfirst->count;i++){ if(pfirst->athlete[i].item%2==0){//偶数号项目前三名加分 switch(pfirst->athlete[i].range){ case1: pfirst->athlete[i].score=4;break; case2: pfirst->athlete[i].score=2;break; case3: pfirst->athlete[i].score=1;break; } } else{ switch(pfirst->athlete[i].range){//奇数号项目前五名加分 case1: pfirst->athlete[i].score=6;break; case2: pfirst->athlete[i].score=4;break; case3: pfirst->athlete[i].score=3;break; case4: pfirst->athlete[i].score=2;break; case5: pfirst->athlete[i].score=1;break; } } if(pfirst->athlete[i].item<=msp){//前msp项是男子组项目 pfirst->menscore=pfirst->menscore+pfirst->athlete[i].score; } else{//后面的为女子项目 pfirst->womenscore=pfirst->womenscore+pfirst->athlete[i].score; } } pfirst->totalscore=pfirst->menscore+pfirst->womenscore;//总分为两者和 pfirst=pfirst->next; } } calculate()函数完成。 钟泽银的函数也完成了,见附录。 主函数如下: intmain(){ printf("\n\t\t\t运动会分数统计\n"); printf("输入学校数目x>=5: "); scanf("%d",&nsc); printf("输入男选手的项目x<=20: "); scanf("%d",&msp); printf("输入女选手项目<=20: "); scanf("%d",&wsp); ntsp=msp+wsp; phead=(int*)calloc(ntsp,sizeof(int)); pafirst=phead; pasecond=phead; input(); calculate(); output(); return0; } 4、调试分析和测试结果 各模块调试完成后,总体调试开始。 为简单起见,输入数目为较小的数,以便输入。 输入学校数目和男女项目数后,界面如图: 此时程序进入input()函数;接下来是漫长的输入…… 下面是一个举例: 输入完成后,逐条输出各校参赛情况: 最后是运动会总成绩: 至此程序结束。 5、总结 “数据结构”是计算机类各专业的核心课程,也是其他诸多类专业的重要选修课。 开设这门课可以为理解、应用和开发程序提供技术和方法支持,为后续课程的学习提供重要思想和方法基础。 同时对于学生逻辑思维培养和程序设计思想体系的建立有着重要的影响。 学好“数据结构”仅仅通过课堂教学或自学获取理论知识是远远不够的,还必须加强实践,亲自上机输入、编辑、检查、修改、调试和运行各种典型算法。 在实际的学习和应用实践中,很多同学认为“数据结构”难学,碰到实际问题不知从何处下手,缺乏针对性的实践训练是主要原因。 通过本课程的课程设计,应使学生达到以下的基本要求: 1.能根据加工数据对象的特征,选择适当的数据结构、存贮结构及相应算法,初步掌握各种算法在时间和空间的分析技巧。 2.能够进行算法设计和程序设计,并且使所设计的程序结构清楚,正确易读,并上机调试通过。 3.较强的实习、实践能力。 4.较强的分析问题、解决问题的能力。 课程设计正是依照教学目的,在数据结构课程将要结束时进行的,整个设计过程包括选题、分析数据的逻辑结构、存储结构、算法、编程以及上机调试等几个方面。 根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点: 1、认真上好专业实验课,多在实践中锻炼自己。 2、写程序的过程中要考虑周到,严密。 3、在做设计的时候要有信心,有耐心,切勿浮躁。 4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。 5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。 6、参考文献 1、严蔚敏等数据结构(C语言版)2010清华大学出版社 参考页码: 18-38 2、严蔚敏等数据结构题集(C语言版)2010清华大学出版社 参考页码: 10-15 3、ThomasH.Cormen等算法导论潘金贵等译机械工业出版社2008年6月参考页码: 121-124 4、谭浩强C++程序设计 2004(第一版)清华大学出版社 参考页码: 全书 5、XX() 6、谷歌(.hk) 7、致谢 首先要感谢我的同组成员钟泽银同学,我们的程序时分工合作的,完成这个程序的过程中我们在一起认真研讨程序设计方案从分析到编码到调试都是我们讨论交流达成一致,从这里我尤为感受到讨论的功效。 其次要感谢席老师全程辅导我们的程序设计,给予我们指导与答疑,使整个课程设计的过程虽然充满困难,但在老师的帮助下,问题都得到了很好的解决。 最后要感谢学院领导给予我们这次课程设计的机会,使我们的理论知识得以实践和磨练,我们从中受益匪浅。 8、附录 #include #include #include #include #include #defineNULL0 #defineMaxSize30 typedefstructathletestruct{/*运动员*/ charname[20]; intscore;/*分数*/ intrange;/**/ intitem;/*项目*/ }ATH; typedefstructschoolstruct{/*学校*/ intcount;/*编号*/ intserial;/**/ intmenscore;/*男选手分数*/ intwomenscore;/*女选手分数*/ inttotalscore;/*总分*/ ATHathlete[MaxSize];/**/ structschoolstruct*next; }SCH; intnsc,msp,wsp; intntsp; inti,j; intovergame; intserial,range; intn; SCH*head,*pfirst,*psecond; int*phead=NULL,*pafirst=NULL,*pasecond=NULL; voidcreate(){ pfirst=(structschoolstruct*)malloc(sizeof(structschoolstruct)); pfirst->next=head->next; head->next=pfirst; pfirst->count=1; pfirst->menscore=0; pfirst->womenscore=0; pfirst->totalscore=0; } voidinput(){ charanswer; head=(SCH*)malloc(sizeof(SCH));/*定义头节点*/ head->next=NULL; pfirst=head; answer='y'; while(answer=='y'){ Is_Game_DoMain: printf("\n项目号位为奇数时取前五名\n项目号位为偶数时取前三名"); printf("\n输入运动项目序号x<=%d: ",ntsp); scanf("%d",pafirst); overgame=*pafirst; if(pafirst! =phead){ for(pasecond=phead;pasecond if(overgame==*pasecond){ printf("\n这个项目已经存在请选择其他的数字\n"); gotoIs_Game_DoMain; } } } pafirst=pafirst+1; if(overgame>ntsp){ printf("\n项目不存在"); printf("\n请重新输入"); gotoIs_Game_DoMain; } switch(overgame%2){ case0: n=3;break; case1: n=5;break; } for(i=1;i<=n;i++){ Is_Serial_DoMain: printf("\n项目%d获得第%d名的学校序号0 ",overgame,i,nsc); scanf("%d",&serial); if(serial>nsc){ printf("\n超过学校数目,请重新输入"); gotoIs_Serial_DoMain; } if(head->next==NULL){ create(); } psecond=head->next; while(psecond! =NULL){ if(psecond->serial==serial){ pfirst=psecond; pfirst->count=pfirst->count+1; gotoStore_Data; } else{ psecond=psecond->next; } } create(); Store_Data: pfirst->athlete[pfirst->count].item=overgame; pfirst->athlete[pfirst->count].range=i; pfirst->serial=serial; printf("输入运动员姓名: "); scanf("%s",pfirst->athlete[pfirst->count].name); } printf("\n继续输入运动项目(y&n)? "); answer=getch(); printf("\n"); } } voidcalculate()/**/{ pfirst=head->next; while(pfirst->next! =NULL){ for(i=1;i<=pfirst->count;i++){ if(pfirst->athlete[i].item%2==0){ switch(pfirst->athlete[i].range){ case1: pfirst->athlete[i].score=4;break; case2: pfirst->athlete[i].score=2;break; case3: pfirst->athlete[i].score=1;break; } } else{ switch(pfirst->athlete[i].range){ case1: pfirst->athlete[i].score=6;break; case2: pfirst->athlete[i].score=4;break; case3: pfirst->athlete[i].score=3;break; case4: pfirst->athlete[i].score=2;break; case5: pfirst->athlete[i].score=1;break; } } if(pfirst->athlete[i].item<=msp){ pfirst->menscore=pfirst->menscore+pfirst->athlete[i].score; } else{ pfirst->womenscore=pfirst->womenscore+pfirst->athlete[i].score; } } pfirst->totalscore=pfirst->menscore+pfirst->womenscore; pfirst=pfirst->next; } } voidoutput(){ pfirst=head->next; psecond=head->next; while(pfirst->next! =NULL){ printf("\n第%d号学校的结果成绩: ",pfirst->serial); printf("\n\n项目的序号\t得分运动员\t分数"); for(i=1;i<=ntsp;i++){ for(j=1;j<=pfirst->count;j++){ if(pfirst->athlete[j].item==i){ printf("\n%d\t\t%s\t\t%d",i,pfirst->athlete[j].name,pfirst->athlete[j].score);break; } } } printf("\n\n\n\t\t\t\t\t\t按任意建进入下一页"); getch(); pfirst=pfirst->next; } printf("\n运动会结果: \n\n学校编号\t男运动员成绩\t女运动员成绩\t总分"); pfirst=head->next; while(pfirst->next! =NULL){ printf("\n%d\t\t%d\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运动会 数据 统计