运动会分数统计.docx
《运动会分数统计.docx》由会员分享,可在线阅读,更多相关《运动会分数统计.docx(13页珍藏版)》请在冰豆网上搜索。
![运动会分数统计.docx](https://file1.bdocx.com/fileroot1/2023-1/14/d3752418-bd5f-48da-bc44-3269896ab7fe/d3752418-bd5f-48da-bc44-3269896ab7fe1.gif)
运动会分数统计
滨江学院
《数据结构》课程设计
学号20102308022
学生姓名李兆梅
院系计算机
专业计算机科学与技术
指导老师宣文霞
二O一二年五月二十五日
运动会分数统计
(一)题目的内容及要求
参加运动会有n个学校,学校编号为1~n。
比赛分成m个男子项目和w个女子项目。
项目编号为男子1~m和女子m+1~m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)
【功能要求】
(1)可以输入各个项目的前三名或前五名的成绩;
(2)能统计各学校总分,
(3)可以按学校编号、学校总分、男女团体总分排序输出;
(4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
【规定】
输入数据形式和范围:
20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
【输出形式】
有中文提示,各学校分数为整形
【界面要求】
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
【存储结构】
学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构。
(二)需求分析
本系统主要是运动会分数统计方案设计。
运动会分数统计方案适合采用结构体数组,为了实现系统功能,主要应实现以下几部分:
比赛成绩输入、比赛成绩输出、查询比赛成绩和调用统计结果。
需要输入学校编号,项目编号,取得的名次,以及哪些名次。
(三)概要设计
1、算法的设计思想:
本程序主要是使用顺序表来实现操作。
一个运动会包括运动项目和参加运动会的学校。
因此构造顺序表match,school。
为了操作的方便,设计了一个总目录,选择相应序号进入各个操作,并有错误提示,每完成一个操作程序会提示选择返回目录或退出程序,对于总分的排序使用了冒泡排序。
为了使整个程序界面看起来更加惬意,又添加了背景和字体颜色设置的程序语句。
每个操作前都有操作指南,易于使用。
2、结构体
运动项目
{项目编号;名次;};
学校
{学校编号;项目;团体总分;男团体总分;女团体总分;};
3、主程序(main)
包括登陆欢迎程序,分数录入程序,查询程序,退出程序
4、程序模块机之间的调用关系
(四)详细设计
1、宏定义:
#defineN2
#definebm4
#definegm3
2、数据类型定义
(1)运动项目的定义:
structmatch{intmatchnum;
intrank[3];
}mat[bm+gm];
(2)学校的定义:
structschool{
intschoolnum;
structmatchmat[bm+gm];
inttotal;
intboytotal;
intgirltotal;
}sch[N];
3、文件存储
文件的存储我用到了fprintf函数和fscanf函数进行数据的逐步读入读出
代码如下;
StatusWritedata()
{//存到文件中
FILE*report;
inti,j;
if((report=fopen("sportdata.txt","w"))==null){
fprintf("不能打开文件\n");
exit
(1);}
fprintf(report,"%d\n",n);
fprintf(report,"%d\n",m);
fprintf(report,"%d\n",w);
for(i=0;ifprintf(report,"%d\n",h[i].schoolnum);
fprintf(report,"%s\n",h[i].name);
fprintf(report,"%d\n",h[i].score);
fprintf(report,"%d\n",h[i].mscore);
fprintf(report,"%d\n",h[i].wscore);
for(j=0;jfprintf(report,"%d\n",h[i].c[j].itemnum);
fprintf(report,"%s\n",h[i].c[j].name);
fprintf(report,"%d\n",h[i].c[j].top);
fprintf(report,"%d\n",h[i].c[j].range[j]);}
fprintf(report,"\n\n");}
fclose(report);
returnOK;}
(五)源代码
#include
#include
#include
#include
usingnamespacestd;
intn;//n个学校
intm;//m个男子项目
intw;//w个女子项目
structpro//表示项目的结构体
{
stringname;//项目名称
intsnum[6];//前5名学校的编号
}p[21];
structschool//表示学校的结构体
{
intnum;
stringname;//学校名称
intscore;//学校总分
intmale;//男子总分
intfemale;//女子总分
}sch[21];
intintegral[5]={7,5,3,2,1};//前五名得分
voidinput(){
inti,j,y,x;
printf("请输入学校数目:
");
y=0;
while
(1){
scanf("%d",&n);
if(n>=1&&n<=20)y=1;
if(y)break;
elseprintf("如输入数据有误,请重新输入:
");}
for(i=1;i<=n;i++){
printf("请输入第%d个学校的名称:
",i);把
cin>>sch[i].name;
sch[i].score=0;//学校总分
sch[i].female=0;
sch[i].male=0;
sch[i].num=i;}
printf("请输入男子项目数和女子项目数:
");
y=0;
while
(1){
scanf("%d%d",&m,&w);
if(m<=20&&m>=1&&w<=20&&w>=1)y=1;
if(y)break;
elseprintf("请输入数据有误,请重新输入:
");}
for(i=1;i<=m+w;i++){
printf("请输入第%d个项目的名称:
\n",i);
cin>>p[i].name;
printf("请输入第%d个项目的前5名的学校编号:
\n",i);
for(j=1;j<=5;j++){
y=0;
while
(1){
scanf("%d",&x);
if(x>=1&&x<=20)y=1;
if(y)break;
elseprintf("请输入数据有误,请重新输入:
");}
p[i].snum[j]=x;
sch[x].score+=integral[j-1];
if(i<=m)sch[x].male+=integral[j-1];
elsesch[x].female+=integral[j-1];}
}
}
voidprint(inti){
cout<<}
voidbianhao()//按编号排序
{
inti,j;
schoolt;
for(i=1;ifor(j=i;j<=n;j++)
if(sch[i].num>sch[j].num)
{t=sch[i];sch[i]=sch[j];sch[j]=t;}
}
printf("\n按编号排列:
\n");
printf("编号学校名称总分男子总分女子总分\n");
for(i=1;i<=n;i++)
print(i);}
voidzongfen()//按学校总分排序
{
inti,j;
schoolt;
for(i=1;ifor(j=i;j<=n;j++)
if(sch[i].score{t=sch[i];sch[i]=sch[j];sch[j]=t;}
printf("\n按学校总分排
printf("编号学校名称总分男子总分女子总分\n");
for(i=1;i<=n;i++)
print(i);
ofstreamfout;
fout.open("运动会分数统计.txt");
fout<<"编号学校名称总分男子总分女子总分"<for(i=1;i<=n;i++)
{fout<<fout.close();}
voidmalezf()//按学校男总分排序
{
inti,j;
schoolt;
for(i=1;ifor(j=i;j<=n;j++)
if(sch[i].male{t=sch[i];sch[i]=sch[j];sch[j]=t;}}
printf("\n按学校男子总分排列:
\n");
printf("编号学校名称总分男子总分女子总分\n");
for(i=1;i<=n;i++)
print(i);}
voidfemalezf()//按学校女总分排序
{
inti,j;
schoolt;
for(i=1;ifor(j=i;j<=n;j++)
if(sch[i].female{t=sch[i];sch[i]=sch[j];sch[j]=t;}}
printf("\n按学校女子总分排列:
\n");
printf("编号学校名称总分男子总分女子总分\n");
for(i=1;i<=n;i++)
print(i);
cout<voidcxsch()//查询学校信息{
inti,y,s;
printf("请输入需要查询的学校编号:
");
y=0;
while
(1){
scanf("%d",&s);
if(s>=1&&s<=n)y=1;
if(y)break;
elseprintf("如输入数据有误,请重新输入:
");}
printf("该学校相关信息:
\n");
printf("编号学校名称总分男子总分女子总分\n");
for(i=1;i<=n;i++){
if(sch[i].num==s){
print(i);
break;}
}
cout<voidcxxm()//查询项目信息
{
inti,y,s;
printf("输入需要查询的项目编号:
");
y=0;
while
(1){
scanf("%d",&s);
if(s>=1&&s<=n)y=1;
if(y)break;
elseprintf("输入数据有误,请重新输入:
");}
cout<
"<printf("名次编号学校名称\n");
for(i=1;i<=5;i++)
cout<<""<
cout<voidsolve()//菜单函数
{
intz;
while
(1){
printf("\n选择您需要的操作(选择序号):
\n");
printf("1.按学校编号排序输出\n");
printf("2.按学校总分排序输出\n");
printf("3.按学校男总分排序输出\n");
printf("4.按学校女总分排序输出\n");
printf("5.查询某个学校成绩\n");
printf("6.查询某个项目成绩\n");
printf("7.结束\n\n");
scanf("%d",&z);
if(z==1)bianhao();
if(z==2)zongfen();
if(z==3)malezf();
if(z==4)femalezf();
if(z==5)cxsch();
if(z==6)cxxm();
if(z==7)break;}
}
intmain()//主函数
{input();
solve();
return0;}
(六)运行结果及分析
1、运行结果
(1)录入学校信息
(2)按学校编号输出
(3)按学校总分排名
(4)按男子总分排名
(5)按女子总分排名
(6)输入学校编号查询
(7)输入项目编号查询
2、运行分析
本系统调试过程中遇到的主要问题、原因和解决方法如下面绍。
调试过程中出现的问题和处理方式:
(1)程序出现语法错误
发现是输入名次信息的地方忘带地址符&。
添加取地址符。
rintf("*****名次:
");scanf("%d",&h[i].c[j].range[s]);
(2)在输出模块不能将全部的学校信息输出,属于算法编写错误,正确的程序应该为:
if(h[remember[i]].mscorek=remember[i];remember[i]=remember[j];remember[j]=k;
(七)个人体会与总结
本程序的主要运用了C语言开发。
从这次实践中我们对数据结构的知识更近了一成,能更好的实现利用数据结构来解决实际问题。
更加巩固了我们的专业知识。