资源描述
课程设计报告
运动会分数统计系统
1. 系统需求分析
问题描述:
参加运动会有n个学校,学校编号为1,2,···,n,比赛分为m个
男子项目和w个女子项目。项目编号为男子1,2,···,m个,女子m+1个,m+2个,··,m+w。不同的项目取得前五名或前三名积分;取前五名的积分分别为7,5,3,2,1;前三名的积分分别为5,3,2;项目编号为奇数的取前五名,项目编号为偶数的取前三名(m≤20,n≤20)。每个项目结束时,将其编号输入,并按名次顺序输入运动员姓名、学校编号和成绩。
请用C/C++编写一系统,模拟运动会分数统计过程,软件应包括如下几个方面:
(一)功能要求:
(1)成绩输入:
要求:可以输入各个项目的前三名或前五名的成绩。
(2)成绩查询:
要求:可以按学校编号查询学校各项目情况;可以按项目编号查询取得前三名或前五名的学校。
(3)成绩统计:
要求:能统计各学校总分。
(4)成绩排序:
要求:可以按学校编号、学校总分、男女团体总分排序输出。
(二)其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读;
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好);
(3)学生可自动增加新功能模块(视情况可另外加分);
(4)写出课程设计报告,具体要求见相关说明文档。
2 概要设计
2.1 系统功能设计
根据运动会分数统计系统问题的分析和设计要求,可以将该系统可以分为三个模块:信息统计模块、信息输出模块、信息查询模块,其系统功能结构图如图1所示。
(1)信息统计模实现信息的输入、统计。
(2)信息输出模块,实现信息的输出。
(3)信息查询实现信息的查询。
图1 系统功能结构图
3.详细设计:
毕业设计有困难?加 QQ 929486211
(1)定义运动项目数据类型,用于存放运动项目,包括项目编号、项目所取名次数、名次、分数。
//定义项目结点的类型
typedef struct
{
int itemnum; //项目编号
int top; //项目取名次的数目,由用户定义3或5
int range[5]; //名次
int mark[5]; //分数
}itemnode;
(2)定义学校数据类型,用来存储参赛学校信息,包括学校编号、学校总分、男团总分、女团总分、项目数组。
//定义学校结点类型
struct schoolnode//学校结点的类型
{
int schoolnum;//学校的编号
int score;//学校所得的分数
int mscore;//男团所得的分数
int wscore;//女团所得的分数
struct itemnode c[m+w];//项目结点类型的数组
};
schoolnode h[n];//定义一个学校结点类型的数组
(3)定义学校数组schoolnode h[n]。采用数组结构有利于随机的存储和查询。
函数的设计和实现
在概要设计中已经对该系统涉及的抽象数据类型和函数及其功能做了说明,这里就不在对每个函数进行一一说明,只对其中比较重要的功能模块进行描述。
(1)信息输入及分数统计功能
void inputinformation( )为输入信息及分数统计函数。在输入信息的同时进行分数的统计。可以输入各个学校各项目前三名或前五名的成绩。在输入学校的参赛项目时,结果取前三名还是前五名自己定,用一个选择语句实现。利用swith语句前三名的分数赋为5、3、2,前五名的成绩赋为7,5、3、2、1,未取得成绩则赋为0。并统计团体总分,男团总分和女团总分。其主要功能代码如下:
void inputinformation( ) //输入和统计信息函数
{
int q=0;
int i,j,k,s;
for(i=0;i<n;i++)//初始化为0
{
h[i].score=0;
h[i].mscore=0;
h[i].wscore=0;
}
for(i=0;i<n;i++)
{
do
{
system("color 2A");
cout<<"输入学校的编号:"<<endl;
cin>> h[i].schoolnum;
}
while(h[i].schoolnum>n||h[i].schoolnum<=0);
for(j=0;j<m+w;j++)
{
do
{
system("color 2B");
cout<<"输入项目编号:(注意分清是男团编号还是女团编号)"<<endl;
cin>>h[i].c[j].itemnum;
}
while(h[i].c[j].itemnum>n||h[i].c[j].itemnum<=0);
do
{
system("color 2C");
cout<<"取得前三名还是前五名:"<<endl;
cin>>h[i].c[j].top;
}while(h[i].c[j].top!=3&&h[i].c[j].top!=5);
cout<<"获得几个名次:"<<endl;
cin>>k;
for(s=0;s<5;s++)//初始化分数和名次都为零
{
h[i].c[j].mingci[s]=0;
h[i].c[j].mark[s]=0;
}
if(k<5)
for(s=0;s<k;s++)
{
system("color 2B");
cout<<"请输入名次:";
cin>>h[i].c[j].mingci[s];
if(h[i].c[j].top==3)//计算得分
switch(h[i].c[j].mingci[s])
{
case 0: h[i].c[j].mark[s]=0;break;
case 1: h[i].c[j].mark[s]=5;break;
case 2: h[i].c[j].mark[s]=3;break;
case 3: h[i].c[j].mark[s]=2;break;
}
else
switch(h[i].c[j].mingci[s])
{
case 0: h[i].c[j].mark[s]=0;break;
case 1: h[i].c[j].mark[s]=7;break;
case 2: h[i].c[j].mark[s]=5;break;
case 3: h[i].c[j].mark[s]=3;break;
case 4: h[i].c[j].mark[s]=2;break;
case 5: 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];//是女子项目则记到女子项目里面去
}
else
cout<<"输入错误"<<endl;
}
}
}
(2)信息输出功能
void output( )为输出函数。列出一个输出目录利用swich语句使函数按学校编号输出或按学校总分、男团总分、女团总分由高到低排序输出。利用辅助数组remember[]和冒泡排序的方法使之按分数的由高到低输出。利用循环语句do while( )当输入2时返回输出目录,输入0是跳出循环返回主菜单。其流程图如图2所示。
图2 输出信息模块流程图
void output( )// 输出信息函数
{
int choice,i,j,k;
int remember[n];
int sign;
do
{
system("color 1A");
cout<<" ^^^^^^^^^^^^^^^^^^"<<endl;
cout<<" ^1.按学校编号输出 ^"<<endl;
cout<<" ^ 2.按学校总分输出 ^"<<endl;
cout<<" ^ 3.按男团总分输出 ^"<<endl;
cout<<" ^ 4.按女团总分输出 ^"<<endl;
cout<<" ^ 请选择编号 ^ "<<endl;
cout<<" ^^^^^^^^^^^^^^^"<<endl;
cin>>choice;
switch(choice)
{
case 1://按学校编号输出
system("color 2B");
for(i=0;i<n;i++)
{
cout<<" 学校编号:"<<h[i].schoolnum<<endl;
cout<<" 学校总分:"<<h[i].score<<endl;
cout<<" 男团总分:"<<h[i].mscore<<endl;
cout<<" 女团总分:"<<h[i].wscore<<endl<<endl<<endl;
}
break;
case 2://按学校总分输出
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]].score<h[j].score)
{
k=remember[i];
remember[i]=remember[j];
remember[j]=k;
}
}
system("color 3B");
for(i=0;i<n;i++)
{
cout<<" 学校编号:"<<h[remember[i]].schoolnum<<endl;
cout<<" 学校总分:"<<h[remember[i]].score<<endl;
cout<<" 男团总分:"<<h[remember[i]].mscore<<endl;
cout<<" 女团总分:"<<h[remember[i]].wscore<<endl<<endl<<endl;
}
break;
case 3://按男团总分输出
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]].score<h[j].score)
{
k=remember[i];
remember[i]=remember[j];
remember[j]=k;
}
}
system("color 4D");
for(i=0;i<n;i++)
{
cout<<" 学校编号:"<<h[remember[i]].schoolnum<<endl;
cout<<" 学校总分:"<<h[remember[i]].score<<endl;
cout<<" 男团总分:"<<h[remember[i]].mscore<<endl;
cout<<" 女团总分:"<<h[remember[i]].wscore<<endl<<endl<<endl;
}
break;
case 4:// 按女团总分输出
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]].score<h[j].score)
{
k=remember[i];
remember[i]=remember[j];
remember[j]=k;
}
}
system("color 7C");
for(i=0;i<n;i++)
{
cout<<" 学校编号:"<<h[remember[i]].schoolnum<<endl;
cout<<" 学校总分:"<<h[remember[i]].score<<endl;
cout<<" 男团总分:"<<h[remember[i]].mscore<<endl;
cout<<" 女团总分:"<<h[remember[i]].wscore<<endl<<endl<<endl;
}
break;
}
cout<<" 请选择: 1 ----> 继续选择输出, 0 ----> 选择查询"<<endl;
cin>>sign;
}
while(sign==1);
}
(3)信息查询功能
void inquiry( )为查询函数。列车一个查询目录利用swich 语句使函数按学校编号或项目编号查询,输出某学校的某个项目的得分情况或某个项目的前几名的学校。再利用循环语句do while( )当输入2是返回查询目录,输入0时跳出循环返回主菜单。其程序流程图如图3所示。
图3 查询信息模块程序流程图
void inquiry() //信息查询
{
int choice;
int i,j,k,s;
system("color 6B");
cout<<" ^^^^^^^^^^^^^^^^"<<endl;
cout<<" ^ 1:按学校编号查询 ^ "<<endl;
cout<<" ^ 2:按项目编号查询 ^"<<endl;
cout<<" ^ 请选择查询的方式 ^"<<endl;
cout<<" ^^^^^^^^^^^^^^^^"<<endl;
cin>>choice;
switch(choice)
{
case 1:
do
{
cout<<"要查询的学校编号"<<endl;
cin>>i;
system("color 3A");
if(i>n)
cout<<"输入错误"<<endl;
else
{
cout<<"要查询的项目编号:"<<endl;
cin>>j;
system("color 8A");
if(j>m+w||j==0)
cout<<"没有这个项目"<<endl;
else
{
cout<<"该学校的成绩为:"<<endl;
for(k=0;k<5;k++)
if(h[i-1].c[j-1].mingci[k]!=0)
cout<<"名次:"<<h[i-1].c[j-1].mingci[k]<<endl;
}
}
cout<<"请选择 1 ----> 继续 , 0 ----> 结束"<<endl;
cin>>s;
cout<<endl<<endl<<endl;
}while(s==1);
break;
case 2:
do
{
cout<<"要查询的项目编号:"<<endl;
cin>>s;
if(s>m+w||s==0)
cout<<"没有这个项目"<<endl;
else
{
cout<<"取得名次的学校是:"<<endl;
for(i=0; i<n;i++)
for(j=0;j<5;j++)
if(h[i].c[s-1].mingci[j]!=0)
cout<<"学校编号:"<<h[i].schoolnum<<"名次:"<<h[i].c[s-1].mingci[j]<<endl;
} //输出该项目取得名次学校的成绩
cout<<"继续 ----> 1,结束 ----> 0"<<endl;
cin>>i;
cout<<endl<<endl<<endl;
}while(i==1);
break;
}
}
(4)主函数
void main( )是主函数。列出主菜单,利用switch语句调用以上函数实现各个菜单的功能。
其实现代码如下:
void main()
{
system("color 5B");
cout<<" ******************毕业设计有困难?加QQ 929486211************"<<endl;
cout<<" * 1.输入信息 *"<<endl;
cout<<" * 2.输出信息 *"<<endl;
cout<<" 3.查询信息 *"<<endl;
cout<<" * 4.退出 *"<<endl;
cout<<" * 请选择 (*^__^*) *"<<endl;
cout<<" **********************************************************"<<endl;
int choice;
int s;
cin>>choice;
switch(choice)
{
case 1: cout<<"请输入信息:"<<endl;
do
{
inputinformation();
cout<<"请选择 1 ----> 继续 , 0 ----> 跳出"<<endl;
cin>>s;
cout<<endl<<endl<<endl;
}while(s==1);
case 2: output();
case 3: inquiry( );
case 4: break;
}
}
4 测试
运行程序,进入系统主菜单。用户可以选择输入、输出、查询信息或退出系统,界面如图4所示。
(1)输入信息
输入1得到进入输入信息模块。根据系统提示将以下信息输入系统中:
学校编号1,项目编号1,取前5名,获得1个名次,是第5名;项目编号2,取前3名,获得3个名次,分别是1、2、3名。
学校编号2,项目编号1,取前5名,获得4个名次,分别是1、2、3、4名;项目编号2,取前5名,获得0个名次。
输入信息后,会自动存档,并提示存档成功,然后自动返还主菜单,如图5所示。
(2)输出信息
输入2进入输出信息模块,该模块分四项,分别代表一种输出方式,如图6所示。
用户可以按照自己的喜好,选择一种方式输入信息,输入2返回输出信息模块,输入0返回主菜单。如图7~9分别是按照学校编号、学校总分、女团总分输出的情况。
按学校总分输出
按女团总分输出
(3)查询信息
输入3进入信息查询模块,该模块分为两项,如图10所示。
信息查询模块
用户可以选择不同菜单进行查询,如图11和图12分别是按照学校编号和项目编号查询的情况。
按学校编号查询
(4)退出系统
在主菜单下输入4可以退出系统,并有中文提示,如图所示。
退出系统
心得体会
在这次上机过程中遇到过一些问题,但经过不懈努力,解决了部分,还有的现在不能解决,留待日后思考和解决。
比如说在运用数据结构排序的时候,方法的选择上,总是想用时间复杂度小的算法,但结果出了问题,最后还是用了我们熟悉的选择法排序。
在编写之前,做整体规划和详细设计很重要。只有思路清晰,设计合理可行,编码才有可能有的放矢,才能更加有效的完成任务。
本次集中上机实验,对我来说可以算是一次挑战,因为在理论学习中没有好好的掌握,现在要独立完成一个较复杂的程序编写,确实有一点困难。但我对于难度一向是以积极迎战的态度来面对,认真积极努力完成这次集中上机的任务。对我来说这是一次很好的机会,同时我也很好的把握了这次机会,认真的完成了此次上机学习的任务,对自己今后在程序编写方面以及文档撰写方面相信会有很大的帮助,在此也对学校安排这样一次学习表示感谢,最后希望自己在数据结构以及计算机的其他学习方面能够得到很好的提高。
6.用户使用手册
1.输入信息(依照提示,确保输入的信息在规定的范围之内)
2.输出信息(按照不同的要求输出)
3.用户查询(提供两种方式)
4.退出系统。
展开阅读全文