数据结构程序设计 运动会分数统计

时间:2025-02-19 19:08:53

摘 要
设计了一个运动会分数统计系统,该系统可以简单的统计有关于运动会的信息。本系统采用VC++作为软件开发环境,运用了排序算法和线性表的顺序存储等算法。实现了对运动会数据的存储与排序运算。操作简单,界面清晰,易于为用户所接受。
关键词:算法;运动会;系统
1 课题描述
任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
功能要求:
1)输入各个项目的前三名或前五名的成绩;
2)统计各学校总分,
3)按学校编号或名称、学校总分、男女团体总分排序输出;
4)按学校编号查询学校某个项目的情况;可以按项目编号查询取得 前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称
输出形式:有合理的提示,各学校分数为整形
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;
2 问题分析和任务定义
本程序的要求是对运动会信息的统计与分析。要求我们可以将比赛的按各个比赛项目划分,还可以按照学校来划分。还要求有排序的部分,要求成绩可以按照学校、男团和女团排序。并且可以将数据存入文件,也可以从文件里读出数据。限制条件为,各学校的分数的类型都要是整形的,数据都要存储在文件中。

3逻辑设计
(1)结构体
项目{名字,名次,获奖人数,获奖人姓名,获奖排名,得分,性别}
学校{名字,学校总分,男团总分,女团总分,项目}
(2)主函数
包括登录欢迎程序,主菜单,输入程序,查询程序,存读文件程序,退出程序
(3)调用关系图

4 详细设计
(1)项目数据表
本数据表主要是存储每个项目的名字、要取的名次、取得各个名次学生的姓名以及取得的名次和获得的分数
typedef struct//存储项目信息的结构体
{
char name[20];//存储项目的姓名
int top;//存储项目名次的选择
int num;//存储有几个有名次的
int ranking[6];//存储名次
int grade[6];//存储分数
char d[20][20];//存储同学的姓名
int gender;//存储性别
} project;

(2)学校数据表
本数据表主要是介绍各参赛学校的总体情况,包括学校的名字、取得的总分、男团的总分、女团的总分、包括各个项目的数组。
typedef struct//存储学校的信息
{
char name[20];//存学校的姓名
int school;//存学校的总成绩
int man;//存男团的总成绩
int woman;//存女团的总成绩
project b[M+W];//存这个学校的项目
} school;
(3)函数介绍
1、void start() 功能:初始页面
2、void menu() 功能:菜单
3、void Initialization()功能:初始化函数,初始化学校的总分等
4、void input() 功能:输入函数
5、void output() 功能:输出学校信息函数
6、void sortmenu() 功能:排序的菜单
7、void sortput() 功能:排序的函数
8、void outschool() 功能:输出学校的总分
9、void projectout() 功能:输出项目信息的函数
10、void savefile() 功能:存文件的函数
11、void readfile() 功能:读文件的函数
12、void xuexiao() 功能:查询某个学校或者项目的函数
13、void command()功能:命令函数
14、int main()功能:主函数
5 程序编码

