C言語の学習をしていると割と初めの方の課題で「最大」「最小」「合計」「平均」「標準偏差」を求めよといった課題に出くわすと思います。
条件分岐、繰り返し、配列、関数化が必要となるため、文法の習得を行うには良い課題かと思いますが、Yahoo知恵袋を見ていると似たような課題ができないという方が結構いるようです。
この記事では、C言語で「最大」「最小」「合計」「平均」「標準偏差」を求める方法について初学者向けに解説を行います。
データの生成
初めに各処理で使用するデータを生成します。
ここでは固定データを使用するパターンとランダムデータを使用するパターンを紹介します。
なお、データ数は定数Nで定義し、関数「generate_data」に配列を渡してデータを生成するようにします。
#include <stdio.h>
// データ数
#define N 10
// データの生成
void generate_data(int data[N])
{
// ここにデータ生成処理を記述
}
int main()
{
// データ
int data[N];
// データの生成
generate_data(data);
return 0;
}
固定データの生成
固定データを生成する場合は、配列の初期化で直接指定でも良いですがデータ数を定数で指定(あとで変えられる)しているので、要素のインデックスを値として使用します。
// データの生成
void generate_data(int data[N])
{
// ループインデックス
int i;
// 要素のインデックスをデータの値として格納
for (i = 0; i < N; i++)
{
data[i] = i;
}
}
ランダムデータの生成
ランダムデータを生成する場合は、srand関数で乱数シードを初期化後rand関数でデータ数に応じて生成した乱数を格納します。
C言語で乱数を使用する方法については以下の記事を参考にしてください。
#include <time.h>
// データの生成
void generate_data(int data[N])
{
// ループインデックス
int i;
// 乱数シードの初期化
srand((unsigned)time(NULL));
// 乱数をデータの値として格納
for (i = 0; i < N; i++)
{
data[i] = rand() % N;
}
}
「最大」「最小」「合計」「平均」「標準偏差」を求める
生成したデータを使用して「最大」「最小」「合計」「平均」「標準偏差」を求める方法を解説します。
それぞれ作成した関数をmain関数から呼び出してprintfで結果を出力します。
int main()
{
// データ
int data[N];
// データの生成
generate_data(data);
// 最大
printf("maximize: %d\n", maximize(data));
// 最小
printf("minimize: %d\n", minimize(data));
// 合計
printf("summation: %d\n", summation(data));
// 平均
printf("average: %lf\n", average(data));
// 標準偏差
printf("standard deviation: %lf\n", standard_deviation(data));
return 0;
}
最大を求める
最大を求める場合、以下の手順で処理を実施します。
- 先頭データを仮の最大値とする
- 2番目のデータから最後のデータまで3の処理を繰り返し実施
- 仮の最大値と対象データを比較して大きい方を仮の最大値とする
- 繰り返し完了後の仮の最大値を最大値とする
// 最大
int maximize(int data[N])
{
// ループインデックス
int i;
// 仮の最大値
int max = data[0];
// 2番目のデータから最後のデータまで繰り返し
for (i = 1; i < N; i++)
{
// 仮の最大値と対象データを比較して大きい方を仮の最大値とする
if (max < data[i]) max = data[i];
}
// 繰り返し完了後の仮の最大値を最大値とする
return max;
}
最小を求める
最小を求める場合、以下の手順で処理を実施します。
- 先頭データを仮の最小値とする
- 2番目のデータから最後のデータまで3の処理を繰り返し実施
- 仮の最小値と対象データを比較して小さい方を仮の最小値とする
- 繰り返し完了後の仮の最小値を最小値とする
// 最小
int minimize(int data[N])
{
// ループインデックス
int i;
// 仮の最小値
int min = data[0];
// 2番目のデータから最後のデータまで繰り返し
for (i = 1; i < N; i++)
{
// 仮の最小値と対象データを比較して小さい方を仮の最小値とする
if (min > data[i]) min = data[i];
}
// 繰り返し完了後の仮の最小値を最小値とする
return min;
}
合計を求める
合計を求める場合、以下の手順で処理を実施します。
- 仮の合計データに0を格納
- 先頭のデータから最後のデータまで3の処理を繰り返し実施
- 仮の合計データに対象データを加算
- 繰り返し完了後の仮の合計データを合計とする
// 合計
int summation(int data[N])
{
// ループインデックス
int i;
// 仮の合計データ
int sum = 0;
// 先頭のデータから最後のデータまで繰り返し
for (i = 0; i < N; i++)
{
// 仮の合計データに対象データを加算
sum += data[i];
}
// 繰り返し完了後の仮の合計データを合計とする
return sum;
}
平均を求める
平均を求める場合、以下の手順で処理を実施します。
- 合計を求める
- 合計をデータ数で割った値を平均とする
// 平均
double average(int data[N])
{
// 合計
int sum = summation(data);
// 合計をデータ数で割った値を平均とする
return (double)sum / N;
}
標準偏差を求める
標準偏差は下式で表されるため、以下の手順で処理を実施します。(xは平均)
- 平均を求める
- シグマデータに0を格納
- 先頭のデータから最後のデータまで4の処理を繰り返し実施
- シグマデータに(対象データ – 平均)の二乗を加算
- 繰り返し完了後、シグマデータをデータ数で割った値の平方根を標準偏差とする
#include <math.h>
// 標準偏差
double standard_deviation(int data[N])
{
// ループインデックス
int i;
// 平均
double avg = average(data);
// シグマデータ
int sigma = 0;
// 先頭のデータから最後のデータまで繰り返し
for (i = 0; i < N; i++)
{
// シグマデータに(対象データ - 平均)の二乗を加算
sigma += pow(data[i] - avg, 2);
}
// シグマデータをデータ数で割った値の平方根を標準偏差とする
return sqrt((double)sigma / N);
}
べき乗を求めるにはpow関数を、平方根を求めるにはsqrt関数を使用します。
終わりに
C言語で「最大」「最小」「合計」「平均」「標準偏差」を求める方法について初学者向けに解説を行いました。
最後に書いても意味はないかもしれませんが、まずは自分の力でコードを書いてみてそれでもわからなければ解説を読むという使い方をしてもらえると勉強になって良いかと思います。
この記事について誤っている点・不明な点などありましたらコメントまでお願いします。
コメント