运动会分数统计系统
课 程 设 计 报 告
数 据 结 构
院系:                 
专业:                 
班级:                 
学号:                 
姓名:                 
教师:                 
时间:                 
一、问题描述
1、功能
  任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:75321,前三名的积分分别为:532;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20,按要求实现相应的数据输入、查询、计分等功能。
2、数据
建议输入学校的名称,运动项目的名称等,其余信息学生自行设计;
输出形式:有合理的提示,各学校分数为整形
数据的存储结构自行设计。
建议运动会的相关数据要存储在数据文件中。
system的头文件
3、操作
1)可以输入各个项目的前三名或前五名的成绩;
2)能统计各学校总分,
3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
4、要求
提供系统菜单,界面友好,提示信息完整。
二、系统分析及设计
1、需求分析
    根据运动会分数统计系统的问题分析及设计要求,可以将此系统分为四个模块:信息统计
模块、信息输出模块、信息查询模块、信息调用模块。其系统功能结构图如图所示。
(1)、信息统计模块实现信息的输入、统计、存档。
(2)、信息输出模块实现信息的输出。
(3)、信息查询模块实现信息的查询。
(4)、信息调用模块实现信息的调用,即从文件中读出信息并输出。
2、概要设计
此系统采用顺序存储结构存储,定义了一个结构体数组存放参赛学校的信息。之所以采用顺序存储结构,是因为用它来实现信息的存储、查询比较方便,节省时间,效率高,而且也方便把信息写入文件以及读取文件。
(1)、结构体定义如下:
①、定义运动项目数据类型,用于存放运动项目的信息,包括项目名称、项目编号、用户自己定义的取前3名还是前5名的积分、名次、分数。
typedef struct
{
    char proname[10];                            //项目名称
    int pronum;                            //项目编号
    int top;            //取前3名或前5名积分,由用户自己定义
    int range[5];                          //名次
    int mark[5];                            //分数
}Pronode;                                  //项目结点类型定义
②、定义学校数据类型,用于存放参赛学校的信息,包括学校名称、学校编号、学校总分、男子团体总分、女子团体总分以及项目数组。
typedef struct
{
    char schname[20];                      //学校名称
    int schnum;                            //学校编号
    int score;                              //总分
    int Mscore;                            //男子团体总分
    int Wscore;                            //女子团体总分                                             
    Pronode a[M+W];                            //项目数组
}Schnode;                                  //学校结点类型定义
③、定义一个学校结点类型的结构体数组Schnode s[N]。采用数组结构有利于随机存储和查询。
(2)、信息统计模块的算法设计说明
输入参赛学校比赛成绩的信息时,采用三重循环,第一重循环控制参赛学校的个数,第二重循环控制各参赛学校的参赛项目个数,第三重循环控制各参赛学校的各参赛项目所获得的名次个数,并依次输入相应信息,根据所输入的名次得出相对应的分数。然后分别统计出各学校的总分、男子团体总分和女子团体总分。调用文件数据块写函数fwrite将信息写入文件,方便以后调用。
(3)、信息输出模块的算法设计说明
根据设计要求,实现按学校名称、学校总分、男子团体总分、女子团体总分输出。因此选用switch语句实现此功能。case 1按学校名称输出时,直接取出数据进行输出;case 2按学校总分输出时,采用冒泡排序法进行排序然后按分数由高到低输出;case 3和case 4也均采用冒泡排序法进行排序最后按分数由高到低输出。
其流程图如图所示:
(4)、信息查询模块的算法设计说明
根据设计要求,提供两种不同的查询方式:按学校编号查询和按项目编号查询。因此也采用switch语句实现此功能。case 1按学校编号查询,提示输入要查询的学校编号以及要查询的项目编号,直接取出该学校该项目的信息进行输出。case 2按项目编号查询,提示输入要查询的项目编号,输出该项目取得名次的学校的信息。
其流程图如图所示:
(5)、信息调用模块的算法设计说明
信息调用,即读取保存在文件里的信息并输出。由于采用的是数组存储,可以很方便的一下把文件里的信息全部读取出来,再利用三重循环依次把各学校各项目所取得的成绩输出。
3、详细设计
(1)、信息输入及分数统计功能
void InfoInput()是信息输入及分数统计的函数,在输入信息的同时进行分数统计,可以输入各学校各项目前3名或前5名的成绩。结果取前3名还是前5名由用户自己定。用switch 语句将前3名的成绩赋值为5、3、2,前5名的成绩赋值为7、5、3、2、1,未取得的成绩则赋为0。并统计总分、男子团体总分和女子团体总分。
其主要功能代码如下:
for(m=0;m<k;m++)                                //输入所获名次信息
{
cout<<"        名次:";
    cin>>s[i].a[j].range[m];
    if(s[i].a[j].top==3)                      //匹配各名次对应的分数
{
        switch(s[i].a[j].range[m])
        {
            case 0: s[i].a[j].mark[m]=0; break;
            case 1: s[i].a[j].mark[m]=5; break;
            case 2: s[i].a[j].mark[m]=3; break;
            case 3: s[i].a[j].mark[m]=2; break;
        }
}
    else
    {
        switch(s[i].a[j].range[m])
        {
            case 0: s[i].a[j].mark[m]=0; break;
            case 1: s[i].a[j].mark[m]=7; break;
            case 2: s[i].a[j].mark[m]=5; break;
            case 3: s[i].a[j].mark[m]=3; break;
            case 4: s[i].a[j].mark[m]=2; break;
            case 5: s[i].a[j].mark[m]=1; break;
        }
    }
    s[i].score=s[i].score+s[i].a[j].mark[m];          //统计学校总分
    if(j<=M-1)
        s[i].Mscore=s[i].Mscore+s[i].a[j].mark[m];      //统计男团总分
    else
        s[i].Wscore=s[i].Wscore+s[i].a[j].mark[m];      //统计女团总分
}
(2)、信息输出功能
    void InfoOutput()是信息输出函数。输出一个总分显示菜单,利用switch语句实现按学校名称输出或按学校总分、男子团体总分、女子团体总分由高到低输出。采用冒泡排序的方法使
之按总分由高到低输出。利用循环语句while(1)返回总分显示菜单,break语句终止循环。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。