#include <iostream>
#include<algorithm>
#include<queue>
#include<>
#include<>
#include<map>
#include<>
using namespace std;
#define M 31
#define W 21
#define S 51
typedef struct//存储项目信息的结构体
{
char name[20];//存储项目的姓名
int top;//存储项目名次的选择
int num;//存储有几个有名次的
int ranking[6];//存储名次
int grade[6];//存储分数
char d[20][20];//存储同学的姓名
int gender;//存储性别
} project;
typedef struct//存储学校的信息
{
   char name[20];//存学校的姓名
int school;//存学校的总成绩
    int man;//存男团的总成绩
    int woman;//存女团的总成绩
    project b[M+W];//存这个学校的项目
} school;
school a[S];
int nom,item;
bool cmp1(school c,school d)//排序
{
    return >;
}
bool cmp2(school c,school d)
{
return >;
}
bool cmp3(school c,school d)
{
    return >;
}
void start()//初始页面
{
    int i;
    for(i=0; i<10; i++)
        printf("\n");
printf("          *****************************************************\n");
printf("          **                                                 **\n");
    printf("          >>>>>>>>>>>>>>欢迎使用运动会分数统计项目<<<<<<<<<<<<<\n");
    printf("          **                                                 **\n");
    printf("          *****************************************************\n");
    printf("按任意键进入系统.........");
    getchar();
    return ;
}
void menu()//菜单
{
    printf("******************************************************\n");
    printf("                   1:录入运动会信息                   \n");
    printf("                   2:输出各学校的信息                 \n");
    printf("                   3:输出排序后的信息                 \n");
    printf("                   4:输出各项目的信息                 \n");
    printf("                   5:输出各学校的总分                 \n");
    printf("                   6:将信息存入文件                   \n");
    printf("                   7:将信息从文件中读出               \n");
    printf("                   8:查询某学校的信息或者某项目的信息 \n");
    printf("                   9:退出程序                         \n");
    printf("******************************************************\n");
}
void Initialization()//初始化函数,初始化学校的总分等
{
    int i,j,k;
    for(i=1; i<=nom; i++)
    {
        a[i].school=0;
        a[i].man=0;
        a[i].woman=0;
        for(j=1; j<=item; j++)
        {
            a[i].b[j].top=0;
            a[i].b[j].gender=0;
            a[i].b[j].num=0;
            for(k=1; k<=5; k++)
            {
                a[i].b[j].ranking[k]=0;
                a[i].b[j].grade[k]=0;

            }
        }
    }
    return ;
}
void input()//输入函数
{
    printf("请输入学校的总个数: ");
    scanf("%d",&nom);
    printf("\n");
    printf("请输入项目的总个数: ");
    scanf("%d",&item);
    printf("\n");
    int i,j,k;
    Initialization();
    for(i=1; i<=nom; i++)
    {
        printf("请输入学校的名称:");
        scanf("%s",&a[i].name);
        printf("\n");

        for(j=1; j<=item; j++)
        {
            printf("请输入项目的名称:");
            scanf("%s",a[i].b[j].name);
            printf("\n");
            printf("请输入是男子项目还是女子项目 (男子输1,女子输2):");
            scanf("%d",&a[i].b[j].gender);
            printf("\n");
            int sum=0;
            if(a[i].b[j].gender==1)
            {
                printf("请输入此项目取前几名(3或5):");
                scanf("%d",&a[i].b[j].top);
                printf("\n");
                printf("请输入该学校在此项目取得名次的人数:");
                scanf("%d",&a[i].b[j].num);
                printf("\n");
                for(k=1; k<=a[i].b[j].num; k++)
                {
                    printf("请输入获得的名次情况和获得名次的人名:");
                    scanf("%d %s",&a[i].b[j].ranking[k],&a[i].b[j].d[k]);

                    printf("\n");
                    if(a[i].b[j].top==3)
                    {
                        if(a[i].b[j].ranking[k]==1)
                        {
                            a[i].b[j].grade[k]=5;
                        }
                        else if(a[i].b[j].ranking[k]==2)
                        {
                            a[i].b[j].grade[k]=3;
                        }
                        else if(a[i].b[j].ranking[k]==3)
                        {
                            a[i].b[j].grade[k]=2;
                        }
                        else
                            a[i].b[j].grade[k]=0;

                    }
                    else if(a[i].b[j].top==5)
                    {
                        if(a[i].b[j].ranking[k]==1)
                        {
                            a[i].b[j].grade[k]=7;
                        }
                        else if(a[i].b[j].ranking[k]==2)
                        {
                            a[i].b[j].grade[k]=5;
                        }
                        else if(a[i].b[j].ranking[k]==3)
                        {
                            a[i].b[j].grade[k]=3;
                        }
                        else if(a[i].b[j].ranking[k]==4)
                        {
                            a[i].b[j].grade[k]=2;
                        }
                        else if(a[i].b[j].ranking[k]==5)
                        {
                            a[i].b[j].grade[k]=1;
                        }
                        else
                            a[i].b[j].grade[k]=0;

                    }
                    else
                    {
                        printf("规定的名次不符合要求\n");
                        j--;
                        continue;
                    }
                }
                for(k=1; k<=a[i].b[j].num; k++)
                    sum+=a[i].b[j].grade[k];
                a[i].school+=sum;
                a[i].man+=sum;
            }
            else
            {
                printf("请输入此项目取前几名(3或5):");
                scanf("%d",&a[i].b[j].top);
                printf("\n");
                printf("请输入该学校在此项目取得名次的人数:");
                scanf("%d",&a[i].b[j].num);
                printf("\n");
                for(k=1; k<=a[i].b[j].num; k++)
                {
                    printf("请输入获得的名次情况和获得名次的人名:");
                    scanf("%d %s",&a[i].b[j].ranking[k],&a[i].b[j].d[k]);
                    printf("\n");
                    if(a[i].b[j].top==3)
                    {
                        if(a[i].b[j].ranking[k]==1)
                        {
                            a[i].b[j].grade[k]=5;
                        }
                        else if(a[i].b[j].ranking[k]==2)
                        {
                            a[i].b[j].grade[k]=3;
                        }
                        else if(a[i].b[j].ranking[k]==3)
                        {
                            a[i].b[j].grade[k]=2;
                        }
                        else
                            a[i].b[j].grade[k]=0;

                    }
                    else if(a[i].b[j].top==5)
                    {
                        if(a[i].b[j].ranking[k]==1)
                        {
                            a[i].b[j].grade[k]=7;
                        }
                        else if(a[i].b[j].ranking[k]==2)
                        {
                            a[i].b[j].grade[k]=5;
                        }
                        else if(a[i].b[j].ranking[k]==3)
                        {
                            a[i].b[j].grade[k]=3;
                        }
                        else if(a[i].b[j].ranking[k]==4)
                        {
                            a[i].b[j].grade[k]=2;
                        }
           else if(a[i].b[j].ranking[k]==5)
                        {
                            a[i].b[j].grade[k]=1;
                        }
                        else
                            a[i].b[j].grade[k]=0;

                    }
                    else
                    {
                        printf("规定的名次不符合要求\n");
                        j--;
                        continue;
                    }
                }
                for(k=1; k<=a[i].b[j].num; k++)
                    sum+=a[i].b[j].grade[k];
                a[i].school+=sum;
                a[i].woman+=sum;
            }
        }

    }
    return ;
}
void output()//输出学校信息函数
{
    int i,j,k;
    printf("学校         项目       性别       名次个数     获得名次数       名次       姓名\n");
    for(i=1; i<=nom; i++)
    {
        for(j=1; j<=item; j++)
        {

            for(k=1; k<=a[i].b[j].num; k++)
            {
                if(a[i].b[j].gender==1)
                    printf("%-13s%-8s   男子       %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
                else
                    printf("%-13s%-8s   女子       %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
            }
        }
    }
    printf("按任意键继续.........\n");
    getchar();
    getchar();
    return ;
}
void sortmenu()//排序菜单
{
    printf("***********************************************\n");
    printf("              1:按照学校的名次排序             \n");
    printf("              2:按照男团的名次排序             \n");
    printf("              3:按照女团的名次排序             \n");
    printf("              4:按照学校的编号输出             \n");
    printf("              5:退出排序系统                   \n");
    printf("***********************************************\n");
}
void sortput()//排序的函数
{

    while(1)
    {
        system("cls");
        sortmenu();
        printf("请输入命令:");
        int com,i;
        scanf("%d",&com);
        printf("\n");
        if(com==4)
        {
            output();
        }
        else if(com==1)
        {
            printf("按照学校的名次排序为:\n");
            sort(a+1,a+nom,cmp1);
            for(i=1; i<=nom; i++)
            {
                printf("排名第%d的学校为:%s\n",i,a[i].name);
            }
            printf("按任意键继续.......\n");
            getchar();
            getchar();
        }
        else if(com==2)
        {
            printf("按照男团的名次排序为:\n");
            sort(a+1,a+nom,cmp2);
            for(i=1; i<=nom; i++)
            {
                printf("排名第%d的学校为:%s\n",i,a[i].name);
            }
            printf("按任意键继续.......\n");
            getchar();
            getchar();
        }
        else if(com==3)
        {
            printf("按照女团的名次排序为:\n");
            sort(a+1,a+nom,cmp3);
            for(i=1; i<=nom; i++)
            {
                printf("排名第%d的学校为:%s\n",i,a[i].name);
            }
            printf("按任意键继续.......\n");
            getchar();
            getchar();
        }
        else if(com==5)
            break;
        else
            printf("无效的命令\n");
    }

}
void outschool()//输出学校的总分
{
    int i;
    for(i=1; i<=nom; i++)
        printf("%s学校的总分为%d\n",a[i].name,a[i].school);
    printf("按任意键继续.........\n");
   getchar();
    getchar();
}
void projectout()//输出项目信息的函数
{
    int i,j,k,p,q;
    for(i=1; i<=item; i++)
    {
        printf("                           %s该项目的排名\n",a[1].b[i].name);
        printf("                      学校      名次      姓名\n");
        for(j=1; j<=a[1].b[i].top; j++)
        {
            for(k=1; k<=nom; k++)
            {
                for(p=1; p<=item; p++)
                {
                    if(strcmp(a[k].b[p].name,a[1].b[i].name)==0)
                    {
                        for(q=1; q<=a[k].b[p].num; q++)
                        {
                            if(a[k].b[p].ranking[q]==j)
                            {
                                printf("                      %-10s%-10d%s\n",a[k].name,j,a[k].b[p].d[q]);
                            }
                        }
                    }

                }
            }
        }
        printf("\n");
    }
    printf("按任意键继续......\n");
    getchar();
    getchar();

}
void savefile()//存文件的函数
{
    FILE *fp;
    int i;
    if((fp=fopen("","w"))==NULL)
    {
        printf("打不开文件\n");

    }
    else
    {
        fwrite(&nom,sizeof(int),1,fp);
        fwrite(&item,sizeof(int),1,fp);
        for(i=1; i<=nom; i++)
        {
            if(fwrite(&a[i],sizeof(school),1,fp)!=1)
                printf("不能打开文件\n");
        }
    }
    fclose(fp);
    printf("按任意键继续.........");
    getchar();
    getchar();
}
void readfile()//读文件的函数
{
    int i;
    FILE *fp;
    if((fp=fopen("","rb"))==NULL)
    {
        printf("不能打开文件\n");
    }
    else
    {
        fread(&nom,sizeof(int),1,fp);
        fread(&item,sizeof(int),1,fp);
        for(i=1; i<=nom; i++)
        {
            fread(&a[i],sizeof(school),1,fp);
        }
    }
    printf("按任意键继续.........");
    getchar();
    getchar();
}
void xuexiao()//查询某个学校或者项目的函数
{
    system("cls");
    printf("请输入你要查找学校还是项目(学校输1,项目输2):");
    int com;
    scanf("%d",&com);
    printf("\n");
    int i,j,k,p,q;
    if(com==1)
    {
        printf("请输入要查找的学校的名称:");
        char s[20];
        scanf("%s",s);
        printf("\n");
        for(i=1; i<=nom; i++)
        {
if(strcmp(s,a[i].name)==0)
            {
printf("学校         项目       性别       名次个数     获得名次数       名次       姓名\n");
                for(j=1; j<=item; j++)
                {

                    for(k=1; k<=a[i].b[j].num; k++)
                    {
                        if(a[i].b[j].gender==1)
printf("%-13s%-8s   男子       %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
                        else
                            printf("%-13s%-8s   女子       %-15d%-15d%-10d%s\n",a[i].name,a[i].b[j].name,a[i].b[j].top,a[i].b[j].num,a[i].b[j].ranking[k],a[i].b[j].d[k]);
                    }
                }
                break;
            }
        }
        if(i==nom+1)
        {
            printf("没有找到你要查找的学校\n");
        }
    }
    else
    {
        int flag=0;
        printf("请输入要查找的项目的名称:");
        char s[20];
        scanf("%s",s);
        printf("\n");
        int d;
        for(j=1; j<=item; j++)
        {
            if(strcmp(a[1].b[j].name,s)==0)
            {
     printf("                           %s该项目的排名\n",a[1].b[i].name);
                printf("                      学校      名次      姓名\n");
                for(d=1; d<=a[1].b[j].top; d++)
                {
                    for(k=1; k<=nom; k++)
                    {
                        for(p=1; p<=item; p++)
                        {
                            if(strcmp(a[k].b[p].name,s)==0)
                            {
                                for(q=1; q<=a[k].b[p].num; q++)
                                {
                                    if(a[k].b[p].ranking[q]==d)
                                    {
                                        printf("                      %-10s%-10d%s\n",a[k].name,d,a[k].b[p].d[q]);
                                    }
                                }
                            }

                        }
                    }
                }
                flag=1;
                break;
            }
            if(flag)
                break;
        }
    }
    printf("按任意键继续......");
    getchar();
    getchar();
}
void command()//命令函数
{
    int com;
    while(1)
    {
        system("cls");
        menu();
        printf("请输入要执行的命令\n");

        scanf("%d",&com);
        if(com==1)
            input();
        else if(com==2)
            output();
        else if(com==3)
            sortput();
        else if(com==4)
            projectout();
        else if(com==5)
            outschool();
        else if(com==6)
            savefile();
        else if(com==7)
            readfile();
        else if(com==8)
            xuexiao();
        else if(com==9)
            return ;
        else
            printf("无效的命令\n");
    }
}
int main()//主函数
{
    start();
    system("cls");
    command(); 
return 0;
}    

7 结果分析
本程序的时间复杂度大约为O(N3),主要是在程序的输入和输出。空间复杂度大约为O(N2);
程序的问题及解决过程:开始时程序没有查询学校和项目信息的功能。之后添加了这个功能,用了名字匹配的功能,可以查询相关学校和项目。还有之前的输出格式不好,之后进行了一些改进,比以前好多了。

8 总结
这次的程序设计完成了关于运动会的信息的存储,可以按照学校编号输出,也可以按照排序输出,还可以查询学校或者项目的相关信息。程序中用到了排序算法,在查询学校中用到了匹配。在设计的过程当中遇到了很多的问题,最后通过思考和查找资料等方法将其解决。在设计的过程当中学到了很多,也发现解决一个问题需要有耐心、恒心。通过这次程序设计,使我加深了对数据结构的理解,也提高了自己解决问题的能力。

参考文献
[1] 刘晓华,唐焕玲,肖进杰.数据结构(C语言版)[M].北京:清华大学出版社,2015
[2] 王金鹏.C语言可以这样学[M]. 北京:清华大学出版社,2016