【C言語】「最大」「最小」「平均」「標準偏差」を求める方法

私は趣味でプログラミングをしているので、たまーにteratailYahoo知恵袋でプログラミング関係の質問を閲覧していますが、毎年大学の課題と思しき「C言語で最大、最小、平均、標準偏差を出力するプログラムを教えてください!」的な質問が出てきます。

パッとGoogleで調べてみても同じような質問だったり解説サイトがすぐに出てくるのですが、多分ピンポイントに答えだけが欲しいんでしょう。

そんな方々に向けて、もう不毛な(というかリソースの無駄な)質問はやめてもらうために、ピンポイントに答えだけ(一応解説付き)を用意しましょう!

スポンサーリンク

解説が不要な方

解説が不要な方もおられるかと思いますので、先に答えだけ載せておきます。

目に入ってしまうのも嫌な方もいるかと思うので、IdeoneのURLを記載しておくのでそちらからご自由にソースをお持ちになってください。

https://www.ideone.com/coybLx

実行すると、乱数で生成された10個のデータとそれぞれの結果が出力されるようになります。

手段とソースの解説

さて、それでは各問題に対して解説を行なっていきます。

本ページではデータは乱数で生成しているので、ついでにその方法についても簡単に解説しておきます。

乱数でデータ生成

C言語で乱数を扱うためにはrand関数を使用しますが、乱数の初期化をしないと毎回同じ値となってしまうため、srand関数を使用して乱数の初期化も行います。

乱数を初期化するためのシード(種)には、一般的にはtime関数を使用します。

プログラム実行中に一度だけsrand関数が実行されれば良いので、あとは必要なデータ数分rand関数によって乱数を取得すればデータの生成は完了です。

呼び出し側では、同じ要素数の配列を定義して渡してやるだけで、処理が戻ってきたときにはデータが格納されています。

ちなみに、データは自分で用意したものを使いたいよっていう方は、以下のように書き換えればOKです。

最大を求める

最大値を求める場合、先頭のデータを仮の最大値としておいて、残りの全てのデータと比較をしながら仮の最大値よりも大きいデータが見つかったら仮の最大値を置き換えていくといったことを全てのデータに対して行います。

  1. 先頭のデータを仮の最大値とする
  2. 仮の最大値と次のデータを比較する
  3. 次のデータが仮の最大値より大きい場合、仮の最大値を置き換える
  4. 終端のデータになるまで2〜3を繰り返す
  5. 最後に設定されていた仮の最大値が最大データとなる

最小を求める

最小値を求める場合、先頭のデータを仮の最小値としておいて、残りの全てのデータと比較をしながら仮の最小値よりも小さいデータが見つかったら仮の最小値を置き換えていくといったことを全てのデータに対して行います。

  1. 先頭のデータを仮の最小値とする
  2. 仮の最小値と次のデータを比較する
  3. 次のデータが仮の最小値より小さい場合、仮の最小値を置き換える
  4. 終端のデータになるまで2〜3を繰り返す
  5. 最後に設定されていた仮の最小値が最小データとなる

平均を求める

平均値を求める場合、全てのデータの合計を算出後に、合計値をデータ数で割ります。

  1. 全てのデータの合計を計算
  2. 合計値をデータ数で割る

標準偏差を求める

標準偏差は下式によって求められます。(数式はTeXclipというサイトで画像化させて頂きました)

このとき、xiは一つ一つのデータを表し、averageは平均値を表しています。

そのため、上式が表しているのは、一つ一つのデータから平均値を引いた値の二乗の合計値をデータ数で割ったものの平方根が標準偏差であることを表しています。

  1. データの平均値を取得
  2. 一つ一つのデータから平均値を引いたものの二乗の合計を算出
  3. 2で算出した結果をデータ数で割る
  4. 3で算出した結果の平方根を取る

ここで、「二乗」「平方根」と何気なく使いましたが、これらはpow関数(べき乗)とsqrt関数で実現することができます。

平均値を取得する処理は既に上で作成しているので、今回はその処理を流用しています。

作った関数を呼び出して出力する

ここまでで各機能を実現するパーツが揃ったので、それらを呼び出した結果を出力してみます。

ついでに、データを乱数で生成しているためはじめにデータも出力するようにしています。

各機能と上記のコードをくっつけた結果、以下のよう(数値は異なります)に出力されればOKです!

ソースの全文は以下でも確認できます!

https://www.ideone.com/coybLx

まとめ

C言語初学者が質問サイトによく投稿している「C言語で最大、最小、平均、標準偏差を取得する方法」について解説を行いました。

はじめのうちはわからないなりにコピペでもいいと思いますが、可能な限り自分の手で入力した方が身につくので、時間がある方は是非写経してみてください。

他にも、こんな課題の答えだけくれっていうような要望がありましたら、可能な限り答えるつもりでいるので、コメントやTwitterのDMまでご連絡ください。

コメントを残す

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