數據結構(運動會分數統計)

任務:參加運動會有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章