C 入门第 5 课 - 任务 14-6

标签 c

一个文本文件包含有关垒球队的信息。每行数据排列如下:

4 Jessie Joybat 5 2 1 1

第一项是玩家的编号,方便地在 0-18 范围内。第二项是玩家的名字,第三项是玩家的姓氏。每个名字都是一个单词。下一项是球员的正式击球时间,然后是击球次数、保送次数和跑垒次数 (RBI)。该文件可能包含不止一场比赛的数据,因此同一个玩家可能有不止一行数据,并且在这些行之间可能还有其他玩家的数据。编写一个程序,将数据存储到一个结构数组中。该结构应该有成员来表示名字和姓氏、击球数、安打数、保送数和打点数(上垒数),以及平均击球率(稍后计算)。您可以使用玩家编号作为数组索引。该程序应读取到文件末尾,并且应保留每个玩家的累计总数。

棒球统计世界是一个复杂的世界。例如,由于失误而走垒或上垒不算作击球,但可能会产生打点。但是这个程序所要做的就是读取和处理数据文件,如下所述,而不用担心数据的真实性。

程序进行的最简单的方法是将结构内容初始化为零,将文件数据读入临时变量,然后将它们添加到相应结构的内容中。程序读取完文件后,应计算每个玩家的安打率并将其存储在相应的结构成员中。安打率是通过将一名球员的累计安打数除以累计击球数来计算的;它应该是一个浮点计算。然后,该程序应显示每个球员的累积数据以及显示整个球队综合统计数据的一行。


team.txt(我正在使用的文本文件):

4 Jessie Joybat 5 2 1 1
4 Jessie Joybat 7 3 5 3
7 Jack Donner 6 3 1 2
11 Martin Garder 4 3 2 1
15 Jaime Curtis 7 4 1 2
2 Curtis Michel 3 2 2 3
9 Gillan Morthim 9 6 6 7
12 Brett Tyler 8 7 4 3
8 Hans Gunner 7 7 2 3
14 Jessie James 11 2 3 4 
12 Brett Tyler 4 3 1 3

由于我是 C 语言的初学者,要么我误解了最初要求的任务,要么它太复杂了(我相信是前者)。我迷路了,我想不出如何根据索引(球员编号)的标准填写每条数据,跟踪他是否有超过一场比赛,计算并获取平均击球率和然后打印。

我目前拥有的是:

#define LGT 30
struct profile {
     int pl_num;
     char name[LGT];
     char lname[LGT];
     int atbat[LGT/3];
     int hits[LGT/3];
     int walks[LGT/3];
     int runs[LGT/3];
     float batavg;
};

//It's wrong obviously but it's a starting point
int main(void)
{
    FILE *flx;
    int i,jc,flow=0;
    struct profile stat[LGT]={{0}};

    if((flx=fopen("team.txt","r"))==NULL) {
        fprintf(stderr,"Can't read file team!\n");
        exit(1);      
    }

    for( jc = 0; jc < 11;  jc++) {
        fscanf(flx,"%d",&i);
        stat[i].pl_num=i;

        fscanf(flx,"%s",&stat[i].name);
        fscanf(flx,"%s",&stat[i].lname);

        fscanf(flx,"%d",&stat[i].atbat[flow]);
        fscanf(flx,"%d",&stat[i].hits[flow]);
        fscanf(flx,"%d",&stat[i].walks[flow]);
        fscanf(flx,"%d",&stat[i].runs[flow]);
        flow++;
    }
}

最佳答案

建议 1:不要像 atbat[LGT/3] 那样声明数组。

建议 2:您可以一次读取整行,而不是多次 fscanf

建议 3:由于玩家数量有限且玩家编号具有良好的范围 (0-18),因此使用该玩家编号作为结构数组的索引是个好主意。

建议4:既然你需要每个玩家的累积数据(不需要存储他的历史积分),那么你不需要整数数组,只需要一个整数来表示总数。

所以:

#include <stdio.h>

#define PLAYERS_NO  19

typedef struct  
{
     char name[20+1];
     char lastName[25+1];
     int atbat;
     int hits;
     int walks;
     int runs;
     float batavg;
} Profile;



int main(int argc, char** argv)
{
    Profile stats[PLAYERS_NO];
    int i;
    FILE* dataFile;

    int playerNo;
    Profile tmpProfile;
    int games = 0;


    for(i=0; i<PLAYERS_NO; ++i)
    {
        stats[i].name[0] = '\0';
        stats[i].lastName[0] = '\0';
        stats[i].atbat = 0;
        stats[i].hits = 0;
        stats[i].walks = 0;
        stats[i].runs = 0;
    }

    dataFile = fopen("team.txt", "r");
    if ( dataFile == NULL )
    {
        fprintf(stderr, "Can't read file team!\n");
        exit(1);    
     }

     for(i=0; i<PLAYERS_NO && !feof(dataFile); ++i, ++games)
     {
        fscanf(dataFile, "%d", &playerNo);
        if ( playerNo <0 || playerNo > PLAYERS_NO )
        {
           fprintf(stderr, "Player number out of range\n");
           continue;
        }

        fscanf(dataFile, "%s %s %d %d %d %d", 
            &tmpProfile.name,
            &tmpProfile.lastName,
            &tmpProfile.atbat,
            &tmpProfile.hits,
            &tmpProfile.walks,
            &tmpProfile.runs);

        printf("READ: %d %s %s %d %d %d %d\n", 
            playerNo,
            tmpProfile.name,
            tmpProfile.lastName,
            tmpProfile.atbat,
            tmpProfile.hits,
            tmpProfile.walks,
            tmpProfile.runs);


        strcpy(stats[playerNo].name, tmpProfile.name);
        strcpy(stats[playerNo].lastName, tmpProfile.lastName);

        stats[playerNo].atbat += tmpProfile.atbat;
        stats[playerNo].hits += tmpProfile.hits;
        stats[playerNo].walks += tmpProfile.walks;
        stats[playerNo].runs += tmpProfile.runs;
    }

    /* exercise: compute the average */
    fclose(dataFile);

    for(i=0; i<PLAYERS_NO; ++i)
    {
        if ( stats[i].name[0] == '\0' )
            continue;

        printf("%d %s %s %d %d %d %d\n",
            i,
            stats[i].name,
            stats[i].lastName,
            stats[i].atbat,
            stats[i].hits,
            stats[i].walks,
            stats[i].runs);
    }

    return 0;
}

关于C 入门第 5 课 - 任务 14-6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618811/

相关文章:

c - 在 C 中打印和填充二维数组

完成我的 addarray () 公式

c - 如何在 2 个 .c 文件之间共享一个变量?

C 内存分配影响 char 数组长度

c - reshape() 函数在 glut 中有什么用?

c++ - 从 utf 8 混合中分离繁体中文字符

c - 二进制搜索树 malloc 没有为后续节点提供足够的内存

调用函数

c - 调试器显示错误的指针值

c - 将一个链表指向另一个链表