C言語 構造体の操作

/*
 成績データを入力し、入力データと3科目の合計点、平均点を出力する。
 入力データが終了したら、各科目の平均点、総平均点を出力する。

 ・成績データの各項目をメンバとする構造体を宣言する
 ・宣言した構造体の領域を定義し、メンバに対応する成績データの各項目を入力する
 ・データ格納領域は配列にしない
 ・成績データにエラーはないものとする
 */
#include <stdio.h>

int main(void) {
	typedef struct person {
		int no;
		char name[20];
		int en;
		int math;
		int n_lang;
		int sum;
		double ave;
	} person_t;
	person_t member[30], tmp;
	int i = 0, j, n = 0, cnt = 0, entotal = 0, mathtotal = 0, n_langtotal = 0,
			total = 0;
	double avetotal = 0, enave, mathave, n_langave, totalave, aveave;

	FILE *fp;
	fp = fopen("seiseki.dat", "r");
	while ((fscanf(fp, "%d%s%d%d%d", &member[i].no, member[i].name,
			&member[i].en, &member[i].math, &member[i].n_lang)) != EOF) {
		i++;
	}
	n = i;
	for (i = 0; i < n; i++) {
		member[i].sum = member[i].en + member[i].math + member[i].n_lang;
		member[i].ave = (double) member[i].sum / 3;
		entotal += member[i].en;
		mathtotal += member[i].math;
		n_langtotal += member[i].n_lang;
		avetotal += member[i].ave;
	}
	total += entotal + mathtotal + n_langtotal;
	enave = (double) entotal / n;
	mathave = (double) mathtotal / n;
	n_langave = (double) n_langtotal / n;
	totalave = (double) total / n;
	aveave = (double) avetotal / n;

	printf("\n***成績一覧表***\n");
	printf("番号 氏名 英語 数学 国語 合計 平均\n");
	for (i = 0; i < n; i++) {
		printf("%-4d%12s%5d%5d%5d%5d%5.1f\n", member[i].no, member[i].name,
				member[i].en, member[i].math, member[i].n_lang, member[i].sum,
				member[i].ave);
	}
	printf("平均  %6.1f%6.1f%6.1f%8.1f%6.1f", enave, mathave, n_langave, totalave,
			aveave);
	fclose(fp);
}