【例題】配列の平均値を求めよう

例題として、配列内の数値の平均値を求めるプログラムについて考えてみましょう。
arrayAve関数を作成し、配列の平均値を求めてみましょう。

動かしてみよう

サンプルコードを動かしてみましょう。
実行ボタンを押してみてください。
また、float input[] の { } 内を色々と変えての実行もしてみてください。

配列の平均値が出力されることが確認できたと思います。

サンプルではarrayAve関数へ配列と配列サイズ(配列の要素数)を渡し、平均値演算をおこなわせています。
では、解説に進みましょう。

解説

サンプルコードの要点について説明します。

/* プロトタイプ宣言 */
float arrayAve(float* array, int arraySize);

毎度おなじみ、関数のプロトタイプ宣言です。
main関数内でarrayAve関数を使っていますが、arrayAve関数の定義がmain関数よりも後ろで実装されているため、『arrayAve関数っていうのがあるよ。』と宣言するために必要な記述でした。

続いてmain関数内の下記。

float input[] = { 1.0, 2.0, 4.0 };
float ave;

float型の配列inputと変数aveを作成しています。
変数名の後ろに[]をつけることで、その変数を配列にすることができます。
float input[3]と書くことも可能ですが、あえて[]カッコ内は空にしてあります。
空にすることで、配列のサイズが初期値の個数から自動で決められて便利なため、そのようにしています。

float a[] = { 1.0, 2.0 }; /* 配列の要素数は2個になる */
float b[] = { 1.0, 2.0, 3.0, 4.0 }; /* 配列の要素数は4個になる */

続いて、arrayAve関数のコール部分です。

ave = arrayAve( input, sizeof(input)/sizeof(float) );

第1引数ですが、inputと書くことで、input配列の先頭アドレスを arrayAve関数に渡しています。

float input; と定義された変数の場合、そのアドレスは &input で表現されます。
float input[]; と定義された配列の場合、その先頭アドレスは input もしくは &input[0] で表現されます。

また第2引数ですが、sizeof演算子を用いて配列の要素数を算出し、arrayAve関数へ渡しています。

float input[] = { 1.0, 2.0, 4.0 }; の要素数が3個なのは人間の目から見れば自明なのですが、コンピュータにはそれがわかりません。
コンピュータにわかるのは、input配列全体としてのbyte数とfloat型のbyte数です。
その2つを除算させることで、配列が何個なのかを求めてあげる必要があります。
input配列全体のbyte数 / float型のbyte数

sizeof(input) / sizeof(float)

12 / 4 = 3個

続いて、arrayAve関数です。

float arrayAve(float* array, int arraySize)

第1引数で配列を受け取りたいため、ポインタになっています。
配列は値そのものを関数に入力させることができません。
そのため、ポインタによって配列の先頭アドレスを受け取っています。

float arrayAve(float* array, int arraySize) は
float arrayAve(float array[], int arraySize) と書くことも可能です。

第2引数は先ほど説明した通り、sizeof演算を用いて算出した配列の要素数が入ります。

主要部分の演算ですが、まずはfor文をまわすことで配列内の総和をもとめています。

for(int i = 0; i < arraySize; i++)
{
    sum += (*(array + i));
}
array が配列の先頭アドレスですので、*array とすることで先頭アドレスに保持されている値、つまり array[0]の値を取得することができます。
なお、sum += (*(array + i)); は sum += array[i]; と書くことも可能です。

そして戻り値を返す時に、総和/要素数をおこなうことで、平均値としています。

return (sum / arraySize);    

最後に return で戻された値をmain関数でprintfによって表示させています。

本例題によって、関数への配列の渡し方やポインタ演算について、多少でも慣れていただければ幸いです。

以上です。
ではまた。

タイトルとURLをコピーしました