运动会分数统计(C语言)含注释

问题描述

参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。

基本要求

产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。

测试数据

对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。

实现提示

可以假设n<=20,m<=30,w<=20,姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。

选作内容

允许用户指定某项目采取其他名次取法。

运动会分数统计系统菜单如下图:

Tips:

  1. 输入n m w,作为学校个数、男子/女子项目个数,随后输入各学校名称,再按顺序输入项目名称、运动员姓名、校名和成绩。

  1. 能够支持使用文件输入代替手动,方便测试

  1. 能够在一定范围内进行记录各学校所有学生成绩,尽管学生的得分为0,但能够记录输出他的成绩。

  1. 目标文件名称:sport.txt (建议先用文件读取,防止程序崩溃而重新输入数据)

一些个人感想:

个人认为这道题目还是挺简单的,只是在数据以何种形式进行输入上思考了良久,原想通过按学校进行分类统计,但操作和数据存放上有许多问题,于是还是按照题目要求按名次顺序输入,结局数据储存问题,再以遍历输出。

完整代码如下:

#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
using namespace std;

#define max 41

typedef struct 
{
    char name[10];//记录得奖人姓名
    char school[max]; //记录得奖人学校号
    int score;    //记录得奖人的成绩
    int mark;      //得分
    int ranking;    //排名
}DataType;

typedef struct 
{
    char item[max];    //项目编号(名称)
    int id,type;          //编号、类型符   
    int sex;           //加一个标识表示男,女
    int length;            //参加人数
    DataType data[max];  //记录前几名的信息
    char name[max];    //记录项目名称
}Project;              //记录项目的信息   

int n,m,w;//参数
char school[max][max];//各个学校名称
Project project[max];//记录各个项目数据

//产生各学校的成绩单并输出(输入参数为学校编号-无)
void makeGrade();
//产生团体总分报表(输入参数为学校个数-无)
void makeReport();
//公用的等待函数
void wait();
//数据输入
void input();
//根据排名返回得分
int Score(int type,int ranking);
//
void txtRead();


int main()
{
    char choice;
    while (1)
    {
        system("cls");
        cout << "\n\n\n\n"; 
        cout << "\t\t               运动会统计              \n";
        cout << "\t\t=========================================";
        cout << "\n\n";
        cout << "\t\t         1:手动输入信息               \n";     
        cout << "\t\t         2:文件读入信息(sprot.txt)           \n";     
        cout << "\t\t         3:产生各学校的成绩单     \n";    
        cout << "\t\t         4:产生团体总分报表       \n";
        cout << "\t\t         0:退出                   \n";

        cout << "\n";
        cout << "\t\t请选择:" << flush;
        choice = getch();
        system("cls");
        switch(choice)
        {
            case '1':
                input();
                wait();
                break;
            case '2':
                txtRead();
                wait();
                break;
            case '3':
                makeGrade();
                wait();
                break;
            case '4':
                makeReport();
                wait();
                break;
            case '0':
                exit(0);
        }
    }
    return 0;
}

//公用的等待函数
void wait()
{
    cout << "\n\n请按任意键继续" << flush;
    getch();
}

//数据输入
void input()
{
    int i,j,k,score;
    cout<<"请输入参与学校数目n、男子项目数量m、女子项目数量w:";
    scanf("%d %d %d",&n,&m,&w);

    cout<<"请按顺序输入学校名称"<<endl;
    for(i=1;i<=n;i++)
    {
        cout<<"请输入第"<<i<<"个学校名称:";
        cin>>school[i];
    }
    cout<<"男:"<<endl;
    for(j=1;j<=m;j++)
    {
        cout<<"第"<<j<<"个项目(默认编号奇数-前三 偶数-前五) 请输入名称/编号:";
        cin>>project[j].name;
        project->id=j;
        cout<<"按名次顺序输入运动员姓名、学校名和成绩(结束输入:0 0 0)"<<endl;
        if(j%2==0)
            project[j].type=5;
        else 
            project[j].type=3;
        k=0;
        do
        {
            k++;
            cout<<"第"<<k<<"名:";
            project[j].data[k].ranking=k;
            cin>>project[j].data[k].name>>project[j].data[k].school>>project[j].data[k].score;
            project[j].data[k].mark=Score(project[j].type,project[j].data[k].ranking);
        }
        while(strcmp(project[j].data[k].name,"0")!=0);
        project[j].length=k-1;
    }
    cout<<"女:"<<endl;
    for(j=m+1;j<=m+w;j++)
    {
        cout<<"第"<<j<<"个项目(默认编号奇数-前三 偶数-前五) 请输入名称/编号:";
        cin>>project[j].name;
        project->id=j;
        cout<<"按名次顺序输入运动员姓名、学校名和成绩(结束输入:0 0 0)"<<endl;
        if(j%2==0)
            project[j].type=5;
        else 
            project[j].type=3;
        k=0;
        do
        {
            k++;
            cout<<"第"<<k<<"名:";
            project[j].data[k].ranking=k;
            cin>>project[j].data[k].name>>project[j].data[k].school>>project[j].data[k].score;
            project[j].data[k].mark=Score(project[j].type,project[j].data[k].ranking);
        }
        while(strcmp(project[j].data[k].name,"0")!=0);
        project[j].length=k-1;
    }
}

