} } }
void get_score(struct student *p) { int i,j;
for (i = 0; i < CSIZE; i++) {
printf(\ for (j=0; j scanf(\ } printf(\ } void calculate_average(struct student *p) { int i,j; float total; for (i = 0; i < CSIZE; i++) { for (j=0,total=0; j printf(\ } void print_each(struct student *p) { int i,j; float total; for (i = 0; i < CSIZE; i++) { printf(\ for (j=0,total=0; j printf(\ printf(\ } } void print_class_average(struct student *p) { int i; float total; for (i = 0, total=0; i < CSIZE; i++) total += (p+i)->average ; printf(\ } 6.一个文本文件中存放着一个棒球队的信息。每一行的数据都是这样排列的: 4 Jessie Joybat 5 2 1 1 第一项是球员号码,为了方便,范围是0到18。第二项是球员的名,第三项是姓。姓和名都是单个的单词。下一项是官方统计的球员上场次数,紧跟着是击中数、走垒数和跑点数( RBI)。文件可能包括超过一场比赛的数据,因此同一个球员可能会有多于一行的数据,而且在不同的行之间有可能有别的球员的数据。写一个程序,把这些数据存储到一个结构数组中。结构中必须含有姓、名、上场次数、击中数、走垒数和跑点数,以及击球平均成功率(稍后计算)。可以使用球员号码作为数组索引。程序应该读到文件末尾,并且应该保存每个球员的累计总和。 这个棒球运动中的统计方法是相关的。例如,一次走垒和触垒中的失误并不会记作上场次数,但是这可能产生一个RBI。可是,该程序所要做的只是处理数据文件,而不必关心数据的实际含义。 要实现这些功能,最简单的方法是把结构的内容初始化为零值,将文件数据读入临时变量中,然后把它们加到相应结构的内容中。程序读完文件后,应该计算每个球员的击球平均成功率,并把它保存到相应的结构成员里。计算击球平均成功率是用球员的累计击中数除以上场累计次数;这是个浮点数计算。然后程序要显示每个球员的累计数据,并且对整个时期显示一行综合统计数据。 irstname, \ 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]=\ FILE *fp; printf(\ scanf(\ while ( (fp = fopen(filename,\ { printf(\ scanf(\ } while ( fscanf(fp, \%s %s %d %d %d %d\\n\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 p[i].average = (float)p[i].hit / (float)p[i].bat ; } void display(struct member *p) { int i; struct member total={\ printf(\\ for(i=0; i printf(\p[i].firstname, p[i].lastname, p[i].bat, p[i].hit, p[i].walk, p[i].RBI, p[i].average); += p[i].bat; += p[i].hit; += p[i].walk; += p[i].RBI; } if = (float) / (float) ; printf(\ } 第14章 结构和其他数据形式 (中) 编程练习 7.修改程序清单,在从文件中读出每个记录并且显示它时,允许用户选择删除该记录或修改该记录的内容。如果删除记录,把空出来的数组空间留给下一个要读入的记录。要能够改变现有的文件内容,必须使用\模式,而不是\模式。要注意文件指针的定位,以便追加的记录不会覆盖已有的记录。最简单的方法是对存储在程序内存中的数据做所有的改变,然后再把最后的信息集写入文件中。 #include <> #include <> #include <> int count=0;n\ } void display(struct book *p) { int i; if ( count == 0 ) printf(\ printf(\ for(i=0; i printf(\ } void change(struct book *p) { int i; char title[MAXTITL]; printf(\ gets(title); for(i=0; i if ( strcmp(p[i].title, title) == 0 ) { puts(\ gets(p[i].title); puts(\ gets(p[i].author); puts(\ scanf(\ getchar(); printf(\ return; } printf(\ return; } void reduce(struct book *p) { int i; char title[MAXTITL]; if(count == 0) { printf(\ return; }