第11回:二次元配列

これまで習った「配列」は,要素が直線状に並ぶデータ形式であった。一次元データの代表的な例としては,温度や電圧などの時系列データが挙げられる。一方,画像などは二次元的にデータが並ぶ形式である。今回の演習では,二次元データをプログラム中で操作する方法を学ぶ。

例えば下に示すような成績表は,出席番号と科目という 2つの要素(行,列)から成り立っている。(一行目,一列目は,それぞれコメントで,実際のデータではない)

出席番号  語学  力学
1 65 71
2 84 83
3 74 74
4 90 90
5 87 78
6 93 95

この表に示す様なデータを,プログラム中で効率よく扱うために二次元配列を用いる。

int seiseki[6][2]; 二次元配列の宣言。[6][2]は配列の大きさ。
(行6人分,列2科目分の記憶場所を確保する)
int seiseki[6][2]={ {65, 71 } ,
                    {84, 83 } ,
                    {74, 74 } ,
                    {90, 90 } ,
                    {87, 78 } ,
                    {93, 95 }  };
宣言と同時に初期化
(括弧の対応,カンマの区切り方に注意)
seiseki[0][1] = 0; 代入。
この例では出席番号 1 番の力学の点数を 0 にする。
printf("%d¥n", seiseki[1][0]); 参照。
この例では出席番号 2 番の語学の点数が画面に表示される。

二次元配列の宣言,使用法は基本的には一次元配列と同じく

  1. 配列の添え字はそれぞれ 0 から始まる。
  2. 添え字は(配列の要素数 - 1)まで使用可能。上の例では seiseki[0][0] から seiseki[5][1] まで参照,および代入が可能。
  3. 配列名の命名規則は予約語を除く a-z, A-Z, 0-9, _ の組み合わせ。一般の変数と同じ。

である。

コンピュータの中では,二次元配列を一次元配列でも表せる。上記の例の場合,

int seiseki[12]={ 65, 71, 84, 83, 74, 74, 90, 90, 87, 78, 93, 95};

と書き表し,seiseki[行数*2 + 列] で参照すれば,同じ結果が得られる。試してみよう。


課題1

表の水色の部分のデータを二次元配列として定義する。

出席番号  語学   力学 合計
1 65 71
2 84 83
3 74 74
4 90 90
5 87 78
6 93 95
平均点

(1) 各人の2科目の合計点を計算し,画面に表示する。

(2) 各科目の平均点を計算し,画面に表示する。(配列に格納する必要はない)

(3) 配列の定義を一次元配列に置き換えて,コンピュータの中で二次元配列がどのように扱われているのか,確認する。


課題2

画像データ(グラフィックス)は,二次元配列を用いる典型的な例です。通常、2値画像(”0”か”1”かで白黒を判定する画像)において”0”は”白”を、”1”は”黒”を表します。下記の二次元配列で”1”の箇所には黒を、”0”の箇所には白を画面に表示するようなプログラムを組もう。また,白黒を反転させてみよう。

int a[8][8]={ {1, 0, 0, 0, 0, 0, 0, 1 } ,
{0, 1, 0, 0, 0, 0, 1, 0 } ,
{0, 0, 1, 0, 0, 1, 0, 0 } ,
{0, 0, 0, 1, 1, 0, 0, 0 } ,
{0, 0, 0, 1, 1, 0, 0, 0 } ,
{0, 0, 1, 0, 0, 1, 0, 0 } ,
{0, 1, 0, 0, 0, 0, 1, 0 } ,
{1, 0, 0, 0, 0, 0, 0, 1 } };

課題3

課題1において,氏名がデータとして与えられたとき,各人の名前と平均点を表示する方法を考えよ。

出席番号 名前  語学   力学 平均点
1 佐藤 65 71
2 鈴木 84 83
3 高橋 74 74
4 田中 90 90
5 渡辺 87 78
6 伊藤 93 95

課題4

(1)50人分の名前とテスト結果をファイル(50data.txt)から読み込み,画面に表示せよ。
(2)平均点,標準偏差を求めよ。
(3)各人の偏差値を求めて,名前と偏差値を画面に表示しなさい。

偏差値