文本文件保存垒球队的信息每条线的数据排列如下:
4杰西·乔巴特5 2 1 1
第一项是玩家的号码,方便地在0-18之间第二项是玩家的名字,第三项是玩家的姓氏每个名字都是一个单词下一项是球员的正式击球时间,然后是击球次数、步行次数和跑步次数(RBI)该文件可能包含多个游戏的数据,因此同一个玩家可能有多行数据,这些行之间可能有其他玩家的数据编写一个程序,将数据存储到一个结构数组中这个结构应该有代表名字和姓氏的成员,at bat,hits,walks,和RBIs(击球得分)和击球平均值(稍后计算)您可以使用玩家号作为数组索引程序应该读取到文件的末尾,并且应该保留每个玩家的累计总数。
棒球统计的世界是一个复杂的世界例如,基于错误的步行或到达基地不算作击球,但可能会产生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:你可以在一次拍摄中读出整行,而不是多行。
建议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;
}