运动会分数统计设计报告.docx
《运动会分数统计设计报告.docx》由会员分享,可在线阅读,更多相关《运动会分数统计设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
运动会分数统计设计报告
《数据结构》课程实验
实验报告
实验二运动会分数统计
专业:
计算机科学与技术
班级:
姓名:
学号:
完成日期:
目录
一、题目描述3
二、需求分析3
三、概要设计4
四、详细设计8
五、调试分析12
六、总结16
一、题目描述
参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1~m,女子m+1~m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2。
写一个统计程序产生的各种成绩和得分报表。
基本要求:
产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。
实验提示:
可以假设n<=20,m<=30,w<=20,姓名长度不超过20个字符,每个项目结束时,将其编号、类型符(区分取前3名还是前5名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。
二、需求分析
1.在该程序中,参赛学校编号为1~n(n<=20)。
比赛分成m(m<=30)个男子项目和w(w<=20)个女子项目,分别编号为1~m和m+1~m+w,姓名长度不超过20个字符;
2.输入各个项目信息的详细信息,包括项目号,姓名,性别,学校和名次。
3.对于项目编号为奇数的取前五名,得分顺序为7,5,3,2,1;为偶数的取前三名,得分顺序为5,3,2。
4.程序执行的命令包括:
可以输入各个项目的前三名或前五名的成绩;
能统计各学校总分;
可以按学校编号、学校总分、男女团体总分排序输出;
可以按学校编号查询学校某个项目的情况;
可以按项目编号查询取得前三或前五名的学校。
三、概要设计
本程序中学校的存储结构为链表:
其中
school类为:
classschool:
publicathlete/*学校*/
{
……
public:
intcount;/*学校获奖数*/
intserial;/*学校编号*/
intmenscore;/*男选手总分*/
intwomenscore;/*女选手总分*/
inttotalscore;/*总分*/
athleteath[MaxSize];/*获奖运动员信息数组,包括分数,名次,项目*/
school*prev;//前指针
school*next;//后指针
};
其中部分主要的函数:
添加操作add(school*&head)
查询操作checkFunc(school*head,int&n)
文件保存save(school*head)
总分快速排序tquicksort(vector&v,intfirst,intlast)
总分基数排序tbaseSort(vector&v,intd)
2.关键算法
{……
添加项目号
for(i=1;i<=n;i++)
{输入第i名运动员的学校编号temp
……
while(first!
=head)//遍历链表,直到找到编号为serial的学校所在结点,或first指向表头head
{if(first->serial==要添加的编号)
{
(first->ath[first->count]).item=要添加的项目号;
(first->ath[first->count]).range=i(名次)
First指向的学校的项目加一;
更新总分
break;}
first=first->next;
……}
流程图:
3.查询操作:
while(first!
=head)
{……
if(输入的项目编号==学校第i位运动员的项目)
{
把第i位运动员的项目,学校编号、名次、得分信息压入向量;
}……
}
first=first->next;
……
输出向量中的内容
1.所有学校总分统计表
2.学校成绩查询
3.项目情况查询
4.返回主菜单
1.按学校编号统计
2.按学校名次统计
3.按男团总分统计
4.按女团总分统计
5.返回查询菜单
6.返回主菜单
//按学校编号顺序输出所有参赛学校运动会成绩
voidserialSort(vector&v)
{
for(inti=0;i{
cout<<*v[i];
}
}
四、详细设计
输出形式:
有中文提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
主函数代码:
intmain()//规定男生项目前三名分别积分、、,女生项目前五名分别积分、、、、
//规定没有名次则积分为,不考虑并列的情况
//请正确输入各学校对应项目的积分
{
intn,m,w,i,j;
schoola[20];
intsummscore[20],sumwscore[20],sumscore[20];//定义存储各个学校男团、女团、总分
RedTyped[20];//定义排序所需的数组为RedType型
SqListL,Lm,Lw;//定义存放各个学校总分、男团、女团积分的顺序线性表
ListLr;//定义积分排序所需的顺序线性表
InitList(L);//初始化各线性表
InitList(Lm);
InitList(Lw);
cout<<"请输入参加运动会的学校数目(<20):
"<cin>>n;
while(n<5||n>20)
{
cout<<"输入学校数目有误,请重新输入!
"<cout<<"请输入参加运动会的学校数目(<20):
"<cin>>n;
}
cout<<"请分别输入男生、女生的项目数目(<20):
"<cin>>m>>w;
cout<<"规定男生项目前三名分别积分、、"<cout<<"女生项目前五名分别积分、、、、"<cout<<"没有名次则积分为,且本程序不涉及并列排名的情况!
"<cout<<"请正确输入各学校对应项目的积分!
\n"<for(i=1;i<=n;i++)
{
a[i-1].schnum=i;//赋给学校对应的编号
printf("请输入学校%d男生各个项目的成绩:
\n",i);
for(j=1;j<=m;j++)//分别输入对应学校的各个男生项目的积分情况
cin>>a[i-1].mscore[j-1];
printf("请输入学校%d女生各个项目的成绩:
\n",i);
for(j=1;j<=w;j++)//分别输入对应学校的各个女生项目的积分情况
cin>>a[i-1].wscore[j-1];
}
for(i=0;i{
summscore[i]=a[i].mscore[0];
for(j=1;jsummscore[i]+=a[i].mscore[j];//求出学校男团总分并存储到数组中对应位置
ListInsert(Lm,i+1,summscore[i]);//将学校男团总分插入存放在线性表对应位置
sumwscore[i]=a[i].wscore[0];
for(j=1;jsumwscore[i]+=a[i].wscore[j];//求出学校女团总分并存储到数组中对应位置
ListInsert(Lw,i+1,sumwscore[i]);//将学校女团总分插入存放在线性表对应位置
sumscore[i]=summscore[i]+sumwscore[i];//求出学校总分并存储到数组中对应位置
ListInsert(L,i+1,sumscore[i]);//将学校总分插入存放在线性表对应位置
}
intflag=1;
charch;
while(flag)//当flag为真时执行循环
{printf("请选择:
\n");
printf("1.查看各学校总分统计,并按学校编号排序输出查看\n");
printf("2按学校总分排序输出查看\n");
printf("3.按男团总分排序输出查看\n");
printf("4.按女团总分排序输出查看\n");
printf("5.按学校编号查询学校某个项目的情况\n");
printf("6.按项目编号查询取得前三或前五名的学校\n");
printf("7.退出程序\n");
cin>>ch;
switch(ch)
{
case'1':
//查看各学校总分统计,并按学校编号排序输出查看
for(i=0;i{
printf("学校编号:
%d学校总分:
%d\n",i+1,L.elem[i]);
}
break;
case'2':
//按学校总分排序输出查看
Lr.length=n;
for(i=0;i{
d[i].key=L.elem[i];
d[i].otherinfo=i+1;
Lr.r[i+1]=d[i];
}
InsertSort(Lr);
cout<<"按学校总分排序后以(名次,学校编号,学校总分)形式输出为:
"<print(Lr);
break;
case'3':
//按男团总分排序输出查看
Lr.length=n;
for(i=0;i{
d[i].key=Lm.elem[i];
d[i].otherinfo=i+1;
Lr.r[i+1]=d[i];
}
InsertSort(Lr);
cout<<"按男团总分排序后以(名次,学校编号,男团总分)形式输出为:
"<print(Lr);
break;
case'4':
//按女团总分排序输出查看
Lr.length=n;
for(i=0;i{
d[i].key=Lw.elem[i];
d[i].otherinfo=i+1;
Lr.r[i+1]=d[i];
}
InsertSort(Lr);
cout<<"按女团总分排序后以(名次,学校编号,女团总分)形式输出为:
"<print(Lr);
break;
case'5':
//按学校编号查询学校某个项目的情况
ints,t;
cout<<"请输入要查询的学校编号:
"<cin>>s;
while(s<1||s>n)//输入学校编号不在初始定义范围之内
{
cerr<<"输入学校编号有误,请重新正确输入!
"<cout<<"请输入要查询的学校编号:
"<cin>>s;//重新输入
}
i=0;
while(a[i].schnum!
=s)
++i;//通过循环找到输入编号的对应学校在数组a中的位置
cout<<"请输入要查询的项目序号:
"<cin>>t;
while(t<1||t>m+w)//输入项目序号不在初始定义范围之内
{
cout<<"输入项目序号有误,请重新正确输入!
"<cout<<"请输入要查询的项目序号:
"<cin>>t;//重新输入
}
if(t<=m)//该项目属于男生项目
printf("该学校该项目积分为:
%d\n",a[i].mscore[t-1]);//从学校男生项目积分数组里输出
else//该项目属于女生项目
printf("该学校该项目积分为:
%d\n",a[i].wscore[t-m-1]);//从学校女生项目积分数组里输出
break;
case'6':
//按项目编号查询取得前三或前五名的学校
cout<<"请输入要查询的项目序号:
"<cin>>t;
while(t<1||t>m+w)//输入项目序号不在初始定义范围之内
{
cout<<"输入项目序号有误,请重新正确输入!
"<cout<<"请输入要查询的项目序号:
"<cin>>t;//重新输入
}
if(t<=m)//该项目属于男生项目
{
i=0;
while(a[i].mscore[t-1]!
=5)
++i;//通过循环找到该项目第一名学校在a中的位置
printf("获得该项目第一名的是学校:
%d号\n",i+1);
i=0;
while(a[i].mscore[t-1]!
=3)
++i;//通过循环找到该项目第二名学校在a中的位置
printf("获得该项目第二名的是学校:
%d号\n",i+1);
i=0;
while(a[i].mscore[t-1]!
=2)
++i;//通过循环找到该项目第三名学校在a中的位置
printf("获得该项目第三名的是学校:
%d号\n",i+1);
}
else//该项目属于女生项目
{
i=0;
while(a[i].wscore[t-m-1]!
=7)
++i;//通过循环找到该项目第一名学校在a中的位置
printf("获得该项目第一名的是学校:
%d号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!
=5)
++i;//通过循环找到该项目第二名学校在a中的位置
printf("获得该项目第二名的是学校:
%d号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!
=3)
++i;//通过循环找到该项目第三名学校在a中的位置
printf("获得该项目第三名的是学校:
%d号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!
=2)
++i;//通过循环找到该项目第四名学校在a中的位置
printf("获得该项目第四名的是学校:
%d号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!
=1)
++i;//通过循环找到该项目第五名学校在a中的位置
printf("获得该项目第五名的是学校:
%d号\n",i+1);
}
break;
default:
flag=0;printf("程序结束,按任意键退出!
\n");//退出程序
}
}
getchar();
}
五、调试分析
1.输入数据
2.查看学校总分排序统计,并按学校编号排号输出
3.按学校总分排序输出查看
4.按男团总分排序输出查看
5.按女团总分排序输出查看
6.按学校编号查询学校某个项目的情况
7.按项目编号查询取得前三或前五名的学校
8.退出程序
六、总结
(1).函数调用。
函数调用是语言中一块十分重要部分,它可以把一个程序分成若干部分,然后进行配置,所以这块内容对我们很重要。
(2).对结构体的不熟练。
刚开始对结构体不太了解,使调试程序时费了我不少的时间。
结构体的嵌套使我很费力气,通过长时间的运用,终于可以得心应手。
结构体在我的实习中站了很大的比重,我也很重视它。
通过与线性表,循环等的有机搭配,我完成了实习任务。
(3)在这个实验中,我们提高了C语言编程的能力。
在程序设计过程中,需要经过反复地编写,调试,运行,发现问题并解决问题,在这次实验的设计中,我加深对程序的了解,提高自己的实际动手能力和独立思考的能力同时我也学会了综合以前学到的基本知识来解决较大问题的方法。
课程实验是培养我们的综合能力,从设计总体结构流程、具体算法设计、调试程序等全方面考核。
在一开始写完程序后调试,有许多问题出现。
再一一检查后发现,许多小问题出现:
语句后没有分号、没有大括号、小括号等问题。
还有就是在文件存储调用方面因忘记上学期的知识,总是有问题,特别是在从文件中读取时总有随机数出现;通过看书、与同学讨论才发现是调用的结构与存储的结构不对,经过改正后终于正确输出。