/* List13-2を書き換えて、ファイルから読み込んだ個人データを 身長順にソートした上で表示するプログラムを作成せよ。 */ #include /*--- 名前、身長、体重の構造体 ---*/ typedef struct { char name[128]; /* 名前 */ double height; /* 身長 */ double weight; /* 体重 */ } nhw; /*--- 二つの構造体の値を交換 ---*/ void swap(nhw *x, nhw *y) { nhw temp = *x; *x = *y; *y = temp; } /*--- nhw構造体の配列dataの先頭n個の要素を身長の昇順にソート ---*/ void sort(nhw data[], int n) { int i, j, k = n - 1; while(k >= 0) { for( i = 1, j = -1; i <= k; i++ ) if(data[i - 1].height > data[i].height) { j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { FILE *fp; int ninzu = 0; /* 人数 */ double hsum = 0.0; /* 身長の合計 */ double wsum = 0.0; /* 体重の合計 */ nhw people[8]; /* 名前・身長・体重の構造体 */ int i = 0; if((fp = fopen("hw.dat", "r")) == NULL) puts("\aファイルをオープンできません。"); else { while(fscanf(fp, "%s%lf%lf", &people[i].name, &people[i].height , &people[i].weight) == 3) { ninzu++; hsum += people[i].height; wsum += people[i].weight; i++; } sort(people, ninzu); for( i = 0; i < ninzu; i++ ) printf("%-10s %5.1f %5.1f\n", people[i].name, people[i].height , people[i].weight); printf("----------------------\n"); printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu); fclose(fp); } return 0; }