コース一覧
    C言語基礎 ポインタ・構造体・ファイル
    つくる 入力処理の関数化

    C言語基礎 ポインタ・構造体・ファイル

    C言語のポインタ、構造体、ファイル操作を学び、データを扱う基礎を固めるコースです。

    1
    ポインタの入口
    01. アドレスとは15分
    02. ポインタの&と*15分
    03. scanfの&の正体15分
    04. 関数で値を書き換える15分
    05. 配列を関数に渡す15分
    06. つくる 入力処理の関数化15分
    07. 第7章クイズ10分
    2
    構造体とファイル
    01. 構造体15分
    02. メンバの読み書き15分
    03. 構造体配列15分
    04. 構造体と関数15分
    05. ファイルに書き込む15分
    06. ファイルを読み込む15分
    07. ファイルの失敗に備える15分
    08. つくる 保存機能15分
    09. 第8章クイズ10分
    3
    総合制作
    01. メニュー統合15分
    02. 自由拡張15分
    03. 完成と次のステップ10分

    つくる 入力処理の関数化

    main が長くなってきました

    第6章の成績管理は、入力の for 文、合計を出す for 文、最高点を探す for 文が、すべて main の中に並んでいました。動きはしますが、main を読んでも全体の流れが見えません。

    第5章で学んだとおり、まとまった仕事は関数に切り出します。今回は次の 2 つに分けます。

    c

    void input_scores(int scores[], int n);
    void summarize(const int scores[], int n, int *total, int *best);

    input_scores は配列を受け取って、そこへ点数を読み込みます。前回のとおり配列は番地で渡るので、関数の中で入れた値がそのまま呼び出し元の配列に残ります。

    summarize が今回の山場です。返したい結果が合計と最高点の 2 つあるので、return では足りません。そこで結果を受け取る変数の番地を int *total と int *best で受け取り、*total = ... の形で呼び出し元へ書き込みます。関数の中では * を付けるのを忘れないでください。

    main はどうなるか

    c

    int scores[COUNT];
    int total, best;
    
    input_scores(scores, COUNT);
    summarize(scores, COUNT, &total, &best);

    main に残るのは 4 行と表示だけになりました。読むだけで「入力して、集計して、表示する」と分かります。第6章の版と見比べると、行数はそれほど減っていないのに読みやすさは大きく変わっています。関数に切り出す価値は、短くすることではなく、名前を付けて役割を分けることにあります。

    平均の型に注意

    平均は第2章で扱った整数除算の罠がそのまま出ます。total / COUNT は切り捨てになるので、(double)total / COUNT と書いて %.1f で表示します。

    書き換える関数には int scores[]、読むだけの関数には const int scores[] を付けておくと、うっかり事故を減らせます。summarize は配列を読むだけで、書き込むのは合計と最高点の 2 つだけ、ということが宣言を見ただけで分かる形になっています。

    ここまでが基礎編のポインタ

    第7章で扱ったのは、& で番地を取る、* で指す先を読み書きする、関数の引数として渡す、この 3 つだけです。C のポインタには、番地に足し算をして隣の要素へ進むポインタ演算や、必要な分だけメモリを実行中に確保する malloc といった話も続きますが、それらは中級コースへ回します。基礎編では、いま書けるようになった「呼び出し元の変数を関数から書き換える」を確実に手に入れてください。次の第8章では、この考え方のまま構造体とファイルへ進みます。

    では、4 人分の成績を集計するプログラムを完成させましょう。

    要件

    1. input_scores で 4 つの点数を配列に読み込む
    2. void summarize(const int scores[], int n, int *total, int *best) を完成させる
    3. 合計を 「合計は326点です」 の形で表示する
    4. 最高点を 「最高点は95点です」 の形で表示する
    5. 平均を 「平均は81.5点です」 の形で小数第1位まで表示する

    ヒント

    呼び出し元へ書き込むときは *total = ... のように * を付けます

    最高点は最初の要素を仮の最大値にしてから、2番目以降と比べていきます

    平均は (double)total / COUNT です。int どうしの割り算だと切り捨てられます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • 第7章クイズ

      第7章の理解を確認します。

    • 構造体

      関連するデータを1つの型にまとめられるようになります。

    • メニュー統合

      登録と一覧と集計と保存をメニュー式の1本にまとめられるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 関数処理に名前を付けて再利用できる単位
    • 配列サイズ固定の同型データの集まり
    • 変数データに名前をつけて参照する仕組み
    • 引数位置引数=順番で渡す。
    • メモリプログラムとデータを一時保持する高速領域
    main.c
    エディタを読み込んでいます

    メモ

    つくる 入力処理の関数化

    ⌘S で保存