运动会分数统计问题

@史上最全的运动会分析问题TOC
一、需求分析
1:各项目结束时,输入前三名或前五名的项目编号、运动员姓名、校名和名次(成绩);
2:产生各学校的成绩单,内容包括每个学校所取得的每项成绩的项目号、名次(成绩)、姓名和得分,并统计各学校总分;
3:可以按学校编号、男女团体总分排序输出;
4:可以按学校编号查询学校某个项目的情况;
5:可以按项目编号查询取得前三或前五名的学校。
二、概要设计
1.文字分析:
此课设要求输入信息,统计分数,并且可以执行查找排序功能。由于各个要求属性有一定的联系,所以采用结构体数组来存储信息数据。根据需求分析制作一个菜单,输入不同的数字实现不同的功能,从而实现课设题目需求。
2.流程图设计:
流程图

三、详细设计
1.结构体定义:
(1)存放项目信息的结构体

struct Project
{
    	char name[20];//项目名称
    	int b_num;//项目编号
   	 	char sname[20]; //前三名或者前五名学生名字
    	char xname[20];//前三名或者前五名学校名字
} p[100][100];

(2)存放学校信息的结构体

struct School
{
    char name[10];//学校名称
    int s_num;//学校编号
    int TotalScore; //学校总分
    int MaleTotal; //男子总分
    int FemaleTotal; //女子总分
} Sch[100];  

2.函数的定义:
(1)输入函数:用于输入题目要求的信息

void input()  //输入前三或前五成绩
{
    int i,j,q; //定义几个int类型变量
    printf("输入学校数目:");
    scanf("%d",&n);
    //用for循环输入学校的名字和编号
    for(i=1; i<=n; i++)
    {
        printf("输入第%d个学校的名称:",i);
        //cin>>sch[i].name;
        scanf("%s",&Sch[i].name);
        //把学校总分和男女总分初值赋为0
        Sch[i].TotalScore=0;
        Sch[i].FemaleTotal=0;
        Sch[i].MaleTotal=0;
        printf("输入第%d个学校的编号:",i);
        scanf("%d",&Sch[i].s_num);
    }
    printf("输入男子项目数m和女子项目数w:");
    scanf("%d%d",&m,&w);
    for(i=1; i<=m+w; i++)
    {

        if(i%2!=0)//项目编号为奇数,取前五名
        {
            printf("输入第%d个项目的名称:",i);
            scanf("%s",&p[i][0].name);
            printf("输入第%d个项目的编号:",i);
            scanf("%d",&p[i][0].b_num);
            for(j=1;j<=5;j++){
            printf("输入第%d个项目第%d名的姓名:",i,j);
            scanf("%s",&p[i][j].sname);
            printf("输入第%d个项目第%d名的学校名:",i,j);
            scanf("%s",&p[i][j].xname);
            for(q=1;q<=n;q++){
           if(strcmp(p[i][j].xname,Sch[Sch[q].s_num].name)==0){
           // if(p[i][j].xname==Sch[i].name){
                Sch[Sch[q].s_num].TotalScore+=qianwu[j-1];
//计算总分,下一步进行判断是计算男子总分还是女子
            if(i<=m){
                Sch[Sch[q].s_num].MaleTotal+=qianwu[j-1];
            }else{
                Sch[Sch[q].s_num].FemaleTotal+=qianwu[j-1];
            }
           }
          }
         }
        }
        else//项目编号为偶数,取前三名
        {
            printf("输入第%d个项目的名称:",i);
            scanf("%s",&p[i][0].name);
            printf("输入第%d个项目的编号:",i);
            scanf("%d",&p[i][0].b_num);
            for(j=1; j<=3; j++)
            {
            printf("输入第%d个项目第%d名的姓名:",i,j);
            scanf("%s",&p[i][j].sname);
            printf("输入第%d个项目第%d名的学校名:",i,j);
            scanf("%s",&p[i][j].xname);
            for(q=0;q<=n;q++){
            if(strcmp(p[i][j].xname,Sch[Sch[q].s_num].name)==0){
                Sch[Sch[q].s_num].TotalScore+=qiansan[j-1];
//计算总分,下一步进行判断是计算男子总分还是女子
            if(i>m){
                Sch[Sch[q].s_num].FemaleTotal+=qiansan[j-1];
            }else{
                Sch[Sch[q].s_num].MaleTotal+=qiansan[j-1];
            }
           }
          	}
          }
        }
    }
}

(2)输出函数:用于输出排序后的信息

void print(int i)
{
    printf("学校编号:%d 学校名称:%s 学校总分:%d 男子团体总分:%d 女子团体总分:%d\n",Sch[i].s_num,Sch[i].name,Sch[i].TotalScore,Sch[i].MaleTotal,Sch[i].FemaleTotal);
}

(3)按编号排序函数

void Number() //按编号排序
{
    int i,j;
    School t; //定义一个school对象t
  //运用冒泡排序按编号进行排序  
    for(i=1; i<n; i++)
    {
        for(j=i; j<=n; j++)
            //如果i的编号大于j的编号,则用t进行交换
            if(Sch[i].s_num>Sch[j].s_num)
            {
                t=Sch[i];
                Sch[i]=Sch[j];
                Sch[j]=t;
            }
    }
    printf("按编号排列:\n");
    //用for循环调用print函数
    for(i=1; i<=n; i++)
        print(i);

}

