运动会分数统计问题课程设计报告数据结构域算法文档格式.docx
《运动会分数统计问题课程设计报告数据结构域算法文档格式.docx》由会员分享,可在线阅读,更多相关《运动会分数统计问题课程设计报告数据结构域算法文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
实现本程序需要解决以下几个问题:
1)如何确定定义的项目的结构体所包含的内容
2)如何确定定义的学校的结构体所包含的内容
3)如何按照项目输入运动会的信息
4)如何按学校编号查询学校某个项目的情况
5)如何按项目编号查询取得前三或前五名的学校
6)如何按学校编号或名称、学校总分、男女团体总分排序输出
解题的关键在于如何定义学校和项目的结构体,让它们包含我们所要存储的信息,从而是数据的存取变得简单。
首先,我将项目和学校包含的内容列了出来,如下:
项目:
项目编号,项目名称,前i名的选手的学校编号,项目名次数;
学校:
学校编号,学校名称,学校总分,男子总分,女子总分
在程序中,我定义了一个intput()函数,利用它来进行数据的存储。
首先,程序将提示用户输入参赛学校的数目,在这里,我使用了一个全局变量n来存储该数据。
紧接着,需要输入每个学校的名称。
接着,m和w两个全局变量将保存男子和女子项目数。
然后,用户将要选择项目的名次数5,进而存储不同的数据。
完成了数据的存储,我们就需要进行数据的查询以及排序输出了。
数据的查询分两种,一种是如何按学校编号查询学校某个项目的情况,第二种是如何按项目编号查询取得前三或前五名的学校。
对于第一种情况,由于每个学校的结构体都包含sch[i].num(即编号),只要将要查询的学校的编号输入即可。
函数cxsch()将会根据if(sch[i].num==s)找出该学校所参与项目的成绩并输出。
按照项目查询与此同类。
对于信息的排序输出,我主要使用了冒泡排序算法,将结构体进行比较并交换。
例如如果按照学校总分排序输出时,判断sch[i].score<
sch[j].score是否成立,若成立,则将两个结构体交换(t=sch[i];
sch[i]=sch[j];
sch[j]=t;
);
其中按照学校名称输出时,我忘掉了如何比较两个字符串的大小。
于是我重新复习了一下C语言的相关知识,不同string函数的调用对我启发很大。
3、数据结构的选择和概要设计
首先定义结构体structpro、structschool,将学校和项目的信息,如项目名称、前5名学校的编号、学校名称、学校总分、男子总分、女子总分等信息分别定义进结构体中。
再定义输出函数,分别按学校编号、学校总分、男子总分、女子总分顺序输出。
之后定义菜单函数,选择序号执行需要的操作,从而查询各项信息。
流程图如下:
开始
输入信息
统计分数
根据菜单实
现选择操作
输出信息
排序
主函数
具体操作
图1总体框架
主要函数:
voidinput() 输入学校数目、学校名称、男子项目数和女子项目数、项目的名称以及每个项目前5名的学校编号
输入学校数目
输入数据有误,
请重新输入
n>
=1&
&
n<
=20
输入第i个学校的名称
输入男子项目数和女子项目数
m<
=20&
m>
w<
w>
=1)
i=1;
i<
=m+w;
i++
输入第i个项目的名称
输入第i个项目的前5
名的学校编号
开始
结束
图2 输入参赛学校信息
voidsolve() 定义菜单函数,根据菜单提示,可以完成相关的功能要求流程图:
Z=1
Z=2
按学校编号顺序输出
Z=3
按学校总分顺序输出
Z=4
按男子总分顺序输出
按女子总分顺序输出
Z=5
Z=6
输入学校编号,
查询学校信息
Z=7
输入项目编号,
查询项目信息
退出
图3主菜单函数
4、算法思想
运动会分数统计该系统相对有点复杂,主要是由于参赛学校和比赛项目不具体可能会很多,其中定义的这两个结构体时里面包括的内容较多。
该程序要求的子函数的功能较多,如可以根据学校编号查询信息、根据项目编号查询信息等等,因此设计算法时可分为以下几步:
(1)定义两个结构体:
参赛学校school和比赛项目pro,在结构体中定义各种所需的信息。
(2)定义需要实现功能的各种子函数:
输入信息函数input(),输入函数printf(),按照学校编号排序函数bianhao(),按照男团体总分排序函数malezf(),按照女团体总分排序函数femalezf(),按照项目编号查询的函数cxxm()。
(3)利用主函数来分别调用这些子函数。
就可以实现各种所需功能。
5、详细设计和主要编码段
5.1数据类型及重要变量的定义
(1)定义运动项目数据类型,用于存放运动项目,包括项目编号、项目所取名次数、名次、分数。
定义项目结点的类型:
structpro//表示项目的结构体
{
stringname;
//项目名称
intsnum[6];
//前5名学校的编号intnum;
//项目编号
}p[21];
(2)定义学校数据类型,用来存储参赛学校信息,包括学校编号、学校总分、男团总分、女团总分、项目数组。
定义学校结点类型:
structschool//表示学校的结构体
intnum;
//学校编号stringname;
//学校名称intscore;
//学校总分intmale;
//男子总分intfemale;
//女子总分
}sch[21];
5.2函数的设计和实现
在概要设计中已经对该系统涉及的抽象数据类型和函数及其功能做了说明,这里就不在对每个函数进行一一说明,只对其中比较重要的功能模块进行描述。
(1)信息输入及分数统计功能
input()函数为输入各个参赛学校的信息,包括学校的名称、学校的编号、在输入信息的同时进行分数的统计。
可以输入各个学校各项目前五名的成绩。
在输入学校的参赛项目时同时把该项目所对应的前五名和学校编号。
前五名的成绩赋为7,5、3、2、1,未取得成绩则赋为0。
并统计团体总分,男团总分和女团总分。
其主要功能代码如下:
for(i=1;
=n;
i++)
{printf("
请输入第%d个学校的编号和名称:
"
i);
//输入学校的编号和名称
cin>
>
sch[i].num;
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<
=1)y=1;
if(y)break;
elseprintf("
输入数据有误,请重新输入:
for(i=1;
请输入第%d个项目的编号和名称:
\n"
p[i].num;
p[i].name;
rintf("
请输入第%d个项目的前5名的学校编号:
//输入前五名学校的编号for(j=1;
j<
=5;
j++)
{y=0;
%d"
x);
if(x>
x<
=20)y=1;
p[i].snum[j]=x;
sch[x].score+=integral[j-1];
if(i<
=m)sch[x].male+=integral[j-1];
else sch[x].female+=integral[j-1];
(2)菜单子函数
bianhao()函数主要功能是将参赛学校获得前五名的学校按照编号输出。
其主要程序如下:
n;
for(j=i;
j++)if(sch[i].num>
sch[j].num)
{t=sch[i];
}
\n按编号排列:
编号学校名称 总分 男子总分 女子总分\n"
print(i);
(3)主菜单函数
Void solve()函数是主菜单函数,设置参数z,当z=不同的数值时会选择不同的子菜单,在运行每个子函数之前都要运行主菜单函数,这样就可以知道选择不同的z值就可以对应不同的子函数,其主要功能代码如下:
intz;
while
(1)
\n *************************************\n"
printf("
* 选择您需要的操作(选择序号):
*\n"
* 1.按学校编号排序输出 *\n"
* 2.按学校总分排序输出 *\n"
* 3.按学校男总分排序输出 *\n"
* 4.按学校女总分排序输出 *\n"
* 5.查询某个学校成绩 *\n"
* 6.查询某个项目成绩 *\n"
* 7.结束 *\n"
*************************************\n"
选择您需要的操作(选择序号):
"
scanf("
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;
}}
6、上机调试情况记录
(1)运行程序输入各种系统信息:
输入参赛学校的编号和名称如下图4:
图4测试输入参赛学校输入项目编号和名称以及前五名学校的编号如下图5:
图5输入比赛项目和前五名学校的编号
(2)主菜单跳出,可根据主菜单的提示选择要进行的操作如下图6:
图6主菜单函数
(3)根据需求进行子函数的操作:
选择菜单按学校编号排序输出如下图7:
图7按学校编号排序输出选择菜单3按学校男子总分排序输出如下图8:
图8按学校男子总分排序输出
选择菜单5查询某个学校的成绩如下图9:
图9 查询某个学校的成绩选择菜单6查询某个项目的情况如下图10:
图10查询某个项目的情况
(4)选择菜单7退出系统如下图11:
图11退出系统
7、测试用例、结果及其算法性能分析
测试用例如上。
开始输入数据时要判断输入的数据是否在范围内,若不在范围内则有输出提示。
输入正确则就按照接下来的提示继续执行。
算法性能分析:
该程序的排序函数使用冒泡排序,都含有两个for循环,故其时间复杂度为O(n2)。
8、用户使用说明
本系统使用的是MicrosoftVisualC++6.0。
VisualC++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境。
VisualC++6.0提供的控制台应用程序对学习和掌握标准C++内容非常有利。
在运行该程序后根据显示的提示进行操作,开始时请输入所有参赛学校的数目然后输入学校的编号和名称。
在输入了参赛的学校后就要输入比赛的项目数量和名称,在输入项目编号和名称后就紧接着输入该项目的前五名学校的编号。
等到所有的信息都已经输入进去后系统会跳出一个主菜单,用户就可以根据主菜单上的提示进行所需要的操作,根据你所输入的系统则会生成用户所需要的信息。
当你输入的数据是错误的,系统会提醒:
“输入错误”。
9、参考文献
[1]王昆仑,李红.数据结构与算法.北京:
中国铁道出版社,2006年5月。
[2]潘彦.算法设计与分析基础[M].北京:
清华大学出版社,2007.1
[3]肖梦强、曲秀清.软件工程——原理、方法与应用[M].中国水利水电出版社,2005.10
[4]吕凤翥.C++语言程序设计(第2版).电子工业出版社,2007.2
[5]严蔚敏、吴伟民.数据结构(C语言版)[M].清华大学出版社,2002.9
10、附录
#include<
iostream>
#include<
string>
iomanip>
fstream>
usingnamespacestd;
intn;
//n个学校
intm;
//m个男子项目intw;
//w个女子项目
}p[21];
intintegral[7]={7,5,3,2,1};
//前5名得分voidinput()//输入学校
inti,j,y,x;
请输入参赛学校数目:
y=0;
n);
if(n>
sch[i].score=0;
for(j=1;
elsesch[x].female+=integral[j-1];
}}}
voidprint(inti)
cout<
<
sch[i].num<
setw(10)<
sch[i].name<
setw(8)<
sch[i].score<
setw(9)
sch[i].male<
sch[i].female<
endl;
}voidbianhao()//按学校编号排序
inti,j;
schoolt;
voidzongfen()//按学校总分排序
j++)if(sch[i].score<
sch[j].score)
\n按学校总分排列:
ofstreamfout;
fout.open("
运动会分数统计.txt"
fout<
编号学校名称 总分 男子总分 女子总分"
{fout<
setw(13)<
}fout.close();
voidmalezf()//按学校男总分排序
j++)if(sch[i].male<
sch[j].male)
\n按学校男子总分排列:
编号 学校名称 总分 男子总分 女子总分\n"
voidfemalezf()//按学校女总分排序
j++)if(sch[i].female<
sch[j].female)
\n按学校女子总分排列:
voidcxsch()//查询学校信息
inti,y,s;
请输入需要查询的学校编号:
s);
if(s>
s<
=n)y=1;
该学校相关信息如下:
if(sch[i].num==s)
break;
}}cout<
voidcxxm()//查询项目信息
输入需要查询的项目编号:
=m+w)y=1;
p[s].name<
前5名学校编号及名称为:
名次编号学校名称\n"
"
p[s].snum[i]<
setw(12)<
sch[p[s].snum[i]].name<
cout<
voidsolve()//菜单函数
选择您需要的操作(选择序号):
if(z==1)bianhao();
if(z==7)break;
}}intmain()//主函数
input();
solve();
return0;