配列、辞書

Excelの集計表のように利用できる
もっとも単純なデータ構造配列である。
配列は、Excel の集計表のようなデータ群を扱うのに適している。多くの処理系では、配列を対象にした統計計算を行う関数が用意されている。

サンプル・プログラム

配列と合計、平均

下表のような、出席番号 1~12 の算数の点数表がある。
番号点数
192
285
369
494
581
676
796
8100
974
1079
1176
1292
これを PHP の配列に代入し、合計値、平均値を計算し、画面に表示するプログラムは下記のようになる。配列では、出席番号を添字、点数を要素のように呼ぶ。
また、PHP には、Excel の SUM や AVERAGE のように、配列を使って簡単に合計や平均を求める関数が用意されている。

0010: //配列
0011: $a[1]  = 92;
0012: $a[2]  = 85;
0013: $a[3]  = 69;
0014: $a[4]  = 94;
0015: $a[5]  = 81;
0016: $a[6]  = 76;
0017: $a[7]  = 96;
0018: $a[8]  = 100;
0019: $a[9]  = 74;
0020: $a[10] = 79;
0021: $a[11] = 76;
0022: $a[12] = 92;
0023: 
0024: //合計
0025: $sum = array_sum($a);
0026: //平均
0027: $avg = $sum / count($a);
0028: 
0029: //出力
0030: printf("出席番号  点数\n");
0031: printf("----------------\n");
0032: foreach ($a as $key=>$val) {
0033:     printf(" %2d      %4d\n", $key$val);
0034: }
0035: printf("----------------\n");
0036: printf("合計     %4d\n", $sum);
0037: printf("平均     %4.1f\n", $avg);

配列、合計、平均
PHP プログラム "dt03-11-01.php" の実行結果は左図の通りである。

C++による静的配列

C言語や C++言語にも配列が用意されている。
C++用のプログラムが "dt03-11-03.cpp" である。

0009: #include <iostream>
0010: #include <iomanip>
0011: #include <numeric>
0012: using namespace std;
0013: 
0014: #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0]))
0015: 
0016: int main() {
0017:     //静的配列
0018:     int a[12];
0019:     a[0]  = 92;
0020:     a[1]  = 85;
0021:     a[2]  = 69;
0022:     a[3]  = 94;
0023:     a[4]  = 81;
0024:     a[5]  = 76;
0025:     a[6]  = 96;
0026:     a[7]  = 100;
0027:     a[8]  = 74;
0028:     a[9]  = 79;
0029:     a[10] = 76;
0030:     a[11] = 92;
0031: 
0032:     //合計
0033:     int sum = accumulate(begin(a), end(a), 0);
0034:     //平均
0035:     float avg = (float)sum / ARRAY_LENGTH(a);
0036: 
0037:     //出力
0038:     cout << "出席番号  点数" << endl;
0039:     cout << "----------------" << endl;
0040:     for (int i = 0; i < ARRAY_LENGTH(a); i++) {
0041:         cout << " " << setw(2) << i + 1;
0042:         cout << "      " << setw(4) << a[i] << endl;
0043:     }
0044:     cout << "----------------" << endl;
0045:     cout << "合計     " << setw(4) << sum << endl;
0046:     cout << "平均     " << fixed << setprecision(1) << avg << endl;
0047: 
0048:     return (0);
0049: }

C言語や C++言語では、冒頭に配列の要素数と方を宣言する必要がある。これを静的配列と呼ぶ。

accumulate は C++に追加された関数で、合計を計算するときなどに利用できる。

C++による動的配列

C++には new 演算子を用いた動的配列も用意されている。C++用のプログラムが "dt03-11-04.cpp" である。