//产生各学校的成绩单并输出(输入参数为学校编号-无)
void makeGrade()
{
    int i,j,k,score,flag;
    for(i=1;i<=n;i++)
    {
        printf("\n\t\t\t%-20s \n\t男子项目\n",school[i]);
        for(j=1;j<=m;j++)
        {
            printf("项目\t       \t姓名           成绩\t排名\t得分\n");
            for(k=1;k<=project[j].length;k++)
            {
                if(strcmp(project[j].data[k].school,school[i])==0)
                    printf("%-16s%-15s%-9d%-8d%-12d\n",project[j].name,project[j].data[k].name,project[j].data[k].score,project[j].data[k].ranking,project[j].data[k].mark);
            }
        }
        printf("\n\t女子项目\n");
        for(j=m+1;j<=m+w;j++)
        {
            printf("项目\t       \t姓名           成绩\t排名\t得分\n");
            for(k=1;k<=project[j].length;k++)
            {
                if(strcmp(project[j].data[k].school,school[i])==0)
                    printf("%-16s%-15s%-9d%-8d%-12d\n",project[j].name,project[j].data[k].name,project[j].data[k].score,project[j].data[k].ranking,project[j].data[k].mark);
            }
        }
    }
    
}

//产生团体总分报表(输入参数为学校个数-无)
void makeReport()
{
    int score,total=0,score_m=0,score_w=0,i,j,k;
    printf("\t\t\t团队得分\n学校\t\t男生得分\t女生得分\t总分\n");
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            for(k=1;k<=project[j].length;k++)
            if(strcmp(project[j].data[k].school,school[i])==0)
                score_m+=project[j].data[k].mark;
        }
        for(j=m+1;j<=m+w;j++)
        {
            for(k=1;k<=project[j].length;k++)
            if(strcmp(project[j].data[k].school,school[i])==0)
                score_w+=project[j].data[k].mark;
        }
        total=score_m+score_w;
        printf("%-16s%-16d%-16d%-16d\n",school[i],score_m,score_w,total);
        total=score_m=score_w=0;
    }
}

void txtRead()
{
    FILE *fp=NULL;
    fp=fopen("sport.txt", "r");
    int i,j,k,score;
    fscanf(fp,"%d %d %d\n",&n,&m,&w);
    printf("n:%d m:%d w:%d\n",n,m,w);
    for(i=1;i<=n;i++)
        fscanf(fp,"%s",school[i]);
    fscanf(fp,"\n");
    for(j=1;j<=m;j++)
    {
        fscanf(fp,"%s\n",project[j].name);
        printf("%s(男)\n",project[j].name);
        project->id=j;
        if(j%2==0)
            project[j].type=5;
        else 
            project[j].type=3;
        k=0;
        do
        {
            k++;
            project[j].data[k].ranking=k;
            fscanf(fp,"%s %s %d\n",project[j].data[k].name,project[j].data[k].school,&project[j].data[k].score);
            printf("第%d名:%s %s %d\n",k,project[j].data[k].name,project[j].data[k].school,project[j].data[k].score);
            project[j].data[k].mark=Score(project[j].type,project[j].data[k].ranking);
        }
        while(strcmp(project[j].data[k].name,"0")!=0);
        project[j].length=k-1;
    }
    for(j=m+1;j<=m+w;j++)
    {
        fscanf(fp,"%s\n",project[j].name);
        printf("%s(女)\n",project[j].name);
        project->id=j;
        if(j%2==0)
            project[j].type=5;
        else 
            project[j].type=3;
        k=0;
        do
        {
            k++;
            project[j].data[k].ranking=k;
            fscanf(fp,"%s %s %d\n",project[j].data[k].name,project[j].data[k].school,&project[j].data[k].score);
            printf("第%d名:%s %s %d\n",k,project[j].data[k].name,project[j].data[k].school,project[j].data[k].score);
            project[j].data[k].mark=Score(project[j].type,project[j].data[k].ranking);
        }
        while(strcmp(project[j].data[k].name,"0")!=0);
        project[j].length=k-1;
    }
    fclose(fp);
    printf("\n读取成功!\n");
}
//根据排名返回得分
int Score(int type,int ranking)
{
    if(type==3)
    {
        switch(ranking)
        {
            case 1:
                return 5;
            case 2:
                return 3;
            case 3:
                return 2;
            default:
                return 0;
        }
    }
    else
    {
        switch(ranking)
        {
        case 1:
            return 7;
        case 2:
            return 5;
        case 3:
            return 3;
        case 4:
            return 2;
        case 5:
            return 1;
        default:
            return 0;
            break;
        }
    }
    return 0;
}
  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
1、问题描述:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 2、功能要求: (1) 可以输入各个项目的前三名或前五名的成绩; (2) 能统计各学校总分, (3) 可以按学校编号或名称、学校总分、男女团体总分排序输出; (4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 (5) 数据存入文件并能随时查询 (6) 规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称 3、输出形式:有中文提示,各学校分数为整形 4、界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 5、存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 6、测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值