🗃️ 配列
🎯 forループで配列全体を走査でき、要素数を安全に管理できる
配列とfor文は、Cでいちばん出番の多い組み合わせです。「同じ処理を、全要素に対して」というパターンは、この形にすべて収まります。
for (int i = 0; i < n; i++) {
// a[i] に対する処理
}この5行が体に入ると、合計・平均・最大値・検索・並べ替えまで、ほとんどの処理が同じ骨格で書けるようになります。中身を差し替えるだけで、やれることが次々に増えるからです。
sum += a[i]; → 合計if (a[i] > max) max = a[i]; → 最大値if (a[i] == key) … → 検索printf("%d ", a[i]); → 表示b[i] = a[i] * 2; → 別の配列へ加工しながらコピー骨格が同じなので、毎回考えるのは「中身」だけになります。t08-08では、この型を3つ正確な形で身につけます。
#include <stdio.h>
int main(void)
{
int a[5] = {60, 85, 40, 90, 75};
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += a[i];
}
printf("合計 %d / 平均 %.1f\n", sum, (double)sum / 5);
return 0;
}sum をループの外で宣言しているところに注目してください。中で宣言すると毎回 0 に戻ってしまい、合計になりません。
要素数を1か所で管理する
上のコードには 5 が3か所(宣言・ループ・平均)に散らばっています。人数が6人になったとき、1か所でも直し忘れると事故です。要素数には名前を付けましょう。
#include <stdio.h>
#define N 5 // 要素数に名前を付ける
int main(void)
{
int a[N] = {60, 85, 40, 90, 75};
int sum = 0;
for (int i = 0; i < N; i++) {
sum += a[i];
}
printf("平均 %.1f\n", (double)sum / N);
return 0;
}もうひとつ、配列そのものから要素数を計算する定石もあります。
int n = sizeof(a) / sizeof(a[0]);「全体の大きさ ÷ 1個の大きさ = 個数」という素直な計算です。ただしこれが使えるのは配列を宣言した関数の中だけで、配列を関数に渡した先では使えません。理由は t08-07 で説明します。
なぜ要素数が散らばると危ないのか
配列の宣言は [5] のまま、ループだけ i < 6 に書き換えてしまった——この一手で、プログラムは静かに壊れます。しかも運が良ければ動いてしまうので、テストをすり抜けることがあります。数字を1か所にまとめるのは、単なる整理整頓ではなく安全対策なのです。
while文でも書ける
添字を自分で進める書き方もできますが、初期化・条件・更新が1行にまとまる for のほうが、範囲の間違いに気づきやすくなります。配列の走査は for が基本と覚えておきましょう。
罠・注意
i を書き換えると、進み方が変わって範囲を飛び出すことがあります。i はループに任せましょう。i と j を取り違える事故は非常に多いです。行と列で名前を変える、意味のある名前にするなどで防げます。#define か変数で1か所にまとめるのが、事故防止の第一歩です。なお、配列の一部だけを処理したいときも同じ形です。開始と終了を変えるだけで、for (int i = 2; i < 5; i++) なら3番目から5番目まで、といった具合に自由に切り取れます。その場合も、両端が 0 と n−1 の内側に収まっているかを必ず確かめてください。
まとめ: for (int i = 0; i < n; i++) が配列処理の基本形。要素数は1か所で管理し、合計用の変数はループの外に置く。
「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。
条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。