运动会分数统计讲解Word文档格式.docx
《运动会分数统计讲解Word文档格式.docx》由会员分享,可在线阅读,更多相关《运动会分数统计讲解Word文档格式.docx(32页珍藏版)》请在冰点文库上搜索。
5)有完善的出错处理机制,最终的运动会分数统一为整数提高要求:
1)有图形界面、功能菜单
2)能够将所有积分信息保存为文件
二、概要设计
1.本系统的流程图如下:
(流程图较大,在下页显示)
2.本系统采用的存储结构为结构化设计理念,这是数据库的最基本的设计要求,主要包括三个数据表:
(1)项目数据表:
运动会开始前必须详细制定本次运动会所需的参赛项目为接下来报名、场地的准备提供依据。
本数据表根据要求设计存储每个项目的编号、取得前几名名次的数目、要取的名次以及各个名次对应的分数。
在初始输入时仅输入项目编号、名称及要取的名次,而各名次对应的分数将由系统自动统计。
这也有利于以后项目情况的查询。
typedefstruct
{
intitemnum;
//项目编号
inttop;
//取名次的数目
intrange[5];
//名次
intmark[5];
//分数
}itemnode;
//定义项目结点的类型
(2)学校数据表:
本数据表储存了各个参赛学校的总体情况,包括学校的编号、男子团体总分、女子团体总分和学校总分。
其中学校编号是提前输入的,而其他三项内容将由系统进行自动统计。
intschoolnum;
//学校编号
intscore;
//学校总分
intmscore;
//男团体总分
intwscore;
//女团体总分
itemnodec[m+w];
//项目数组
}headnode;
//定义头结点类型
这两个数据表之间由项目编号和学校编号进行相关联接,形成一个整体。
三、详细设计
源程序代码:
#include<
stdio.h>
iostream.h>
#include<
conio.h>
process.h>
#definen4//学校数目
#definem2//男子项目数目
#definew2//女子项目数目
#definenull0
{
intitemnum;
intrange[5];
intmark[5];
}itemnode;
intschoolnum;
intscore;
intmscore;
intwscore;
itemnodec[m+w];
//定义头结点类型
headnodeh[n];
//定义一个头结点数组
voidinput()//输入信息,建立系统
inti,j,k,s;
//*********初始化头结点*********
for(i=0;
i<
n;
i++)
{
h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
}
//*********输入头结点信息*********
cout<
<
"
*****学校编号:
;
cin>
>
h[i].schoolnum;
//**********输入项目信息*********
for(j=0;
j<
m+w;
j++)
{
cout<
*****项目编号:
h[i].c[j].itemnum;
*****取前3名or前5名:
h[i].c[j].top;
cout<
*****获得几个名次:
k;
for(s=0;
s<
5;
s++)
h[i].c[j].range[s]=0,h[i].c[j].mark[s]=0;
{
cout<
*****名次:
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;
case2:
h[i].c[j].mark[s]=3;
case3:
h[i].c[j].mark[s]=2;
}
else
{
h[i].c[j].mark[s]=7;
case4:
case5:
h[i].c[j].mark[s]=1;
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];
//是男子项目则记到男子分数里面去
h[i].wscore=h[i].wscore+h[i].c[j].mark[s];
//是女子项目则记到女子项目里面去
}
endl;
}
//******************输出函数*****************************
voidoutput()
intchoice,i,j,k;
intsign;
do
***************1.按学校编号输出***************"
***************2.按学校总分输出****************"
***************3.按男团总分输出****************"
***************4.按女团总分输出****************"
**********************请选择编号:
choice;
switch(choice)
case1:
//****按编号顺序输出
for(i=0;
h[i].schoolnum<
*****学校总分:
h[i].score<
*****男团总分:
h[i].mscore<
*****女团总分:
h[i].wscore<
break;
//****按学校总分输出
for(j=i+1;
if(h[i].score<
h[j].score)
k=i;
i=j;
j=k;
//*****按男团总分输出
if(h[i].mscore<
h[j].mscore)
//*****按女团总分输出
for(j=i+1;
if(h[i].wscore<
h[j].wscore)
k=i;
}
请选择2--继续,0--跳出"
sign;
}while(sign==2);
//******************查询函数:
提供两种查询方式******************
voidinquiry()
intchoice;
*****1:
按学校编号查询"
*****2:
按项目编号查询"
*****请选择查询方式:
要查询的学校编号:
cin>
i;
if(i>
n)
错误:
这个学校没有参加此次运动会!
else
{
要查询的项目编号:
j;
if(j>
m+w||j==0)
此次运动会没有这个项目"
else
{
这个项目取前"
h[0].c[j-1].top<
名,该学校的成绩如下:
for(k=0;
k<
k++)
if(h[i-1].c[j-1].range[k]!
=0)
名次:
h[i-1].c[j-1].range[k]<
}
请选择2--继续,0--跳出"
s;
}while(s==2);
if(s>
m+w||s==0)
此次运动会不包括这个项目."
该项目取前"
h[0].c[s-1].top<
名,取得名次的学校"
for(i=0;
i<
for(j=0;
if(h[i].c[s-1].range[j]!
学校编号:
h[i].c[s-1].range[j]<
2--继续,0--跳出"
}while(i==2);
//**************把数据存储在文件中**************
voidwritedata()
FILE*report;
inti;
if((report=fopen("
sportsdata.txt"
"
w"
))==null)
不能打开文件!
exit
(1);
fwrite(&
h[i],sizeof(headnode),1,report);
fclose(report);
}
//*****************读出文件中数据的函数***********
voidreaddata()
r"
//**按照读一个数据就输出一个数据的方式显示数据内容**
******学校编号:
fread(&
k,sizeof(int),1,report);
******学校总分:
******男团总分:
******女团总分:
getch();
******项目编号:
******所取名次数量:
fread(&
if(k!
******名次:
for(s=0;
=0)
cout<
******分数:
//****************主函数*******************
voidmain()
=============欢迎使用运动会分数统计系统==========="
-----BY:
09002829"
*****************1.输入信息*********************"
*****************2.输出信息********************"
*****************3.查询信息*********************"
*****************4.调用信息*********************"
*****************5.退出系统*********************"
======================================================"
********请选择要实现步骤的编号:
input();
writedata();
readdata();
main();
output();
inquiry();
exit(0);
default:
四、测试数据及其结果分析
1进入主界面选择信息录入
2.设定4个学校编号为1、2、3、4,男生项目编号为1、2,女生项目为3、4。
依次录入各学校信息
3.录入后系统自动对数据进行处理,得出总分。
4.信息录入完毕,自动保存到TXT文档
5.选择返回主界面
6.按照学校编号排序输出
7.按照学校总分排序输出
8.按照男团总分排序输出
9按照女团总分排序输出
10.学校编号查询
11.无学校编号情况下报错提示
12.项目查询
13项目查询无此项目报错提示
14.调用之前保存文档中的信息
15.无文本文档,提示调用出错
五、课程设计总结
(1).调试中所遇到的较重要问题的回顾:
1)提出问题:
在输出时,调用冒泡排序法时,输出总是报错,无法执行。
分析问题:
在分析的时候检查到,自己调用了一个第三参数当做下标,直接使用下标进行数组的交换。
然后经过检查发现,此下标是多余的,没有必要引入,依靠当前的元素完全可以满足功能需求。
解决问题:
去掉引入的第三方下标。
2)提出问题:
设置选项,供用户输入选择时,当按任意键时都会跳入下一步操作,或者直接退出系统。
分析问题:
在供用户选择时,提供了几个选项,就写几个case语句,但是当用户输入的并不是这几个数字时,系统就不能做出正确判断。
修改case语句,添加default语句提示出错,要求重新输入;
Default:
clrscr();
/*清屏*/
输入错误,请重新选择"
3)提出问题:
当同一项目中有同一学校的两个人时,便不能正确输出或者输出相同人名。
由于同时有两个相同学校编号的人存在,系统在输出时,不能确定那个是正确的,或者用后来的覆盖以前的。
解决问题:
用for函数实现从开始到结尾的遍历。
4)提出问题:
所有输入输出内容只能在一屏内显示,学过c语言,就知道”\n”是换行,”\f”是换屏的,可是在这里就是无法实现。
解决问题:
输入clrscr();
(2).算法的效率及改进设想
时间复杂度的计算:
数据初始录入中学校为O(b),项目为O(c),成绩的录入为O(a),统计函数调入内存函数为O(a+b+c),学校成绩统计为O((a+2)*b),项目统计为O((a+1)*c),按学校编号、按学校总成绩、男团和女团输出函数为O(b^2/2),查询某校某项目函数为O(c*b*5/2),查询某项目的信息为O(5*b*c/2)。
在整个设计过程中本组在存储方面曾存在一定的分歧,后根据大家对以后的操作的分析采用现在的存储结构。
在调用方面本组负责本块的人员先前采用递归的方法而出现了许多错误,经过大家的讨论决定采用现在的do…while语句。
改进设想:
因大部分显示均是以学校为单位,所以将以由有关人的各种信息为集合的结构改为以由有关学校的各种信息为集合的结构。
在这次调试过程中遇到过一些问题,但经过我们不懈努力,解决了大部分。
比如说在运用数据结构排序的时候,方法的选择上,总是想用时间复杂度小的算法,但结果出了问题,最后还是用了我们熟悉的选择排序。
(3).收获与感受
通过此次程序设计,使自己对与信息