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

img

运行截图:

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;
}



有意思的作业
用fopen打开文件,逐行读取。定义一个球员数据结构和结构数组。然后按规则计算效率,定义三个排序函数按指定项排序就可以了

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632