[C言語]合計、最大、最小、平均を求める方法

C言語初学者向けの課題として、「データの合計、最大、最小、平均を求めよ」といったものが見られます。

この課題は、「配列」「条件分岐」「ループ文」「関数化」を理解していれば簡単にクリアできます。

この記事では、C言語での「データの合計、最大、最小、平均」を求める方法について解説します。

データの準備

課題によってはデータは与えられたものを使用する場合もあるかもしれませんが、ここではランダムに生成したN個のデータを使用します。

与えられたデータを使用する場合には以下のようにして下さい。(波括弧の中を与えられたデータに置き換えて下さい)

C
// データ数
#define N 10
// データ int data[N] = {5, 3, 11, 4, 9, 2, 8, 1, 7, 6};

 

ランダムに生成したN個のデータを生成するには、

  1. srand関数で乱数の初期化
  2. rand関数で乱数を取得してデータに設定
  3. 2をN回繰り返す

だけで良いです。

使い回しができるように要素数、取りうる最小値/最大値を引数に持った関数を作ってみましょう。

C
// データ生成
void CreateData(int* data, int n, int min, int max)
{
    // ループインデックス
    int idx = 0;
    // 乱数初期化
    srand((unsigned)time(NULL));
    // n個のデータ生成
    for(; idx < n; idx++)
    {
        // 乱数をデータに設定
        data[idx] = rand() % (max - min + 1) + min;
    }
}

上記の関数内で使用しているsrand関数、time関数、rand関数を使用するためには、以下の2ファイルのインクルードが必要になりますので、忘れずに追加して下さい。

C
#include <stdlib.h>
#include <time.h>

作成した関数を使ってデータの生成を行うには以下のように記述します。

C
// データ数N
#define N 10
// データ
int data[N];
// データ生成
CreateData(data, N, 1, 10);

ここまででデータの準備が完了です。

以降で、各処理についての解説を行います。

合計を求める方法

合計を求めるには、全てのデータを走査して足し合わせていくだけで良いです。

C
// 合計を求める関数
int Sum(int* data, int n)
{
    // ループインデックス
    int idx = 0;
    // 合計
    int s = 0;
    // 合計を計算
    for(; idx < n; idx++)
    {
        s += data[idx];
    }
    // 合計を返却
    return s;
}

各構文が理解できていれば何も難しいことはありません。

作成した関数を使ってデータの合計を求める場合には以下のように記述します。

C
// 合計取得
int sum = Sum(data, N);

最大を求める方法

最大を求めるには、

  1. 先頭データを仮の最大データとする
  2. 次のデータが最大データよりも大きいか判定
  3. 2が真の場合最大データを置き換える
  4. 2〜3をデータ数分行う

だけで良いです。

C
// 最大値を求める関数
int Max(int* data, int n)
{
    // ループインデックス
    int idx = 1;
    // 仮の最大データ
    int m = data[0];
    // 最大を取得
    for(; idx < n; idx++)
    {
        // 最大データより大きい場合
        if(m < data[idx])
        {
            // 最大データを置き換え
            m = data[idx];
        }
    }
    // 最大を返却
    return m;
}

合計取得と同様に、各構文が理解できていれば何も難しいことはありません。

作成した関数を使ってデータの最大を求める場合には以下のように記述します。

C
// 最大取得
int max = Max(data, N);

最小を求める方法

最小を求めるには、

  1. 先頭データを仮の最小データとする
  2. 次のデータが最小データよりも小さいか判定
  3. 2が真の場合小さいデータを置き換える
  4. 2〜3をデータ数分行う

だけで良いです。

C
// 最小値を求める関数
int Min(int* data, int n)
{
    // ループインデックス
    int idx = 1;
    // 仮の最小データ
    int m = data[0];
    // 最小を取得
    for(; idx < n; idx++)
    {
        // 最小データより小さい場合
        if(m > data[idx])
        {
            // 最小データを置き換え
            m = data[idx];
        }
    }
    // 最小を返却
    return m;
}

合計取得と同様に、各構文が理解できていれば何も難しいことはありません。

作成した関数を使ってデータの最小を求める場合には以下のように記述します。

C
// 最小取得
int min = Min(data, N);

平均を求める方法

平均を求めるには、データの合計をデータ数で割るだけで良いです。

本記事でデータの合計を求める関数を作ったので、その結果をデータ数で割るだけです。

C
// 平均を求める関数
int Average(int* data, int n)
{
    // データの合計
    int s = Sum(data, n);
    // 平均
    int avg = s / n;
    // 平均を返却
    return avg;
}

合計取得と同様に、各構文が理解できていれば何も難しいことはありません。

作成した関数を使ってデータの平均を求める場合には以下のように記述します。

C
// 平均取得
int avg = Average(data, N);

まとめ

C言語でデータの合計、最大、最小、平均を求める方法について解説しました。

紹介したプログラムを1つのプログラムにすると以下のようになります。

C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// データ数
#define N 10

// データ生成
void CreateData(int* data, int n, int min, int max)
{
    // ループインデックス
    int idx = 0;
    // 乱数初期化
    srand((unsigned)time(NULL));
    // n個のデータ生成
    for(; idx < n; idx++)
    {
        // 乱数をデータに設定
        data[idx] = rand() % (max - min + 1) + min;
    }
}

// 合計を求める関数
int Sum(int* data, int n)
{
    // ループインデックス
    int idx = 0;
    // 合計
    int s = 0;
    // 合計を計算
    for(; idx < n; idx++)
    {
        s += data[idx];
    }
    // 合計を返却
    return s;
}

// 最大値を求める関数
int Max(int* data, int n)
{
    // ループインデックス
    int idx = 1;
    // 仮の最大データ
    int m = data[0];
    // 最大を取得
    for(; idx < n; idx++)
    {
        // 最大データより大きい場合
        if(m < data[idx])
        {
            // 最大データを置き換え
            m = data[idx];
        }
    }
    // 最大を返却
    return m;
}

// 最小値を求める関数
int Min(int* data, int n)
{
    // ループインデックス
    int idx = 1;
    // 仮の最小データ
    int m = data[0];
    // 最小を取得
    for(; idx < n; idx++)
    {
        // 最小データより小さい場合
        if(m > data[idx])
        {
            // 最小データを置き換え
            m = data[idx];
        }
    }
    // 最小を返却
    return m;
}

// 平均を求める関数
int Average(int* data, int n)
{
    // データの合計
    int s = Sum(data, n);
    // 平均
    int avg = s / n;
    // 平均を返却
    return avg;
}

// メイン関数
int main()
{
    // データ
    int data[N];
    // 合計、最大、最小、平均
    int sum, max, min, avg;
    // ループインデックス
    int idx = 0;

    // データ生成
    CreateData(data, N, 1, 10);

    // 生成したデータを標準出力
    for(; idx < N; idx++)
    {
        printf("%d ", data[idx]);
    }
    printf("\n");

    // 合計取得
    sum = Sum(data, N);
    // 最大取得
    max = Max(data, N);
    // 最小取得
    min = Min(data, N);
    // 平均取得
    avg = Average(data, N);

    // 結果を標準出力
    printf("合計 : %d\n", sum);
    printf("最大 : %d\n", max);
    printf("最小 : %d\n", min);
    printf("平均 : %d\n", avg);

    return 0;
}

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です