テスト点数構造体処理:学籍番号と成績をコードで管理
/* 構造化を用いてテスト点数を処理して出力 作成者:寺田凱斗 学生番号:251205120 作成日:12月3日 */ #include<stdio.h> struct SEISEKI_DATA { int japanese; int math; int science; int society; int gaksueki_number; } seiseki[5] = { {90,60,80,60,1}, {100,25,80,60,2}, {65,55,80,80,3}, {45,80,60,100,4}, {100,100,100,100,5} }; int main(void) { int i,j,keep_sum,keep_id; int sum[5];; int ID[5]; FILE* fp; for (i = 0; i < 5; i++) { sum[i] = seiseki[i].japanese + seiseki[i].math + seiseki[i].science + seiseki[i].society; ID[i] = seiseki[i].gaksueki_number; } for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (sum[j] > sum[ j + 1]) { keep_sum = sum[ j ]; // sum[j] = sum[ j + 1]; sum[j + 1] = keep_sum; keep_id = ID[j]; ID[j] = ID[j + 1]; ID[j + 1] = keep_id; } } } fp = fopen("5-4-result.txt", "w"); for (i = 0; i < 5; i++) { if (fp != NULL) { fprintf(fp, "学籍番号%d=%d\n",seiseki[i].gaksueki_number, sum[i]); } } }
おっ、テストの点数を構造体で処理して、ファイルに出力するプログラムですね! 寺田凱斗さんの作成日12月3日のコード、拝見しました!😊 このコードでは、5人の学生の成績データを構造体 SEISEKI_DATA に格納し、それぞれの合計点を計算しています。その後、合計点の高い順に並べ替えて、学籍番号と合計点を "5-4-result.txt" というファイルに出力しようとしているんですね。 いくつか、より分かりやすく、または意図通りに動作させるためのポイントを共有させてください! 合計点の計算と並べ替えについて: 合計点を計算する部分は sum[i] に格納されていますが、並べ替えのループで sum[j] > sum[j + 1] という条件で比較しています。このままだと、配列のインデックスが j+1 までしか存在しないため、j が配列の最後の要素(この場合は4)になったときに sum[5] にアクセスしようとしてしまい、プログラムがエラーを起こしてしまう可能性があります。 並べ替えのループは、通常、内側のループの条件を j < 4 (または j < 配列のサイズ - 1)とすることで、j+1 が配列の範囲内に収まるようにします。 また、合計点と学籍番号を一緒に並べ替えるとき、元の学生のデータと紐づけるために、学籍番号も同様に keep_id を使って入れ替える処理は正しいのですが、並べ替えの対象となる sum と ID の配列が、元の seiseki 配列の順序と対応しているか、少し注意が必要です。 ファイル出力について: ファイルポインタ fp が NULL でないかチェックしてから fprintf を呼び出しているのは良いですね! ただ、ファイルに出力するループ for (i = 0; i < 5; i++) の中で、fprintf(fp, "学籍番号%d=%d\n",seiseki[i].gaksueki_number, sum[i]); となっています。ここで sum[i] を使っていますが、この sum 配列は並べ替えによって順序が変わっています。もし、並べ替え後の合計点と、元の学生の学籍番号を紐づけて出力したい場合は、並べ替えの際に学籍番号も一緒に管理し、その並べ替えられた学籍番号と合計点を出力する必要があります。 例えば、並べ替えのロジックを少し修正して、元の学生の学籍番号と合計点をセットで管理しながら並べ替える方法もありますよ! もしよろしければ、このコードをどのように改善したいか、どんな結果を期待しているか教えていただけますか? 一緒に、もっと素敵なプログラムにしていきましょう!✨