首页 > 试题广场 >

一个文本文件中存放着一个棒球队的信息。每一行的数据都是这样排

[问答题]

一个文本文件中存放着一个棒球队的信息。每一行的数据都是这样排列的:

4 Jessie Joybat 5 2 1 1

第一项是球员号码,为了方便,范围是0到18。第二项是球员的名,第三项是姓。姓和名都是单个的单词。下一项是官方统计的球员上场次数,紧跟着是击中数、走垒数和跑点数( RBI)。文件可能包括超过一场比赛的数据,因此同一个球员可能会有多于一行的数据,而且在不同的行之间有可能有别的球员的数据。写一个程序,把这些数据存储到一个结构数组中。结构中必须含有姓、名、上场次数、击中数、走垒数和跑点数,以及击球平均成功率(稍后计算)。可以使用球员号码作为数组索引。程序应该读到文件末尾,并且应该保存每个球员的累计总和。

这个棒球运动中的统计方法是相关的。例如,一次走垒和触垒中的失误并不会记作上场次数,但是这可能产生一个RBI。可是,该程序所要做的只是处理数据文件,而不必关心数据的实际含义。

要实现这些功能,最简单的方法是把结构的内容初始化为零值,将文件数据读入临时变量中,然后把它们加到相应结构的内容中。程序读完文件后,应该计算每个球员的击球平均成功率,并把它保存到相应的结构成员里。计算击球平均成功率是用球员的累计击中数除以上场累计次数;这是个浮点数计算。然后程序要显示每个球员的累计数据,并且对整个时期显示一行综合统计数据。

推荐
//中文版的此题最后一句说“并且对整个时期显示一行综合统计数据”
//从英文原版来看,“时期”应为“队伍”(team)
#include <stdio.h>
#include <string.h>
#define MAX 10
void clear(struct member *p);
void get_info(struct member *p);
void cal_average(struct member *p);
void display(struct member *p);
struct member {
 char firstname[10];
 char lastname[10];
 int bat;
 int hit;
 int walk;
 int RBI;
 float average;
};
int main()
{
 struct member members[MAX];
 clear(members);
 get_info(members);
 cal_average(members);//计算平均值
 display(members);
 return 0;
}
void clear(struct member *p)
{
 int i;
 for(i=0; i<MAX; i++)
 {
 strcpy(p[i].firstname, "");
 strcpy(p[i].lastname, "");
 p[i].bat = 0;
 p[i].hit = 0;
 p[i].walk = 0;
 p[i].RBI = 0;
 p[i].average = 0;
 }
}
void get_info(struct member *p)
{ 
 int number,bat,hit,walk,RBI;
 char firstname[20],lastname[20],filename[20]="c:\\info.txt";
 FILE *fp;
 printf("input the file name:");
 scanf("%s",filename);
 while ( (fp = fopen(filename,"r")) == NULL )
 {
 printf("Cannot open filename. input again:");
 scanf("%s",filename);
 }
 while ( fscanf(fp, "%d %s %s %d %d %d %d\n",&number, firstname, lastname, &bat, &hit, &walk, &RBI) == 7 )
 {
 strcpy(p[number].firstname, firstname);
 strcpy(p[number].lastname, lastname);
 p[number].bat += bat;
 p[number].hit += hit;
 p[number].walk += walk;
 p[number].RBI += RBI;
 }
 fclose(fp);
}
void cal_average(struct member *p)
{
 int i;
 for(i=0; i<MAX; i++)
 if( p[i].bat )
 p[i].average = (float)p[i].hit / (float)p[i].bat ;
}
void display(struct member *p)
{
 int i;
 struct member total={"", "", 0, 0, 0, 0, 0};
 printf("%7s%10s%10s%5s%5s%5s%5s%10s\n","number", "firstname", "lastname", "bat", "hit", "walk", "RBI", "average");
 for(i=0; i<MAX; i++)
 if( p[i].bat )
 {
 printf("%7d%10s%10s%5d%5d%5d%5d%10g\n",i, p[i].firstname, p[i].lastname, p[i].bat, p[i].hit, p[i].walk, p[i].RBI, p[i].average);
 total.bat += p[i].bat;
 total.hit += p[i].hit;
 total.walk += p[i].walk;
 total.RBI += p[i].RBI;
 }
 if(total.bat) total.average = (float)total.hit / (float)total.bat ;
 printf("%27s%5d%5d%5d%5d%10g\n","total team", total.bat, total.hit, total.walk, total.RBI, total.average);
}

发表于 2018-05-05 22:09:20 回复(0)