C言語学習ポータル(無料版) 学習コンテンツ 配列 集計・最大値・検索の定石

🗃️ 配列

集計・最大値・検索の定石

無料公開版に収録・読む目安 13分

🎯 合計・最大値・線形探索の定型パターンを自力で書ける

配列でやることは、実のところ数種類しかありません。ここで型(かた)として覚えてしまえば、あとは組み合わせるだけです。

毎回ゼロから考えると、初期値や範囲の判断でどこかを間違えます。型として手が覚えていれば、考える対象は「何を集計するか」だけになります。慣れた人がすばやくコードを書けるのは、頭の回転が速いからではなく、この引き出しを持っているからです。

定石1: 集計(合計と平均)

int sum = 0;                       // 合計は0から
for (int i = 0; i < n; i++) {
    sum += a[i];
}
double avg = (double)sum / n;      // 平均は必ずキャスト

平均で sum / n と書くと整数の割り算になり、350 ÷ 4 が 87 になってしまいます。(double) を1つ付けるだけで 87.5 が得られます。合計を求める変数は必ずループの外、初期値は 0 です。

定石2: 最大値・最小値

int max = a[0];                    // 先頭の要素で初期化するのが肝
for (int i = 1; i < n; i++) {      // 2番目から比べる
    if (a[i] > max) {
        max = a[i];
    }
}

// 位置も知りたいなら、更新のときに添字も一緒に保存する
int max2 = a[0], pos = 0;
for (int i = 1; i < n; i++) {
    if (a[i] > max2) { max2 = a[i]; pos = i; }
}

初期値を 0 にしてはいけません。全部マイナスの配列(気温など)では、答えが必ず 0 になってしまいます。先頭の要素を仮の王者にして、2番目から挑戦させる——これが安全な型です。最小値を求めるときは、比較を < に変えるだけで同じ骨格が使えます。

定石3: 線形探索

#include <stdio.h>

int find(const int a[], int n, int key)
{
    for (int i = 0; i < n; i++) {
        if (a[i] == key) {
            return i;              // 見つけたら添字を返す
        }
    }
    return -1;                     // 見つからなかった印
}

int main(void)
{
    int a[5] = {12, 45, 7, 90, 30};
    int pos = find(a, 5, 90);

    if (pos >= 0) {
        printf("%d 番目にありました\n", pos);
    } else {
        printf("見つかりません\n");
    }
    return 0;
}

見つかったら添字を返し、最後まで見つからなければ -1 を返します。「見つからなかったとき」に何を返すかを決めておくのが設計の要です。Cでは -1 を使うのが慣例で、呼び出し側は必ず戻り値を確認してから使います。この確認を省いて a[find(...)] と書くと、a[-1] を踏む重大事故になります。

組み合わせて使う

3つの型は組み合わせられます。「平均より高い点数が何個あるか」なら、集計(平均を出す)→ 走査(数える)の2段構えです。ループを1本にまとめたくなりますが、平均が確定するのは1本目が終わったあとなので、2本必要です。「いつ値が確定するか」を意識すると、こうした判断が自然にできるようになります。

罠・注意

ビット合計は0から、最大値は先頭から。ここだけは丸暗記でいいよ

この3つが書けるようになったら、次は「並べ替え」が視野に入ります。並べ替えも結局は、比較して入れ替えるという操作をループで繰り返すだけです。第4部で正面から扱いますが、そこで出てくるコードも、いま覚えた骨格の組み合わせでできています。

まとめ: 集計は0から、最大値は先頭要素から、探索は見つけたら即 return して -1 で不在を伝える。この3つの型が配列処理の土台です。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

配列はいれつ

同じ型の値を一列に並べて、まとめて管理するデータ構造のこと。1つの名前で複数の値をまとめて扱える、箱の行列のようなもの。int arr[5];のように、要素の型と個数を指定して宣言する。

添字(インデックス)そえじ

配列の中の何番目の要素かを指定する番号のこと。C言語では、この番号を0から数え始める点にとくに注意が必要になる。要素数が5個の配列なら、添字は0から4までの範囲になる。

同じトラックのほかの項目

配列とは——箱の行列配列の宣言と要素へのアクセスができ、変数を並べるより配列が優れる理由を説明できる 添字と0始まりの理由添字が0始まりである理由を理解し、範囲を間違えずにループを書ける 配列とループの黄金コンビforループで配列全体を走査でき、要素数を安全に管理できる 境界外アクセスという重大事故境界外アクセスが未定義動作であることを理解し、危険性と防ぎ方を説明できる 配列の初期化いろいろ配列の初期化の書き方を使い分けられ、未初期化の危険を避けられる 多次元配列2次元配列を宣言・初期化し、二重ループで表として扱える 配列を関数に渡す——入口編配列を関数へ渡す書き方を身につけ、値渡しとの違いに気づける
‹ 配列を関数に渡す——入口編

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH