#作ろうとしてるプログラム
ファイルから何人かの名前と成績を読み取り、それらを構造体配列に格納した後、平均点を計算してソーティングを行う。最終的に平均点の高い順に名前が表示される。
うまくいかない点
ソーティングして順位を決定し、平均点を降順に並べるのはうまくいったが、名前の部分がソーティングされていないため、違う人の点数が当てはまることになる。(語彙力がなくて申し訳ないです。実行例をご覧ください)
ソースコード
※見出し判定されてしまうので文頭#は省略
include <stdio.h>
include <stdlib.h>
define NINZU 3 //入力するデータ人数
define TEN 5 //入力するデータ(点)の数
// 名前とそれ以降のデータ(点数)を格納する配列をメンバにもつ構造体
typedef struct str {
char name[50];
float x_data[TEN];
} data;
int main(void) {
FILE *fp;
char fname[] = "test.txt";
char line[256]; //1行の最大文字数は256字
char name[50];
float x1, x2, x3, x4, x5; //5つのデータ
int i,j,w,max;
struct str pos; float sort[NINZU]; //ソーティング用の配列 float gokei,heikin; data data[NINZU]; //読み込むファイルのデータの行数 //ファイルオープン動作 fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 if(fp == NULL) { printf("%s ファイルが開けん!\n", fname); return -1; } //while開始 while(fgets(line, 256, fp) != NULL) { sscanf(line, "%s %f %f %f %f %f", name, &x1, &x2, &x3, &x4, &x5); //file内データ読み込み for(j = 0; j < sizeof(data[i].name) / sizeof(data[i].name[0]); j++) { data[i].name[j] = name[j]; //ここのfor文でtxtfile内の最初の文字列を構造体配列に代入 } float tmp[] = {x1, x2, x3, x4, x5}; for(j = 0; j < sizeof(data[i].x_data) / sizeof(data[i].x_data[0]); j++) { data[i].x_data[j] = tmp[j]; //ここのfor文でtxtfile内のデータ5つを構造体配列に代入 if(data[i].x_data[j] > 100 || data[i].x_data[j] < 0){ //点数に誤りがないかの例外処理 printf("エラー!点数が正しく入力されていません。0点以上100点以下で入力してください。\n"); return 0; } } //入力データの表示 printf("%s %.0f %.0f %.0f %.0f %.0f\n" ,data[i].name, data[i].x_data[0], data[i].x_data[1], data[i].x_data[2], data[i].x_data[3], data[i].x_data[4]); //合計平均の計算 for(j=0;j<5;j++){ gokei+=data[i].x_data[j]; } heikin=gokei/5; printf("合計=%.0f, 平均=%.1f\n", gokei, heikin); printf("\n"); sort[i]=heikin; //sorting用配列に平均結果を代入 gokei=0; //合計点の初期化 i++; } //while終了。 ループ一周で1行分の出力(i++で次の行へ) //ソーティング for(i=0; i<NINZU; i++){ max=i; for(j=i+1;j<3;j++) if(sort[j]>sort[max]) max=j; w=sort[i]; sort[i] = sort[max]; sort[max]=w; } //合計平均の表示 //printf("\n"); printf("------------------------------\n"); for(i=1;i<=NINZU;i++){ printf("%d. %s %5.1f点\n",i,data[i-1].name,sort[i-1]); } fclose(fp); // ファイルを閉じる return 0;
}
###用いるテキストファイル"test.tex"の中身
yamada 22 44 66 77 36
sato 33 55 77 99 54
honda 23 23 34 34 13
#実行結果
yamada 22 44 66 77 36
合計=245, 平均=49.0
sato 55 77 99 54
合計=318, 平均=63.6
honda 23 23 34 34 13
合計=127, 平均=25.4
- yamada 63.6点
- sato 49.0点
- honda 25.0点
このように、平均点とその点数の人が一致しません。
回答4件
あなたの回答
tips
プレビュー