- 締切済み
C言語 ファイル処理に関する事
テキストエディタで打ち込んだファイル 【hw.dat】 Akiba 160 59.3 Kurata 162 51.6 Masaki 182 76.5 Tanaka 170 60.7 Tsuji 175 83.9 Washio 175 72.5 名前・身長・体重のデータです。 <問> 「hw.dat」から読み込んだデータを身長順にソートした上で 表示するプログラムを作成せよ。 下記のプログラムでは実行結果が何も出てきません。 入門レベルのスキルしかありません。何処が良くないのでしょうか。 教えて下さい。 [プログラム] #include <stdio.h> #include <string.h> void swap_double(double *x, double *y) { int temp = *x; *x = *y; *y = temp; } void swap_name(char *sx, char *sy) { char *temp; strcpy(temp, sx); strcpy(sx, sy); strcpy(sy, temp); } void sort(double *he, double *we, int n) { int i, j; for(i = 0; i < n - 1; i++){ if(*(he - 1) > *he ){ swap_double((he - 1), he); swap_double((we - 1), we); } } } void sort_name(double *he, char *na, int n) { int i, j; for(i = 0; i < n - 1; i++){ if(*(he - 1) > *he ){ swap_name((na - 1), na); } } } int main(void) { FILE *fp; int ninzu = 0; char *name[100]; double height, weight; double hsum = 0.0; double wsum = 0.0; int i; char *na[i]; double he[6]; double we[6]; if ((fp = fopen("hw.dat", "r")) == NULL) printf("\aファイルをオープンできません。\n"); else{ for(i = 0; i < 6; i++){ while (fscanf(fp, "%s%lf%lf", name , &height , &weight) != EOF ){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i]; printf("%-10s %5.1f %5.1f\n", na, height, weight); } } printf("------------------------\n"); printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu); } puts("\n身長順にソートしました。"); for(i = 0; i < 6; i++){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i]; } for(i = 0; i < 6; i++){ sort(he, we, 6); sort_name(he, *na, 6); printf("%-10s %5.1f %5.1f\n", *(na + i) , *(he + i), *(we + i)); } printf("------------------------\n"); printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu); fclose(fp); return 0; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8812/19983)
- cametan_42
- ベストアンサー率62% (166/266)
- cametan_42
- ベストアンサー率62% (166/266)
- asuncion
- ベストアンサー率33% (2127/6290)
補足
構造体にしたプログラムにしましたが、身長順にソートした結果を出す事が出来ません。 ソート前の名前・身長・体重は出る様になりました。 構造体はつい最近学んだところです。入門レベルという事でポインタについてもよく分かってないところがあると思います。 名前をソートしたのは、構造体ではなくバラバラで 管理していたので身長によって名前・体重もソートしないといけなかった為です。 プログラムをいじっているうちに不備があちらこちらに出る事があります。 下記、構造体にしたプログラムを送付します。 [構造体にしたプログラム] #include <stdio.h> typedef struct{ char *name[100]; double height, weight; } kojin; void swap_double(kojin *x, kojin *y) { kojin temp = *x; *x = *y; *y = temp; } void sort(kojin a[], int n) { int i, j; for(i = 0; i < n - 1; i++){ for (j = n - 1; j > i; j--){ if(a[j - 1].height > a[j].height ) swap_double(&a[j - 1], &a[j]); } } } int main(void) { FILE *fp; int ninzu = 0; double hsum = 0.0; double wsum = 0.0; int i; kojin pa; kojin *pb; if ((fp = fopen("hw.dat", "r")) == NULL) printf("\aファイルをオープンできません。\n"); else{ for(i = 0; i < 6; i++){ while (fscanf(fp, "%s%lf%lf", pa.name , &pa.height , &pa.weight) != EOF ){ ninzu++; hsum += pa.height; wsum += pa.weight; printf("%-10s %5.1f %5.1f\n", pa .name, pa .height, pa .weight); } } printf("------------------------\n"); printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu); } puts("\n身長順にソートしました。"); for(i = 0; i < 6; i++){ ninzu++; hsum += pa.height; wsum += pa.weight; sort(pb, 6); printf("%-10s %5.1f %5.1f\n", (pb + i) -> name , (pb + i) -> height, (pb + i) -> weight); } printf("------------------------\n"); printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu); fclose(fp); return 0; }