运动会分数统计系统课程设计说明书分析.docx
《运动会分数统计系统课程设计说明书分析.docx》由会员分享,可在线阅读,更多相关《运动会分数统计系统课程设计说明书分析.docx(24页珍藏版)》请在冰豆网上搜索。
运动会分数统计系统课程设计说明书分析
合肥师范学院
(本科)
课程设计说明书
课 程
数据结构
题 目
运动会分数统计系统
姓 名
朱茜 刘金玉 史雯
学 号
1110451018 1110451112 1110451088
专业班级
2011级计算机软件2班
指导教师
程敏
完成日期
2012
年
12
月
25
日
1、绪言
21世纪是个信息化的时代,现代计算机技术的发展,为各行各业的发展创造了一个全新的时代背景——人们的生活、工作等已经越来越离不开计算机科学的运用,体育作为个人、家庭、社会的一个主要实践领域,大大小小的运动会也在各大中院校中展开,自从计算机科学涉及运动领域后,人们对运动会的管理也从人工的向自动化转变。
运用数据结构的知识解决运动会分数统计的问题,编写一个程序来完成运动会分数统计系统.本程序设计中,可以输入参加运动会的学校编号及项目编号;根据具体情况选择输入参加项目的男女类别和取成绩名次类别;最后选择输入名次;实现数据统计,排序输出,学院及项目查询等功能。
数据结构课程设计是为数据结构课程独立开设的实践性教学环节。
课程设计的目的是要求学生达到熟练掌握C语言的基本知识和技能;了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改;培养算法分析能力,分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
2、需求分析
2.1功能需求
本系统主要是运动会分数统计方案设计。
任务:
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定.(m<=20,n<=20)
运动会分数统计方案适合采用结构体数组,为了实现系统功能,主要应实现以下几部分:
比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果。
2。
2数据需求
需要输入学校编号,项目编号,取得的名次,以及哪些名次.
2.3性能需求
本程序在运行期间,为了避免在运行大量数据时不会出错,并且能够在很短的时间内将运行结果稳定输出,就需要系统达到安全性能好,可靠性高,稳定性强,处理数据迅速等特点。
3、系统设计
3。
1系统设计方案
本方案要求结构体数组、读写文件。
还能把信息直接输入存储到文件中,读取文件中信息,从而得到结果。
(1)菜单设计
分为主函数菜单、比赛成绩输出菜单、查询分数统计结果菜单、查询方式子菜单.
(2) 数据保存方式
建立文件,数据保存在文件中。
运动运分数统计程序
(3)数据类型
采用结构体类型.
(4)存储结构
采用结构体类型数组存储结构存储。
(5)算法设计
输入比赛结果模块中运用了冒泡算法将输入的数据排序。
3.2数据结构定义
建立结构体如下:
typedefstruct
{
intitemnum;//项目编号
inttop;//取名次的数目
intrange[5];//名次
intmark[5]; //分数
}itemnode;//定义项目结点的类型
typedefstruct
{
ﻩintschoolnum; //学校编号
intscore;//学校总分
int mscore;//男团体总分
intwscore; //女团体总分
itemnode c[m+w]; //项目数组
}headnode;//定义头结点类型
3。
3功能模块设计
根据分析整个系统主要划分为4个功能模块,分别执行要求中的功能。
该系统分为比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果。
比赛成绩输出模块有四个子模块,分别是:
按学校编号输出模块、按学校总分输出模块、安南员总分输出模块和按女团总分输出模块;查询比赛成绩模块分为按学校编号查询模块和按项目编号查询两个子模块。
(1)比赛成绩输入模块
比赛成绩输入模块分为:
创建信息部分,该部分需输入学校编号,项目编号,取得的名次,以及哪些名次;算法部分,得到排序结果。
此模块定义变量i,j,k, s ;先初始化储存分数的数组各元素,for循环实现各学校信息的输入,包括学校编号、项目编号、取前3名or前5名、获得几个名次,使用switch语句实现对输入的各个名次赋予对应的分数。
(2)比赛成绩输出模块
实现按要求输出相应的数据。
有以下输出选项:
按学校编号输出、按学校总分输出、按男团总分输出、按女团总分输出。
模块定义了intchoice,i,j,k;intremember[n];intsign变量,do…while包括switch语句,选择输出按学校编号输出、按学校总分输出、按男团总分输出、按女团总分输出相应的数据.for循环实现输出各个方式输出的每个数据.
(3)查询比赛成绩模块
查询比赛成绩模块包括:
按学校编号查询,按项目编号查询.
此模块定义了intchoice;inti,j,k,s;switch(choice)实现查询的两种方式的选择,当i〉n时输出错误:
这个学校没有参加此次运动会!
否则,输入项目编号,如果j〉m+w||j==0,输出此次运动会没有这个项目。
否则,使用for循环输出相关数据,从而实现查询功能.
功能模块图如图1所示。
图1功能模块图
4、系统的实现与调试
4。
1系统实现
建立数据库、应用系统的编码开发、系统的运行。
1:
主菜单界面,首先运行文件运动会统计分数。
2:
输入信息:
程序首先赋初值,定义学校的个数为2,男生项目为1,女生项目为1。
3:
查询信息(例如按编号查询)
4。
2调试
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在.本系统调试过程中遇到的主要问题、原因和解决方法如下面介绍。
调试过程中出现的问题和处理方式:
(1)程序出现语法错误
发现是输入名次信息的地方忘带地址符&。
添加取地址符.
printf(”*****名次:
”);
scanf(”%d",&h[i]。
c[j].range[s]);
(2)在输出模块不能将全部的学校信息输出,属于算法编写错误,正确的程序应该为:
if(h[remember[i]]。
mscore〈h[j].mscore)
ﻩﻩk=remember[i];
remember[i]=remember[j];
remember[j]=k;
(3)在调用文件时出现问题,后来一步步调试,最终可以运行。
5、小结
5。
1系统的功能
1.比赛成绩输入模块
比赛成绩输入模块分为:
创建信息部分,该部分需输入学校编号,项目编号,取得的名次,以及哪些名次;算法部分,得到排序结果。
2.比赛成绩输出模块
将以输入的数据按照输出比赛菜单的选择输出相应的数据。
3.查询比赛成绩模块
按照查询比赛结果菜单和其查询方式子菜单查询需要的数据。
4.调用统计结果
将输入的各学校运动会成绩排序输出.
5。
2系统及开发过程的特点
输出形式:
有中文提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
5。
3存在的问题与改进方向
功能上有对分数信息的输入、输出、查询、调用等简单的功能。
缺点是:
输入大量的信息时比较麻烦,但由于对知识掌握不熟练,所以做的不是很好,下次努力改进;在输入信息的时候都是按数字输入,没能实现用学校和运动员的名字输入,这点做的不是很好,下次改进;指针的概念复杂,使用较灵活,但容易出错;对文件的使用掌握不熟练,编写时比较困难,在打开文件时出现问题虽然不影响运行结果但不知如何解决.
5。
4 自我体会
1.自从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
今后我必需扎实基础理论、认真思考,一步一个脚印的走下去,才可以达到我们预期的彼岸!
⒉一个复杂的程序需要函数调用、结构体、数组、指针、文件等的综合运用,各个部分间紧密联系.同时,他们的使用使程序更加灵活、简洁、方便.单纯掌握课本上的知识是不够的,还需课外的阅读.
⒊只靠个人的努力是不够的,小组成员之间的合作、明确的分工可使工作完成得更快。
附录1:
程序源代码
#include<stdio.h>
#include〈math.h〉
#include〈conio。
h>
#include〈process。
h>
#definen3//学校数目
#definem2 //男子项目数目
#definew 2 //女子项目数目
#define null0
typedefstruct
{
intitemnum; //项目编号
inttop; //取名次的数目
int range[5]; //名次
intmark[5]; //分数
}itemnode; //定义项目结点的类型
typedefstruct
{
ﻩint schoolnum;//学校编号
int score; //学校总分
intmscore; //男团体总分
int wscore; //女团体总分
itemnodec[m+w]; //项目数组
}headnode; //定义头结点类型
headnodeh[n]; //定义一个头结点数组
voidinputinformation()//输入信息,建立系统
{
inti,j,k,s;
for(i=0;i〈n;i++)
{
ﻩh[i].score=0;
h[i].mscore=0;
h[i]。
wscore=0;
ﻩ} //初始化头结点
for(i=0;i<n;i++)
{
printf("*****学校编号:
");
scanf(”%d”,&h[i]。
schoolnum); //输入头结点信息
for(j=0;j〈m+w;j++)
ﻩ{
ﻩﻩprintf(”*****项目编号:
");
scanf(”%d",&h[i].c[j]。
itemnum);
ﻩprintf(”*****取前3名or前5名:
");
scanf("%d”,&h[i]。
c[j].top);
printf(”*****获得几个名次:
”);
scanf("%d",&k); //输入项目信息
for(s=0;s<5;s++)
h[i]。
c[j]。
range[s]=0,h[i]。
c[j]。
mark[s]=0;//初始化排名和分数
for(s=0;sﻩ{
ﻩprintf("*****名次:
”);
scanf("%d”,&h[i].c[j]。
range[s]); //输入所获名次信息
if(h[i].c[j].top==3)
switch(h[i]。
c[j]。
range[s])
{
case0:
h[i]。
c[j].mark[s]=0;break;
case1:
h[i]。
c[j].mark[s]=5;break;
case2:
h[i].c[j].mark[s]=3;break;
case3:
h[i]。
c[j]。
mark[s]=2;break;
}
else
switch(h[i].c[j].range[s])
ﻩﻩ{
case 0:
h[i].c[j]。
mark[s]=0;break;
case 1:
h[i]。
c[j].mark[s]=7;break;
case2:
h[i].c[j]。
mark[s]=5;break;
case3:
h[i].c[j]。
mark[s]=3;break;
case4:
h[i]。
c[j].mark[s]=2;break;
case5:
h[i].c[j].mark[s]=1;break;
}
h[i].score=h[i].score+h[i].c[j]。
mark[s];
//按取前三名还是取前五名分别记分
if(j〈=m—1)
ﻩﻩh[i].mscore=h[i].mscore+h[i].c[j].mark[s];
//是男子项目则记到男子分数里面去
else
ﻩﻩ h[i].wscore=h[i].wscore+h[i]。
c[j].mark[s];
//是女子项目则记到女子项目里面去
ﻩﻩ}
ﻩ printf(”\n”);
}
}
}
voidoutput() //输出函数
{
ﻩintchoice,i,j,k;
ﻩint remember[n];
int sign;
do
{
printf(”*******************1。
按学校编号输出.*******************\n”);
printf("*******************2。
按学校总分输出。
*******************\n”);
printf("*******************3.按男团总分输出。
*******************\n");
printf(”*******************4。
按女团总分输出.*******************\n");
ﻩ printf("\n\n*******************请选择编号*************************\n\n:
");
scanf(”%d",&choice);
switch(choice)
{
ﻩﻩcase1:
ﻩﻩﻩfor(i=0;i〈n;i++)
ﻩ {
ﻩﻩﻩprintf("\n\n*****学校编号:
%d\n",h[i].schoolnum);
printf(”*****学校总分:
%d\n",h[i].score);
ﻩ printf("*****男团总分:
%d\n",h[i]。
mscore);
ﻩﻩﻩprintf("*****女团总分:
%d\n\n\n”,h[i]。
wscore);
ﻩ} //按编号顺序输出
ﻩ break;
case2:
for(i=0;i〈n;i++)
ﻩﻩﻩremember[i]=i;
for(i=0;i {
ﻩﻩfor(j=i+1;j<n;j++)
ﻩﻩﻩﻩif(h[remember[i]]。
scorescore)
k=remember[i];
ﻩﻩremember[i]=remember[j];
ﻩﻩremember[j]=k;
} //用冒泡排序方法,用辅助数组记住头结点下标
for(i=0;i<n;i++)
{
ﻩﻩﻩprintf("\n\n*****学校编号:
%d\n",h[remember[i]].schoolnum);
printf(”*****学校总分:
%d\n",h[remember[i]]。
score);
ﻩﻩprintf("*****男团总分:
%d\n",h[remember[i]].mscore);
ﻩﻩﻩ printf(”*****女团总分:
%d\n\n\n",h[remember[i]]。
wscore);
//按所记下标顺序输出
} //按学校总分输出
break;
case3:
ﻩﻩfor(i=0;i〈n;i++)
remember[i]=i;
for(i=0;i〈n;i++)
{
for(j=i+1;j〈n;j++)
ﻩﻩﻩﻩif(h[remember[i]]。
mscoreﻩﻩﻩk=remember[i];
ﻩﻩﻩremember[i]=remember[j];
ﻩﻩﻩremember[j]=k;
}
for(i=0;i〈n;i++)
{
ﻩﻩﻩprintf("\n\n*****学校编号:
%d\n",h[remember[i]]。
schoolnum);
printf(”*****学校总分:
%d\n",h[remember[i]]。
score);
ﻩﻩﻩprintf("*****男团总分:
%d\n",h[remember[i]]。
mscore);
ﻩﻩprintf(”*****女团总分:
%d\n\n\n”,h[remember[i]]。
wscore);
} //按男团总分输出
break;
case 4:
for(i=0;i〈n;i++)
ﻩ remember[i]=i;
for(i=0;i {
ﻩ for(j=i+1;j<n;j++)
ﻩ if(h[remember[i]]。
wscore〈h[j]。
wscore)
k=remember[i];
ﻩremember[i]=remember[j];
ﻩﻩﻩremember[j]=k;
}
for(i=0;i {
ﻩﻩprintf(”\n\n*****学校编号:
%d\n",h[remember[i]].schoolnum);
printf("*****学校总分:
%d\n”,h[remember[i]].score);
ﻩﻩﻩ printf(”*****男团总分:
%d\n”,h[remember[i]].mscore);
ﻩ printf(”*****女团总分:
%d\n\n\n",h[remember[i]]。
wscore);
}
break; //按女团总分输出
ﻩ}
ﻩ printf("请选择 2继续,0跳出\n”);
ﻩ scanf(”%d”,&sign);
}while(sign==2); //循环执行输出语句
}
voidinquiry() //查询函数
{
ﻩintchoice;
int i,j,k,s;
ﻩprintf(”\n*****1:
按学校编号查询\n");
ﻩprintf("\n*****2:
按项目编号查询\n");
ﻩprintf(”\n\n*****请选择查询方式:
”); //提供两种查询方式
scanf("%d",&choice);
switch(choice)
{
case 1:
do
{
ﻩprintf("要查询的学校编号:
”);
ﻩﻩﻩscanf(”%d",&i);
ﻩif(i〉n)
ﻩﻩprintf(”错误:
这个学校没有参加此次运动会!
\n\n\n");
else
ﻩ{
ﻩﻩﻩprintf(”要查询的项目编号:
”);
scanf(”%d”,&j);
ﻩif(j〉m+w||j==0)
ﻩﻩprintf("此次运动会没有这个项目\n\n\n");
//学校编号超出范围,则输出警告
ﻩﻩelse
ﻩﻩ{
ﻩﻩﻩﻩprintf(”这个项目取前%d名,该学校的成绩如下:
\n”,h[0].c[j—1].top);
ﻩfor(k=0;k〈5;k++)
ﻩ if(h[i-1]。
c[j—1].range[k]!
=0)
ﻩ printf("名次:
%d\n”,h[i-1]。
c[j-1]。
range[k]);
//输出要查询学校项目的成绩
ﻩﻩﻩ}
ﻩﻩ}
printf(”请选择 2 继续 ,0 跳出\n”);
ﻩﻩscanf(”%d”,&s);
printf(”\n\n\n”);
ﻩ}while(s==2); //循环执行输出语句
break;
ﻩcase2:
do
ﻩﻩ{
ﻩprintf(”要查询的项目编号:
”);
scanf("%d”,&s);
ﻩﻩﻩif(s〉m+w||s==0)
ﻩﻩprintf("此次运动会不包括这个项目.\n\n\n”); //项目编号超出范围则输出警告
ﻩelse
ﻩ{
ﻩﻩprintf(”该项目取前%d名,取得名次的学校\n",h[0].c[s-1]。
top);
ﻩﻩﻩﻩfor(i=0;i<n;i++)
ﻩﻩfor(j=0;j〈5;j++)
if(h[i]。
c[s—1]。
range[j]!
=0)
ﻩﻩﻩ printf(”学校编号:
%d,名次:
%d\n”,h[i]。
schoolnum,h[i].c[s-1]。
range[j]);
} //输出该项目取得名次学校的成绩
ﻩ printf(”\n\n\n继续 2,跳出 0\n");
scanf("%d”,&i);
ﻩprintf(”\n\n\n");
ﻩ}while(i==2);
break;
ﻩ}
}
voidwritedata()