ssbdhidkdns 2022-03-08 01:15 采纳率: 50%
浏览 372
已结题

c语言该如何编码NBA球队数据统计!

img

  • 写回答

3条回答 默认 最新

  • 关注

    运行截图:

    img

    数据文件(data.txt):

    Thunder 109:113 Rocket
    Westbrook,38,21,9,9,4
    Geogre,38,28,14,2,4
    Test1,40,22,1,2,1
    Test2,30,10,2,3,3
    
    

    代码:

    #include <stdio.h>
    //定义球员信息结构体
    typedef struct _stdata
    {
        char name[30];
        int time; //上场时间
        int score;//得分
        int panc; //篮板
        int ass;  //助攻
        int qd;   //抢断
        float eff;//效率
    }StData;
    
    //定义球队得分结构体,保存文件的第一行数据
    typedef struct _stTotaldata
    {
        char name[30]; //球队名称
        int score;//得分
    }StTotalData;
    
    //解析第一行数据
    void ParseFirstLine(char* buf,StTotalData total[])
    {
        int i=0,j=0;
        //读取第一家球队名称
        //过滤空格
        while(buf[i]==' ')
            i++;
        while(buf[i]<'0' || buf[i]>'9')//非数字字符
        {
            total[0].name[j] = buf[i];
            j++;
            i++;
        }
        total[0].name[j] = 0;
        //删除末尾的空格或制表符
        j--;
        while(j>=0)
        {
            if(total[0].name[j]==' '||total[0].name[j]=='\t')
            {
                total[0].name[j] = 0;
                j--;
            }
            else
                break;
        }
        //读取分数
        total[0].score = 0;
        while(buf[i]>='0'&&buf[i]<='9')
        {
            total[0].score = total[0].score*10+buf[i]-'0';
            i++;
        }
        //过滤第二只球队分数前的内容
        while(buf[i]<'0' || buf[i]>'9')
            i++;
        //读取第二只球队的分数
        total[1].score = 0;
        while(buf[i]>='0'&&buf[i]<='9')
        {
            total[1].score = total[1].score*10+buf[i]-'0';
            i++;
        }
        //过滤第二只球队的名称前面的字符
        while(buf[i]==' ' || buf[i]=='\t')
            i++;
        //读取第二只球队的名称
        j=0;
        while(buf[i]!='\0')
        {
            total[1].name[j] = buf[i];
            j++;
            i++;
        }
        total[1].name[j]= 0;
        //删除末尾多余的空格或者\t
        j--;
        while(j>=0)
        {
            if(total[1].name[j]==' ' || total[1].name[j]=='\t')
            {
                total[1].name[j] = 0;
                j--;
            }else
                break;
        }
    }
    //读取数据
    void readFile(const char* filename,StTotalData total[],StData data[],int* nmb)
    {
        int i=0,res=0,j;
        char buf[100],ch;
        FILE* fp = fopen(filename,"r");
        if(fp==0)
        {
            printf("文件打开错误\n");
            return ;
        }
        //读取文件
        fgets(buf,100,fp); //读取第一行
        ParseFirstLine(buf,total);
        //读取球员数据,数据之间用英文逗号分隔
        while(!feof(fp))
        {
            //读取名字
            j=0;
            //过滤回车符
            while (!feof(fp))
            {
                ch = fgetc(fp);
                if(ch =='\n' || ch=='\r')
                    continue;
                else
                    break;
            }
            data[i].name[j]=ch;
            j++;
            while( (!feof(fp)) && (data[i].name[j]=fgetc(fp)) != ',')
                j++;
            data[i].name[j]=0;
            if(feof(fp)) break;
            //读取整数
            res = fscanf(fp,"%d,%d,%d,%d,%d",&data[i].time,
                &data[i].score,&data[i].panc,&data[i].ass,&data[i].qd);
            
            if(res && data[i].score > 0)
            {
                //计算球员的效率
                data[i].eff = 1.0*(data[i].score + data[i].panc*2 + data[i].ass*2+data[i].qd*5)/data[i].time;
                i++;
            }
        }
        fclose(fp);
        *nmb = i;
    }
    
    
    
    //得分榜
    void ScoreRank(StData data[],int nmb)
    {
        StData t;
        int i,j;
        for (i=0;i<nmb-1;i++)
        {
            for (j=0;j<nmb-i-1;j++)
            {
                if(data[j].score < data[j+1].score)
                {
                    t = data[j];
                    data[j] = data[j+1];
                    data[j+1] = t;
                }
            }
        }
        //输出
        printf("得分榜:\n");
        for (i=0;i<nmb;i++)
        {
            printf("%s  %d\n",data[i].name,data[i].score);
        }
    }
    
    //助攻榜
    void AssRank(StData data[],int nmb)
    {
        StData t;
        int i,j;
        for (i=0;i<nmb-1;i++)
        {
            for (j=0;j<nmb-i-1;j++)
            {
                if(data[j].ass < data[j+1].ass)
                {
                    t = data[j];
                    data[j] = data[j+1];
                    data[j+1] = t;
                }
            }
        }
        //输出
        printf("助攻榜:\n");
        for (i=0;i<nmb;i++)
        {
            printf("%s  %d\n",data[i].name,data[i].ass);
        }
    }
    //抢断榜单
    void QdRank(StData data[],int nmb)
    {
        StData t;
        int i,j;
        for (i=0;i<nmb-1;i++)
        {
            for (j=0;j<nmb-i-1;j++)
            {
                if(data[j].qd < data[j+1].qd)
                {
                    t = data[j];
                    data[j] = data[j+1];
                    data[j+1] = t;
                }
            }
        }
        //输出
        printf("抢断榜:\n");
        for (i=0;i<nmb;i++)
        {
            printf("%s  %d\n",data[i].name,data[i].qd);
        }
    }
    //查看球员效率
    void ShowEff(StData data[],int nmb)
    {
        int i=0;
        printf("球员效率:\n");
        for (;i<nmb;i++)
        {
            printf("%s  %.2f\n",data[i].name,data[i].eff);
        }
    }
    
    int main()
    {
        char* filename="data.txt";
        StTotalData total[2];
        StData data[100];
        int nmb=0,op;
        //从文件中读取数据
        readFile(filename,total,data,&nmb);
        //
        while(1)
        {
            printf("1.查看得分榜\n");
            printf("2.查看助攻榜\n");
            printf("3.查看抢断榜\n");
            printf("4.查看球员效率\n");
            printf("5.退出\n");
            printf("请选择:");
            scanf("%d",&op);
            switch(op)
            {
            case 1:
                ScoreRank(data,nmb); break;
            case 2:
                AssRank(data,nmb); break;
            case 3:
                QdRank(data,nmb); break;
            case 4:
                ShowEff(data,nmb); break;
            case 5:
                return 0;
            }
        }
        return 0;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 创建了问题 3月8日

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题