数据结构(运动会分数统计)

任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)
功能要求:
1)输入各个项目的前三名或前五名的成绩;
2)统计各学校总分;
3)按学校编号或名称、学校总分、男女团体总分排序输出;
4)按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询
6)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称
输出形式:有合理的提示,各学校分数为整形 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

比赛编号 获奖前(3/5)名 比赛名称 第一名 获奖人 第二名 获奖人 第三名 获奖人 第四名 获奖人 第五名 获奖人
1 3 篮球 清华大学 小华 北京大学 小明 中山大学 小韩
2 3 足球 中山大学 小张 浙江大学 小周 清华大学 小华
3 5 网球 北京大学 小明 山东大学 小李 上海大学 小赵 清华大学 小江 中山大学 小钱
4 5 体操 浙江大学 小孙 武汉大学 小常 清华大学 小花 北京大学 小丽 北理工 小龙
5 5 啦啦操 北理工 小龙 南京大学 小高 北理工 小刘 中山大学 小张 浙江大学 小何
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
int mark[6][7],n,m,w,per_num;
struct SCHOOL
{
    char name[50];//学校名
    int mark;//学校编号
    int scores;//学校总成绩
    int score_man;//男团总成绩
    int score_woman;//女团总成绩
    int rank_num[30][30];//在某项目中获得哪些名次
} school[105];
struct TEST
{
    int top_num;//该项目取前几名
    int mark;//项目编号
    char name[50];//项目名称
    char test_rank[6][50];//项目前几名是哪几个学校
    char rank_name[6][50];//获奖人姓名
} test[105];
struct Person
{
    char name[50];
    char school_name[50];
    int rank_honor[105][6];
} person[105];
map<string,int>mp,mp1;
int cmp1(struct SCHOOL aaa,struct SCHOOL bbb)
{
    return aaa.mark<bbb.mark;
}
int cmp2(struct SCHOOL aaa,struct SCHOOL bbb)
{
    return aaa.scores>bbb.scores;
}
int cmp3(struct SCHOOL aaa,struct SCHOOL bbb)
{
    return aaa.score_man>bbb.score_man;
}
int cmp4(struct SCHOOL aaa,struct SCHOOL bbb)
{
    return aaa.score_woman>bbb.score_woman;
}
void Sum()
{
    for(int i=1; i<=n; i++)
    {
        school[i].scores=school[i].score_man+school[i].score_woman;
    }
}
void Input()
{
    int cnt=0,k,x,cnt1=0,k1;
    char testname[50];
    mp.clear();
    mp1.clear();
    for(int i=1; i<=w+m; i++)
    {
        printf("项目编号%d:%s:\n",test[i].mark,test[i].name);
        for(int j=1; j<=test[i].top_num; j++)
        {
            printf("    获得该项目第%d名的学校名:",j);
            scanf("%s",test[i].test_rank[j]);
            printf("    获奖人姓名:");
            scanf("%s",test[i].rank_name[j]);

            if(mp1[test[i].rank_name[j]]==0)//新人名
            {
                mp1[test[i].rank_name[j]]=++cnt1;
                k1=cnt1;
                strcpy(person[k1].name,test[i].rank_name[j]);
                strcpy(person[k1].school_name,test[i].test_rank[j]);
            }
            else
            {
                k1=mp1[test[i].rank_name[j]];
                if(strcmp(person[k1].school_name,test[i].rank_name[j]))//重名
                {
                    cnt1++;
                    int flag=0;
                    for(int ii=1; ii<cnt; ii++)//所有人
                    {
                        if(strcmp(person[ii].name,test[i].rank_name[j])==0&&strcmp(person[ii].school_name,test[i].test_rank[j])==0)
                        {
                            flag=1;
                            k1=mp1[test[i].rank_name[j]];
                            break;
                        }
                    }
                    if(flag==0)
                    {
                        cnt1++;
                        k1=cnt1;
                        strcpy(person[k1].name,test[i].rank_name[j]);
                        strcpy(person[k1].school_name,test[i].test_rank[j]);
                    }
                }
            }

            person[k1].rank_honor[i][j]=1;

            if(mp[test[i].test_rank[j]]==0)
            {
                mp[test[i].test_rank[j]]=++cnt;
                strcpy(school[cnt].name,test[i].test_rank[j]);
                school[cnt].mark=cnt;
                k=cnt;
            }
            else
                k=mp[test[i].test_rank[j]];
            school[k].rank_num[i][j]=1;

            if(i<=m)
                school[k].score_man+=mark[test[i].top_num][j];
            else
                school[k].score_woman+=mark[test[i].top_num][j];

        }
        printf("\n");
    }
    n=cnt;
    per_num=cnt1;
    Sum();
    return ;
}
void Init()
{
    for(int i=1; i<=n; i++)
    {
        printf("        学校编号%d : %s\n",school[i].mark,school[i].name);
    }
    printf("\n");
}
void Init1()
{
    for(int i=1; i<=m+w; i++)
    {
        printf("        项目编号%d : %s\n",test[i].mark,test[i].name);
    }
    printf("\n");
}
void Query(int option)
{
    while(1)
    {
        if(option==1)
        {
            Init1();
            sort(school+1,school+n+1,cmp1);
            while(1)
            {
                int x;
                printf("    请输入项目编号,结束请输入-1:");
                scanf("%d",&x);
                if(x==-1)
                    break;
                if(x>w+m)
                {
                    printf("        输入不合法,请重新输入\n");
                    continue;
                }
                printf("        %s:\n",test[x].name);
                for(int i=1; i<=test[x].top_num; i++)
                {
                    int sum=0;
                    printf("        第%d名: %10s ",i,test[x].test_rank[i]);//学校名
                    printf("    获奖人%s:   ",test[x].rank_name[i]);//获奖人
                    /*for(int j=1; j<=5; j++)
                    {
                        if(strcmp(test[x].test_rank[j],test[x].test_rank[i])==0)
                            sum+=mark[test[x].top_num][j];
                    }*/
                    printf(" 得分 : %d\n",mark[test[x].top_num][i]);
                }
            }
        }
        else if(option==2)
        {
            Init();
            while(1)
            {
                int x,sum,flag=0;
                printf("    请输入学校编号,结束输入-1\n");
                scanf("%d",&x);
                if(x==-1)
                    break;
                if(x>n)
                {
                    printf("    输入不合法,请重新输入\n");
                    continue;
                }
                printf("        %s  :\n",school[x].name);
                for(int j=1; j<=w+m; j++)//那个项目
                {
                    sum=0;
                    flag=0;
                    for(int k=1; k<=5; k++)//第几名
                    {

                        if(school[x].rank_num[j][k]==1)
                        {
                            flag=1;
                            printf("            %s第%d名",test[j].name,k);
                            printf("    获奖人:%s ",test[j].rank_name[k]);
                            sum+=mark[test[j].top_num][k];

                        }
                    }
                    if(flag==1)
                    {
                        printf("%18s: %d\n","总得分",sum);
                    }
                }
                printf("\n");
            }
        }
        else if(option==3)
        {
            char name[30],school_name[30];
            int flag=0,flag1=0;
            while(1)
            {
                flag=0,flag1=0;
                printf("    请输入人名和学校名(输入#退出)\n");
                printf("        人名:");
                scanf("%s",name);
                if(name[0]=='#')
                    break;
                printf("        学校名:");
                scanf("%s",school_name);//学校名

                for(int i=1; i<=per_num; i++)
                {
                    if(strcmp(person[i].name,name)==0&&strcmp(person[i].school_name,school_name)==0)
                    {
                        flag1=1;
                        printf("        %s:\n",person[i].name);
                        for(int k=1; k<=m+w; k++)
                        {
                            for(int j=1; j<=5; j++)
                            {
                                if(person[i].rank_honor[k][j]==1)
                                {
                                    printf("            %s第%d名\n",test[k].name,j);
                                    flag=1;
                                }
                            }
                        }
                    }
                    if(flag==1)
                        break;
                }
                if(flag1==0)
                    printf("    信息有误\n");
                else if(flag==0)
                    printf("        未取得佳绩\n");
                printf("\n");
            }
            printf("\n");
        }
        else if(option==-1)
        {
            break;
        }
        else
        {
            printf("输入不合法,请重新输入\n");
        }


        printf("    请选择查询方式,输入-1结束查询输\n");
        printf("        1.按项目编号查询取得前三或前五名的学校\n");
        printf("        2.查询某个学校的所有信息\n");
        printf("        3.按人名查询获奖信息\n");
        scanf("%d",&option);
    }
}
void Sort(int option)
{
    while(1)
    {
        if(option==1)
        {
            sort(school+1,school+n+1,cmp1);
            for(int i=1; i<=n; i++)
            {
                printf("        %d.%12s    总分: %2d    男团总分: %2d    女团总分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
            }
            printf("\n");
        }
        else if(option==2)
        {
            sort(school+1,school+n+1,cmp2);
            for(int i=1; i<=n; i++)
            {
                printf("        %d.%12s    总分: %2d    男团总分: %2d    女团总分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
            }
            printf("\n");
        }
        else if(option==3)
        {
            sort(school+1,school+n+1,cmp3);
            for(int i=1; i<=n; i++)
            {
                printf("        %d.%12s    总分: %2d    男团总分: %2d    女团总分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
            }
            printf("\n");
        }
        else if(option==4)
        {
            sort(school+1,school+n+1,cmp4);
            for(int i=1; i<=n; i++)
            {
                printf("        %d.%12s    总分: %2d    男团总分: %2d    女团总分: %2d\n",i,school[i].name,school[i].scores,school[i].score_man,school[i].score_woman);
            }
            printf("\n");
        }
        else if(option==-1)
        {
            break;
        }
        else
        {
            printf("输入不合法,请重新输入\n");
        }
        printf("    请选择查询方式,输入-1结束查询\n");
        printf("        1.按学校编号排序输出\n");
        printf("        2.按学校总分排序输出\n");
        printf("        3.按男团总分排序输出\n");
        printf("        4.按女团总分排序输出\n");
        scanf("%d",&option);
    }
    return ;
}
void Intxt()//学校,男子项目,女子项目
{
    FILE *fp;
    fp=fopen("text.txt","w");
    if(fp==NULL)
        printf("打开失败\n");
    fprintf(fp,"%-02d  %-02d  %-02d%158s\n",n,m,w," ");//
    fprintf(fp,"%-16s","比赛项目编号");//16
    fprintf(fp,"%-16s","比赛项目名称");//16
    fprintf(fp,"%-16s","比赛取前几名");//16
    for(int i=1; i<=5; i++)
    {
        fprintf(fp,"  第%d名     ",i);//12
        fprintf(fp,"%-12s","获奖人姓名");//12
    }
    fprintf(fp,"%c",'\n');//2
    for(int i=1; i<=m+w; i++)
    {
        fprintf(fp,"     %02d         ",test[i].mark);
        fprintf(fp,"   %-10s   ",test[i].name);
        fprintf(fp,"      %d         ",test[i].top_num);
        for(int j=1; j<=test[i].top_num; j++)
        {
            fprintf(fp,"  %-8s  ",test[i].test_rank[j]);
            fprintf(fp,"%-12s",test[i].rank_name[j]);//12
        }
        if(test[i].top_num==3)
        {
            for(int j=1; j<=2; j++)
            {
                fprintf(fp,"%24s"," ");
            }
        }
        fprintf(fp,"%c",'\n');
    }
    fprintf(fp,"获奖学校总共有%d个\n",n);
    fprintf(fp,"男子项目有%d个\n",m);
    fprintf(fp,"女子项目有%d个\n",w);
    fprintf(fp,"%s","****************************************************************************************************************\n");

    int flag=0;
    fprintf(fp,"                                       %s\n","各学校获奖情况");
    fprintf(fp,"%-16s","学校名称");
    fprintf(fp,"%-16s","学校编号");
    for(int i=1; i<=m+w; i++)
    {
        fprintf(fp,"%-16s",test[i].name);//项目名
    }
    fprintf(fp,"%-16s","总分");
    fprintf(fp,"%-16s","男团总分");
    fprintf(fp,"%-16s","女团总分");
    fprintf(fp,"%c",'\n');
    for(int i=1; i<=n; i++)//几个学校
    {
        fprintf(fp,"%-16s",school[i].name);//学校名
        fprintf(fp,"    %02d          ",school[i].mark);//学校编号
        for(int j=1; j<=w+m; j++)//那个项目
        {
            for(int k=1; k<=5; k++)//第几名
            {
                if(school[i].rank_num[j][k]==1)
                {
                    flag+=2;
                    fprintf(fp," %d",k);
                }
            }
            if(flag==0)
                fprintf(fp,"%-16s","未获得名次");
            else
            {
                for(int k=flag+1; k<=16; k++)
                    fprintf(fp,"%c",' ');
            }
            flag=0;
        }
        fprintf(fp,"%02d              ",school[i].scores);//总分
        fprintf(fp,"    %02d          ",school[i].score_man);//男团总分
        fprintf(fp,"    %02d          ",school[i].score_woman);//女团总分
        fprintf(fp,"%c",'\n');
    }
    fclose(fp);
}
void Outtxt()
{
    mp1.clear();
    char c,name[30];
    int flag=0,cnt=0,k,k1,cnt1=0;
    FILE *fp;
    fp=fopen("text.txt","r");
    if(fp==NULL)
        printf("打开失败\n");
    fscanf(fp,"%d%d%d",&n,&m,&w);
    printf("%d %d %d\n",m,n,w);
    for(int i=1; i<=m+w; i++) //第几个项目
    {
        fseek(fp,170*(i+1),0);
        fscanf(fp,"%d",&test[i].mark);//项目编号
        //printf(" %d  ",test[i].mark);
        fscanf(fp,"%s",test[i].name);//项目名
        //printf(" %s ",test[i].name);
        fscanf(fp,"%d",&test[i].top_num);//项目取前几名
        //printf(" %d ",test[i].top_num);
        flag=0;
        for(int j=1; j<=test[i].top_num; j++)//第几名
        {
            fscanf(fp,"%s",test[i].test_rank[j]);
            //   printf("获奖学校 %s ",test[i].test_rank[j]);
            fscanf(fp,"%s",test[i].rank_name[j]);
            //printf("获奖人 %s ",test[i].rank_name[j]);


            if(mp1[test[i].rank_name[j]]==0)//新人名
            {
                mp1[test[i].rank_name[j]]=++cnt1;
                k1=cnt1;
                strcpy(person[k1].name,test[i].rank_name[j]);
                strcpy(person[k1].school_name,test[i].test_rank[j]);
            }
            else
            {
                k1=mp1[test[i].rank_name[j]];
                if(strcmp(person[k1].school_name,test[i].rank_name[j]))//重名
                {
                    cnt1++;
                    int flag=0;
                    for(int ii=1; ii<cnt; ii++)
                    {
                        if(strcmp(person[ii].name,test[i].rank_name[j])==0&&strcmp(person[ii].school_name,test[i].test_rank[j])==0)
                        {
                            flag=1;
                            k1=mp1[test[i].rank_name[j]];

                            break;
                        }
                    }
                    if(flag==0)
                    {
                        cnt1++;
                        k1=cnt1;
                        strcpy(person[k1].name,test[i].rank_name[j]);
                            strcpy(person[k1].school_name,test[i].test_rank[j]);
                    }
                }
            }
            person[k1].rank_honor[i][j]=1;
            //printf("%s\n",test[i].test_rank[j]);

            if(mp[test[i].test_rank[j]]==0)
            {
                mp[test[i].test_rank[j]]=++cnt;
                strcpy(school[cnt].name,test[i].test_rank[j]);
                school[cnt].mark=cnt;
                k=cnt;
            }
            else
                k=mp[test[i].test_rank[j]];
            school[k].rank_num[i][j]=1;
            if(i<=m)
                school[k].score_man+=mark[test[i].top_num][j];
            else
                school[k].score_woman+=mark[test[i].top_num][j];
        }
        //printf("\n");
    }
    per_num=cnt1;
    Sum();
    fclose(fp);
}
void Output()
{
    printf("\n");
    for(int i=1; i<=n; i++)
    {
        printf("        %s:\n",school[i].name);
        for(int j=1; j<=w+m; j++)//那个项目
        {
            for(int k=1; k<=5; k++)//第几名
            {
                if(school[i].rank_num[j][k]==1)
                {
                    printf("            %s第%d名",test[j].name,k);
                    printf("    获奖人:%s\n",test[j].rank_name[k]);
                }
            }
        }
        printf("\n");
    }
}

void mulu()
{
    int flag=0,x;
    char name[20];
    mark[3][1]=5;
    mark[3][2]=3,mark[3][3]=2;
    mark[5][1]=7;
    mark[5][2]=5,mark[5][3]=3;
    mark[5][4]=2;
    mark[5][5]=1;
    printf("==============================运动会分数统计系统===========================\n");
    printf("                               1.输入信息\n");
    printf("                               2.查询系统\n");
    printf("                               3.排序输出\n");
    printf("                 4.统计输出(查看每个学校在各个项目中的获奖情况)\n");
    printf("                              5.写入文件保存\n");
    printf("                               6.读取文件\n");
    printf("                               7.退出程序\n");
    printf("==========================================================================\n");
    while(1)
    {
        printf("请输入操作数:");
        scanf("%d",&flag);
        if(flag==1)
        {
            printf("    请输入有几个男子项目:");
            scanf("%d",&m);
            for(int i=1; i<=m; i++)
            {
                printf("        请输入男子项目%d的名称:",i);
                scanf("%s",test[i].name);
                printf("        该项目取前几名(3/5):");
                scanf("%d",&test[i].top_num);
                test[i].mark=i;
                printf("\n");
            }

            printf("    请输入有几个女子项目:");
            scanf("%d",&w);
            for(int i=1; i<=w; i++)
            {
                printf("        请输入女子项目%d的名称:",i);
                scanf("%s",test[i+m].name);
                printf("        该项目取前几名(3/5):");
                scanf("%d",&test[i+m].top_num);
                test[i+m].mark=i+m;
                printf("\n");
            }
            Input();
        }
        else if(flag==2)
        {
            int option;
            printf("    请选择查询方式,输入-1结束查询输\n");
            printf("        1.按项目编号查询取得前三或前五名的学校\n");
            printf("        2.按学校编号查询某个学校的所有信息\n");
            printf("        3.按人名查询获奖信息\n");
            scanf("%d",&option);
            Query(option);
        }
        else if(flag==3)
        {
            int option;
            printf("    请选择查询方式,输入-1结束查询\n");
            printf("        1.按学校编号排序输出\n");
            printf("        2.按学校总分排序输出\n");
            printf("        3.按男团总分排序输出\n");
            printf("        4.按女团总分排序输出\n");
            scanf("%d",&option);
            Sort(option);
        }
        else if(flag==4)
        {
            Output();
        }
        else if(flag==5)
        {
            Intxt();
        }
        else if(flag==6)
        {
            Outtxt();
        }
        else if(flag==7)
        {
            printf("退出程序\n");
            break;
        }
        else
        {
            printf("输入不合法,请重新输入\n");
        }
        printf("==============================运动会分数统计系统===========================\n");
        printf("                               1.输入信息\n");
        printf("                               2.查询系统\n");
        printf("                               3.排序输出\n");
        printf("                 4.统计输出(查看每个学校在各个项目中的获奖情况)\n");
        printf("                              5.写入文件保存\n");
        printf("                               6.读取文件\n");
        printf("                               7.退出程序\n");
        printf("==========================================================================\n");
    }
}
int main()
{
    mulu();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章