第九回 配列の実用例


本日の課題 (準備)

今日はいきなり課題から入る。

[課題]
double 型の数値を格納できる要素数 100 の配列 x に、100 人分の身長のデータが格納されているとする。
その平均と分散を求めよ。なお、数式で表現すると xi (i=0~N-1、ただし N はデータ数) のデータに対し、平均と分散は次式で書ける。
平均と分散を計算するプログラムを書け。



前回は、「配列にデータを格納する」ことを学んでもらったが、
今回は、「あらかじめ格納されたデータをもとに、何らかの計算を行う」ことが目的である。

まずは、「double 型の数値を格納できる要素数 100 の配列 x に、100 人分の身長のデータが格納されている」状態をこちらから提示するので、
それを確認してみよう。

なお、今回は 第六回 数当てゲームを作ろう で行ったように、「paiza.IO のプログラムを全てこちらで用意した内容で差し替える」という方針で記述する。

すなわち、まず paiza.IO のデフォルト状態のプログラム記述欄でキーボードで「Ctrl-a」を実行し、
プログラム全体を選択する。
そして、キーボードのDeleteキーを押して、プログラム全体を削除する。



その結果、もちろん以下のようにプログラムが全く書かれていない状態になる。



その状態で、以下のプログラムをマウスで選択し、キーボードの Ctrl-c によりコピーする。
その後、何も書かれていない paiza.IO にてキーボードで Ctrl-v を実行してプログラム全体を貼り付ける、というわけである。

以下が「double 型の数値を格納できる要素数 100 の配列 x に、100 人分の身長のデータが格納されている」状態のプログラムである。
さらに、その 100 人分の身長のデータをコンソールに表示する for 文も追加してある。実行してみよう。
#include <iostream>
using namespace std;
int main(void){
	// Your code here!
	// 100人分の身長のデータ。この行は変更しないこと!
	double x[] = {170.9,175.1,170.7,171.7,170.8,177.6,169,171.7,162.7,174.3,167.8,166.5,164.1,172.4,166.2,172.7,171.3,175.7,170.8,168.4,178,174.1,170,163.1,176.1,175.2,167.7,166.6,183.1,171.8,169.9,164.5,176.1,175.2,174,172.1,173.5,165.3,167.8,173.4,168.5,170,173.7,170.2,173.3,165.1,176.9,168,175.1,168.5,176,171.1,171.6,166.6,166.3,167.9,163.7,180.4,171.8,177,171.9,175.4,166.1,171.9,163.6,163.1,165.9,166.1,175.2,175.4,177.1,177,181.2,175.8,173.2,175.6,178.3,169.2,174.7,172.2,169.7,174.4,172.6,169.3,170.5,174.6,180.9,167.8,169.4,171.6,172.1,172.7,176.3,177.4,164.9,169.8,165.8,166.8,178.8,167.5,};

	int N=100;  // データの個数 (人数)

	// 皆さんはここより下にプログラムを書くこと

	for(int i=0 ; i<N ; i++)
	{
		cout << i << "番目の身長は" << x[i] << "\n";
	}
}
横に非常に長い「double x[] = {...};」という命令があるが、これが、100 人分の身長で初期化したdouble 型の配列 x である。
前回の配列の初期化 で学んだ内容を使っていることに注意。

また、上で書かれていた数式との整合性をとるため、 「int N=100;」にてデータ数 N が定義されていることに注意。
for文も、「for(int i=0 ; i<N ; i++)」と N を使って書かれている。
一人一人の身長のデータが for 文の内部で x[i] と書かれていることにも注意しよう (これを知らないと課題が解けない)。

念のため、上のプログラムを paiza.IO に貼り付けた様子も示しておこう。
なお、横に長い配列の初期化部の表示が途中で切れているが、実際には存在するので注意すること。



実行した様子が下図である。スクロールして、99番目のデータまで存在することを確認しておこう。
もちろん、0~99 の 100 人のデータがあるのである。




平均を求める方針

さて、ここからは配列 x[i] (i=0~99) に格納されているデータの平均を計算する方針を示しておこう。
答えを提示するわけにはいかないので、あくまで方針を示すのに留める。

平均の定義は上に数式で書かれているが、言葉で言ってしまえば、
「 x[i] (i=0~99) の和を求め、最後にその和を N で割る」
というわけで、それほど難しい処理を行うわけではない。

まず「x[i] (i=0~99) の和を求め」に関連した内容で、過去に学んだなかで最も近いのは
for 文を用いて整数の和を求めようで取り扱った「整数1から10までの和」であろう。

そのサンプルプログラムをなるべく今回の課題に流用しやすいように「0から99までの和を求める」という演習に変更し、
さらに、「和 s を最後にNで割って平均 E とする」という処理を加えたのが以下のプログラムである。

先程と同様、「既存のプログラムを全て削除して全体を貼り付ける」という方針で実行してみよ。
なお、100人分の身長を表示する部分は確認が済んだので削除してある。
#include <iostream>
using namespace std;
int main(void){
	// Your code here!
	// 100人分の身長のデータ。この行は変更しないこと!
	double x[] = {170.9,175.1,170.7,171.7,170.8,177.6,169,171.7,162.7,174.3,167.8,166.5,164.1,172.4,166.2,172.7,171.3,175.7,170.8,168.4,178,174.1,170,163.1,176.1,175.2,167.7,166.6,183.1,171.8,169.9,164.5,176.1,175.2,174,172.1,173.5,165.3,167.8,173.4,168.5,170,173.7,170.2,173.3,165.1,176.9,168,175.1,168.5,176,171.1,171.6,166.6,166.3,167.9,163.7,180.4,171.8,177,171.9,175.4,166.1,171.9,163.6,163.1,165.9,166.1,175.2,175.4,177.1,177,181.2,175.8,173.2,175.6,178.3,169.2,174.7,172.2,169.7,174.4,172.6,169.3,170.5,174.6,180.9,167.8,169.4,171.6,172.1,172.7,176.3,177.4,164.9,169.8,165.8,166.8,178.8,167.5,};

	int N=100;  // データの個数 (人数)

	// 皆さんはここより下にプログラムを書くこと

	double s=0;
	double E;
	for(int i=0 ; i<N ; i++)
	{
		s=s+i;
	}
	E = s/N;
	cout << "0から99の整数の平均は" << E << "\n";
}
正しく実行すれば、コンソールに以下のように表示される。
(「コンパイルエラー」タブに警告が出ているが、演習を正しく完成させれば消えるので気にしなくとも良い)
0から99の整数の平均は49.5
さて、ここまでで何が出来たかと言うと、
「100人分の身長の平均(と分散)を求めたいプログラム上で、整数0から99の平均を求めるプログラム」
ができたということである。

これに手を加えることで、 「100人分の身長の平均(と分散)を求めるプログラム」を完成させるのが課題である。



課題→

オンラインコンパイラで C/C++ を自習しように戻る