(4)按学校总分排序函数

void SchoolTotal() //按学校总分排序
{
    int i,j;
    School t;//定义一个School对象t
    //冒泡排序进行排序
    for(i=1; i<n; i++)
    {
        for(j=i; j<=n; j++)
            if(Sch[i].TotalScore<Sch[j].TotalScore)
                //如果i的学校总分小于j的,则通过t进行交换
            {
                t=Sch[i];
                Sch[i]=Sch[j];
                Sch[j]=t;
            }
    }
    printf("按学校总分排列:\n");
    //用for循环调用print函数 
    for(i=1; i<=n; i++)
        print(i);
}

(5)按学校男总分排序函数

void mTotal() //按学校男总分排序
{
    int i,j;
    School t;//定义一个School对象t
    //运用冒泡排序按编号进行排序
    for(i=1; i<n; i++)
    {
        for(j=i; j<=n; j++)
            //如果i的学校男总分小于j的,则通过t进行交换
            if(Sch[i].MaleTotal<Sch[j].MaleTotal)
            {
                t=Sch[i];
                Sch[i]=Sch[j];
                Sch[j]=t;
            }
    }

    printf("按学校男子总分排列:\n");
    //用for循环调用print函数
    for(i=1; i<=n; i++)
        print(i);
}

(6)按学校女总分排序函数

void fTotal() //按学校女总分排序
{
    int i,j;
    School t;//定义一个School对象t
     //运用冒泡排序按编号进行排序
    for(i=1; i<n; i++)
    {
        for(j=i; j<=n; j++)
            //如果i的学校女总分小于j的,则通过t进行交换
            if(Sch[i].FemaleTotal<Sch[j].FemaleTotal)
            {
                t=Sch[i];
                Sch[i]=Sch[j];
                Sch[j]=t;
            }
    }
    printf("按学校女子总分排列:\n");
       //用for循环调用print函数
    for(i=1; i<=n; i++)
        print(i);
        printf("\n");

}

(7)查询项目函数

void FindProject() //查询项目信息
{
    int i,s,j=0;
    printf("输入需要查询的项目编号:");
    scanf("%d",&s);
    for(i=1; i<=m+w; i++){
        //当输入的项目编号等于p[i][0]
        if(p[i][0].b_num==s){
            printf("%s前五名学校编号及名称为:\n",p[i][0].name);
                    for(j=1;j<=5;j++){
                         printf("名次%d 学校名称%s\n",j,p[i][j].xname);
            }
        }
    }
}

(8)产生成绩单函数:

//产生各个学校的成绩单
void ShowGrade()
{
    int i,j,k;//定义变量
    //运用for循环,输出学校信息和总分信息
    for(i=1;i<=n;i++){
            printf("学校编号:%d 学校名称:%s 学校总分:%d 男子团体总分:%d 女子团体总分:%d\n",Sch[i].s_num,Sch[i].name,Sch[i].TotalScore,Sch[i].MaleTotal,Sch[i].FemaleTotal);
            for(j=1;j<=m+w;j++){
                    //奇数为前五名,k<=5
                    if(j%2!=0){
                     for(k=1;k<=5;k++){
                    //学校名字和项目里的学校名字相等时输出具体的成绩
                    if(strcmp(Sch[i].name,p[j][k].xname)==0){
                        printf("学校名%s 项目号%d 名次%d 姓名%s 得分%d\n",Sch[i].name,p[j][0].b_num,k,p[j][k].sname,qianwu[k-1]);
                    }
                }
           }
           else{
            //偶数为前五名,k<=3
            for(k=1;k<=3;k++){
                    //学校名字和项目里的学校名字相等时输出具体的成绩
                    if(strcmp(Sch[i].name,p[j][k].xname)==0){
                        printf("学校名%s 项目号%d 名次%d 姓名%s 得分%d\n",Sch[i].name,p[j][0].b_num,k,p[j][k].sname,qiansan[k-1]);
                    }
                }
           }
            }
    }
}

(9)菜单函数:

void menue() //菜单函数
{
    int z;
    while(1)
    {
        printf("\t选择您需要的操作(选择序号):");
        printf("\n\t\t1.按学校编号排序输出");
        printf("\n\t\t2.按学校总分排序输出");
        printf("\n\t\t3.按学校男总分排序输出");
        printf("\n\t\t4.按学校女总分排序输出");
        printf("\n\t\t5.查询某个学校某个项目成绩");
        printf("\n\t\t6.查询某个项目前三或者前五成绩");
        printf("\n\t\t7.产生各个学校的成绩单");
        printf("\n\t\t8.退出\n");
        scanf("%d",&z);
        //switch,case进行选择
        switch(z)
        {

        case 1:
            Number();
            break;
        case 2:
            SchoolTotal();
            break;
        case 3:
            mTotal();
            break;
        case 4:
            fTotal();
            break;
        case 5:
            FindSchool();
            break;
        case 6:
            FindProject();
            break;
        case 7:
            ShowGrade();
            break;
        case 8:
            end();
            break;
        }
    }
}
  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
[问题描述] 参加运动会有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)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称) 输出形式:有中文提示,各学校分数为整形   界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值