これまで習った「配列」は,要素が直線状に並ぶデータ形式であった。一次元データの代表的な例としては,温度や電圧などの時系列データが挙げられる。一方,画像などは二次元的にデータが並ぶ形式である。今回の演習では,二次元データをプログラム中で操作する方法を学ぶ。
例えば下に示すような成績表は,出席番号と科目という 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科目分の記憶場所を確保する) |
|
宣言と同時に初期化 (括弧の対応,カンマの区切り方に注意) |
seiseki[0][1] = 0; |
代入。 この例では出席番号 1 番の力学の点数を 0 にする。 |
printf("%d¥n", seiseki[1][0]); |
参照。 この例では出席番号 2 番の語学の点数が画面に表示される。 |
二次元配列の宣言,使用法は基本的には一次元配列と同じく
[0][0]
から seiseki[5][1]
まで参照,および代入が可能。である。
コンピュータの中では,二次元配列を一次元配列でも表せる。上記の例の場合,
int seiseki[12]={ 65, 71,
84, 83,
74, 74,
90, 90,
87, 78,
93, 95};
と書き表し,seiseki[行数*2 + 列] で参照すれば,同じ結果が得られる。試してみよう。
表の水色の部分のデータを二次元配列として定義する。
出席番号 | 語学 | 力学 | 合計 |
1 | 65 | 71 | ? |
2 | 84 | 83 | ? |
3 | 74 | 74 | ? |
4 | 90 | 90 | ? |
5 | 87 | 78 | ? |
6 | 93 | 95 | ? |
平均点 | ? | ? | ? |
(1) 各人の2科目の合計点を計算し,画面に表示する。
(2) 各科目の平均点を計算し,画面に表示する。(配列に格納する必要はない)
(3) 配列の定義を一次元配列に置き換えて,コンピュータの中で二次元配列がどのように扱われているのか,確認する。
画像データ(グラフィックス)は,二次元配列を用いる典型的な例です。通常、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 } };
課題1において,氏名がデータとして与えられたとき,各人の名前と平均点を表示する方法を考えよ。
出席番号 | 名前 | 語学 | 力学 | 平均点 |
1 | 佐藤 | 65 | 71 | ? |
2 | 鈴木 | 84 | 83 | ? |
3 | 高橋 | 74 | 74 | ? |
4 | 田中 | 90 | 90 | ? |
5 | 渡辺 | 87 | 78 | ? |
6 | 伊藤 | 93 | 95 | ? |
(1)50人分の名前とテスト結果をファイル(50data.txt)から読み込み,画面に表示せよ。
(2)平均点,標準偏差を求めよ。
(3)各人の偏差値を求めて,名前と偏差値を画面に表示しなさい。