# 例題: 最大値と平均値

Scratchでリストに乱数を格納し、その最大値、最小値、合計値、平均値を求める方法について解説します。

# リストに乱数を格納する

Scartchには範囲を指定して整数をランダムに作る演算ブロックがあるので、これを利用して乱数リストを作ります。

Scratch(スクラッチ)で乱数リストを作成する

# 最大値を求める

最大値は次の処理で求めることができます。

  • 変数「最大値」を乱数リストの1番目の要素にする
  • 乱数リストの中身を順に見て、それが変数「最大値」より大きければ、変数「最大値」をその値で更新する

Scratch(スクラッチ)でリストの最大値を求めるプログラム

リストの中身を順に見ていく処理は、「添字」という変数を作り、「リストの長さ回繰り返す」ループ中で添字を1ずつ増やしながら、「リストの『添字』番目」を見る感じで実装できます。 添字という変数名は他のプログラミング言語で一般的に用いられているので採用しました。

条件分岐「もし乱数リストの添字番目 > 最大値なら」の部分の不等号を逆にすると、ほぼ同じプログラムで最小値を求めることもできます。

ちなみに変数「最大値」の初期値は乱数リストの1番目の値じゃなくてゼロでも良いじゃないかと思われた方がいらっしゃるかも知れませんが、その実装だと乱数リストの中身がすべてマイナスの数だった場合にバグってしまうので、念のため安全設計にしてみました。

# 平均値を求める

平均値は次の処理で求めることができます。

  • 乱数リストの合計値を求める
    • 変数「合計値」を0にする
    • 乱数リストの中身を順に見て、変数「合計値」に足す
  • 合計値を乱数リストの長さで割る

Scratch(スクラッチ)でリストの平均値を求めるプログラム

合計値を求める処理は、最大値を求める処理とほぼ同じなので、あまり迷わず実装できるかと思います。

# おまけ: C++で最大値と平均値を求める

ここで紹介した最大値と平均値を求めるScratchプログラムと同等の処理を行うC++のプログラムを掲載します。 眺めてみて「Scratchと同じだなぁ」と思っていただければオッケーです。

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;

// 最大値を求める関数
int calc_maximum(const vector<int> &array) {
  int ret = array[0];
  for (int i = 0; i < array.size(); i++) {
    if (ret < array[i]) {
      ret = array[i];
    }
  }
  return ret;
}

// 平均値を求める関数
double calc_average(const vector<int> &array) {
  double ret = 0;
  for (int i = 0; i < array.size(); i++) {
    ret = ret + array[i];
  }
  ret = ret / array.size();
  return ret;
}

// 範囲指定で乱数を作る関数
int make_random_number(int from, int to) {
  int range = to - from + 1;
  int ret = random() % range;
  ret = ret + from;
  return ret;
}

int main(void) {
  // 乱数リストを生成する
  vector<int> random_numbers;
  for (int i = 0; i < 10; i++) {
    random_numbers.push_back(make_random_number(1, 100));
  }

  // 乱数リストを表示する
  cout << "乱数リスト:";
  for (int i = 0; i < random_numbers.size(); i++) {
    cout << " " << random_numbers[i];
  }
  cout << endl;

  // 最大値を求めて表示する
  cout << "最大値: " << calc_maximum(random_numbers) << endl;

  // 平均値を求めて表示する
  cout << "平均値: " << calc_average(random_numbers) << endl;

  return 0;
}

実行結果

$ ./a.out
乱数リスト: 84 87 78 16 94 36 87 93 50 22
最大値: 94
平均値: 64.7