配列、辞書

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

サンプル・プログラム

配列と合計、平均

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

  10: //配列
  11: $a[1]  = 92;
  12: $a[2]  = 85;
  13: $a[3]  = 69;
  14: $a[4]  = 94;
  15: $a[5]  = 81;
  16: $a[6]  = 76;
  17: $a[7]  = 96;
  18: $a[8]  = 100;
  19: $a[9]  = 74;
  20: $a[10] = 79;
  21: $a[11] = 76;
  22: $a[12] = 92;
  23: 
  24: //合計
  25: $sum = array_sum($a);
  26: //平均
  27: $avg = $sum / count($a);
  28: 
  29: //出力
  30: printf("出席番号  点数\n");
  31: printf("----------------\n");
  32: foreach ($a as $key=>$val) {
  33:     printf(" %2d      %4d\n", $key, $val);
  34: }
  35: printf("----------------\n");
  36: printf("合計     %4d\n", $sum);
  37: printf("平均     %4.1f\n", $avg);

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

C++による静的配列

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

   9: #include <iostream>
  10: #include <iomanip>
  11: #include <numeric>
  12: using namespace std;
  13: 
  14: #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0]))
  15: 
  16: int main() {
  17:     //静的配列
  18:     int a[12];
  19:     a[0]  = 92;
  20:     a[1]  = 85;
  21:     a[2]  = 69;
  22:     a[3]  = 94;
  23:     a[4]  = 81;
  24:     a[5]  = 76;
  25:     a[6]  = 96;
  26:     a[7]  = 100;
  27:     a[8]  = 74;
  28:     a[9]  = 79;
  29:     a[10] = 76;
  30:     a[11] = 92;
  31: 
  32:     //合計
  33:     int sum = accumulate(begin(a), end(a), 0);
  34:     //平均
  35:     float avg = (float)sum / ARRAY_LENGTH(a);
  36: 
  37:     //出力
  38:     cout << "出席番号  点数" << endl;
  39:     cout << "----------------" << endl;
  40:     for (int i = 0i < ARRAY_LENGTH(a); i++) {
  41:         cout << " " << setw(2<< i + 1;
  42:         cout << "      " << setw(4<< a[i<< endl;
  43:     }
  44:     cout << "----------------" << endl;
  45:     cout << "合計     " << setw(4<< sum << endl;
  46:     cout << "平均     " << fixed << setprecision(1<< avg << endl;
  47: 
  48:     return (0);
  49: }

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

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

C++による動的配列

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

   9: #include <iostream>
  10: #include <iomanip>
  11: #include <numeric>
  12: using namespace std;
  13: 
  14: int main() {
  15:     //動的配列
  16:     int size = 12;
  17:     int *a = new int[size];
  18:     a[0]  = 92;
  19:     a[1]  = 85;
  20:     a[2]  = 69;
  21:     a[3]  = 94;
  22:     a[4]  = 81;
  23:     a[5]  = 76;
  24:     a[6]  = 96;
  25:     a[7]  = 100;
  26:     a[8]  = 74;
  27:     a[9]  = 79;
  28:     a[10] = 76;
  29:     a[11] = 92;
  30: 
  31:     //合計
  32:     int sum = accumulate(a, a + size, 0);
  33:     //平均
  34:     float avg = (float)sum / size;
  35: 
  36:     //出力
  37:     cout << "出席番号  点数" << endl;
  38:     cout << "----------------" << endl;
  39:     for (int i = 0i < sizei++) {
  40:         cout << " " << setw(2<< i + 1;
  41:         cout << "      " << setw(4<< a[i<< endl;
  42:     }
  43:     cout << "----------------" << endl;
  44:     cout << "合計     " << setw(4<< sum << endl;
  45:     cout << "平均     " << fixed << setprecision(1<< avg << endl;
  46: 
  47:     //配列を削除
  48:     delete[] a;
  49: 
  50:     return (0);
  51: }

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

C++による連想配列

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

   9: #include <iostream>
  10: #include <iomanip>
  11: #include <map>
  12: using namespace std;
  13: 
  14: int main() {
  15:     //連想配列
  16:     map<int,int> a;
  17:     a[1]  = 92;
  18:     a[2]  = 85;
  19:     a[3]  = 69;
  20:     a[4]  = 94;
  21:     a[5]  = 81;
  22:     a[6]  = 76;
  23:     a[7]  = 96;
  24:     a[8]  = 100;
  25:     a[9]  = 74;
  26:     a[10] = 79;
  27:     a[11] = 76;
  28:     a[12] = 92;
  29: 
  30:     //合計
  31:     int sum = 0;
  32:     for (int i = 1i <a.size(); i++)  sum +a[i];
  33: 
  34:     //平均
  35:     float avg = (float)sum / a.size();
  36: 
  37:     //出力
  38:     cout << "出席番号  点数" << endl;
  39:     cout << "----------------" << endl;
  40:     for (int i = 1i <a.size(); i++) {
  41:         cout << " " << setw(2<< i;
  42:         cout << "      " << setw(4<< a[i<< endl;
  43:     }
  44:     cout << "----------------" << endl;
  45:     cout << "合計     " << setw(4<< sum << endl;
  46:     cout << "平均     " << fixed << setprecision(1<< avg << endl;
  47: 
  48:     return (0);
  49: }

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

Pythonの辞書

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

   9: import sys
  10: from statistics import mean
  11: 
  12: #配列(辞書)
  13: 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}
  14: 
  15: #合計
  16: sum = sum(a.values());
  17: #平均
  18: avg = mean(a.values());
  19: 
  20: #出力
  21: print("出席番号  点数");
  22: print("----------------");
  23: for key, val in a.items():
  24:     sys.stdout.write(" {0:2d}".format(key))
  25:     sys.stdout.write("      {0:4d}".format(val))
  26:     print()
  27: print("----------------");
  28: print("合計     {0:4d}".format(sum));
  29: print("平均     {0:4.1f}".format(avg));

(この項おわり)
header