0009: #include <iostream>
0010: #include <iomanip>
0011: #include <numeric>
0012: using namespace std;
0013: 
0014: int main() {
0015:     //動的配列
0016:     int size = 12;
0017:     int *a = new int[size];
0018:     a[0]  = 92;
0019:     a[1]  = 85;
0020:     a[2]  = 69;
0021:     a[3]  = 94;
0022:     a[4]  = 81;
0023:     a[5]  = 76;
0024:     a[6]  = 96;
0025:     a[7]  = 100;
0026:     a[8]  = 74;
0027:     a[9]  = 79;
0028:     a[10] = 76;
0029:     a[11] = 92;
0030: 
0031:     //合計
0032:     int sum = accumulate(aa + size, 0);
0033:     //平均
0034:     float avg = (float)sum / size;
0035: 
0036:     //出力
0037:     cout << "出席番号  点数" << endl;
0038:     cout << "----------------" << endl;
0039:     for (int i = 0; i < sizei++) {
0040:         cout << " " << setw(2) << i + 1;
0041:         cout << "      " << setw(4) << a[i] << endl;
0042:     }
0043:     cout << "----------------" << endl;
0044:     cout << "合計     " << setw(4) << sum << endl;
0045:     cout << "平均     " << fixed << setprecision(1) << avg << endl;
0046: 
0047:     //配列を削除
0048:     delete[] a;
0049: 
0050:     return (0);
0051: }

静的配列との違いは、プログラム実行中にヒープ領域に配列を確保することである。ただし、要素数は new 演算子を使うときに指定しなければならない。
また、明示的に delete を使って削除しないと、そのままヒープ領域の配列は残ったままになる。

C++による連想配列

C や C++の配列は、原則として添字が 0 から始まる連続した整数である。
今回のように添字を出席番号とする場合、0 は使わないし、数字が連続しているとも限らない。そこで連想配列クラス map を使ったプログラムが "dt03-11-05.cpp" である。

0009: #include <iostream>
0010: #include <iomanip>
0011: #include <map>
0012: using namespace std;
0013: 
0014: int main() {
0015:     //連想配列
0016:     map<int,inta;
0017:     a[1]  = 92;
0018:     a[2]  = 85;
0019:     a[3]  = 69;
0020:     a[4]  = 94;
0021:     a[5]  = 81;
0022:     a[6]  = 76;
0023:     a[7]  = 96;
0024:     a[8]  = 100;
0025:     a[9]  = 74;
0026:     a[10] = 79;
0027:     a[11] = 76;
0028:     a[12] = 92;
0029: 
0030:     //合計
0031:     int sum = 0;
0032:     for (int i = 1; i <= a.size(); i++)  sum += a[i];
0033: 
0034:     //平均
0035:     float avg = (float)sum / a.size();
0036: 
0037:     //出力
0038:     cout << "出席番号  点数" << endl;
0039:     cout << "----------------" << endl;
0040:     for (int i = 1; i <= a.size(); i++) {
0041:         cout << " " << setw(2) << i;
0042:         cout << "      " << setw(4) << a[i] << endl;
0043:     }
0044:     cout << "----------------" << endl;
0045:     cout << "合計     " << setw(4) << sum << endl;
0046:     cout << "平均     " << fixed << setprecision(1) << avg << endl;
0047: 
0048:     return (0);
0049: }

冒頭で、添字 int、要素 int である map クラスを生成する。
点数の代入処理は、普通の配列と同じようにできる。
ただし、accumulate がうまく適用できないので、合計の計算はセオリー通り for ループで組み立てた。

Pythonの辞書

Python には配列がない。
代わりに、添字キー(見出し語)とみなした辞書というデータ構造が用意されている。
辞書を使うことで、配列と同様、簡単に合計や平均を求めることができる。プログラム "dt03-11-02.py" の実行結果は、PHP の時と全く同じになる。

0009: import sys
0010: from statistics import mean
0011: 
0012: #配列(辞書)
0013: a = {1:92, 2:85, 3:69, 4:94, 5:81, 6:76, 7:96, 8:100, 9:74, 10:79, 11:76, 12:92}
0014: 
0015: #合計
0016: sum = sum(a.values());
0017: #平均
0018: avg = mean(a.values());
0019: 
0020: #出力
0021: print("出席番号  点数");
0022: print("----------------");
0023: for keyval in a.items():
0024:     sys.stdout.write(" {0:2d}".format(key))
0025:     sys.stdout.write("      {0:4d}".format(val))
0026:     print()
0027: print("----------------");
0028: print("合計     {0:4d}".format(sum));
0029: print("平均     {0:4.1f}".format(avg));

(この項おわり)
header