C言語の学習でよく出題されるのが、「ファイルからデータを読み込み、計算結果を別ファイルへ出力する」問題です。特に、学生番号と複数科目の点数データを扱う課題は、構造体・ファイル操作・繰り返し処理・平均計算など、基本要素をまとめて学べる典型問題として使われます。この記事では、学生10人分の成績データを読み込み、平均点を計算し、学生番号順に出力ファイルへ保存するプログラムの考え方を整理します。
今回の課題で必要になる要素
このタイプの問題では、主に以下の知識を使用します。
- 構造体(struct)
- ファイル読み込み(fopen, fscanf)
- ファイル出力(fprintf)
- 配列
- for文
- 平均値計算
つまり、「ファイル処理の基本」を総合的に確認する問題になっています。
入力データのイメージ
例えば、入力ファイルが以下のような形式だとします。
1001 80 70 901002 60 75 851003 90 88 92
左から順に、以下を表しています。
| 項目 | 内容 |
|---|---|
| 1列目 | 学生番号 |
| 2列目 | 数学 |
| 3列目 | 物理 |
| 4列目 | 英語 |
このデータを10人分読み込んで処理します。
構造体を使うと整理しやすい
学生データは構造体でまとめると扱いやすくなります。
struct Student { int id; int math; int physics; int english; double average;};
関連するデータを1つにまとめられるため、ファイル処理問題では構造体が非常に便利です。
基本的なプログラム例
以下は典型的なサンプルコードです。
#include <stdio.h>struct Student { int id; int math; int physics; int english; double average;};int main() { struct Student s[10]; FILE *fp_in, *fp_out; int i; fp_in = fopen("input.txt", "r"); fp_out = fopen("output.txt", "w"); if (fp_in == NULL || fp_out == NULL) { printf("ファイルを開けません\n"); return 1; } for (i = 0; i < 10; i++) { fscanf(fp_in, "%d %d %d %d", &s[i].id, &s[i].math, &s[i].physics, &s[i].english); s[i].average = (s[i].math + s[i].physics + s[i].english) / 3.0; } fprintf(fp_out, "学生番号 数学 物理 英語 平均\n"); for (i = 0; i < 10; i++) { fprintf(fp_out, "%d %d %d %d %.2f\n", s[i].id, s[i].math, s[i].physics, s[i].english, s[i].average); } fclose(fp_in); fclose(fp_out); printf("出力完了\n"); return 0;}
平均値で「3.0」にする理由
初心者がよく間違えるポイントとして、平均計算があります。
(a + b + c) / 3
この書き方だと整数同士の計算になり、小数が切り捨てられる可能性があります。
そのため、以下のように小数で割ります。
/ 3.0
これでdouble型として正しい平均値が計算できます。
ファイル操作でよくあるミス
この問題で頻出のミスには以下があります。
- fopenのモード間違い
- fscanfの&忘れ
- ファイル名違い
- for文回数ミス
- 平均が整数除算になる
特に「&」忘れはかなり多いです。
学生番号順に並べる場合
もし入力順ではなく「学生番号順」に並べ替えたい場合は、ソート処理が必要になります。
例えばバブルソートを使うと以下のようになります。
for(i = 0; i < 9; i++) { for(j = i + 1; j < 10; j++) { if(s[i].id > s[j].id) { temp = s[i]; s[i] = s[j]; s[j] = temp; } }}
ただし、問題によっては「入力時点で学生番号順」のケースもあります。
画面表示も同時に行う場合
画面にも表示したい場合は、fprintfではなくprintfを使います。
printf("%d %.2f\n", s[i].id, s[i].average);
fprintfは「ファイル出力版printf」と考えると理解しやすいです。
この問題で学べる重要ポイント
この課題は単なる成績計算ではなく、C言語の重要要素が多く含まれています。
- 構造体の使い方
- ファイル処理
- 配列管理
- 繰り返し処理
- データ整理
今後のプログラミングでも頻繁に使う内容なので、流れを理解しておくと応用しやすくなります。
まとめ
C言語で学生データを扱うファイル処理問題では、構造体とファイル操作を組み合わせるのが基本です。
入力ファイルから学生番号と3科目の点数を読み込み、平均点を計算し、fprintfで出力ファイルへ保存する流れを理解すると、同系統の問題にも対応しやすくなります。
特に「fscanf」「fprintf」「構造体」「平均計算」の4つは試験でも頻出なので、まずはシンプルな10人分データから慣れていくのがおすすめです。

コメント