◎第10回 複合データとデータ構造
◇下へ・一覧へ
○テキスト
4章(4.2)
6章(ただし、データ構造についてのみ)
◇下へ・上へ
○配列 添字つき変数
同じ型のデータの集まり
個々の変数を配列要素と呼び、番号で順に取り扱える
( 添字 subscript )
◇下へ・上へ
○構造体 Pascalではレコード
異なる(かもしれない)型のデータの集まり
メモリ内の連続した場所に並べてあり、要素に名前をつけて指定する
C では struct、 Pascal では record
(よく使われる例)
給料支払いレコード
従業員‥‥名前、住所、社会保険番号、給料などの属性の集合
グラフィックス
一つの点‥‥一対の座標
長方形‥‥‥一対の点
・構造体の宣言
struct タグ名 { struct point{
型名1 メンバー名1;(構造体の中の変数名) int x;
型名2 メンバー名2; int y;
... ...
}; };
・構造体変数の宣言
(構造体の宣言の後に)
struct タグ名 変数名1,変数名2, ...; struct point pt;
(変数pt は struct point型の構造体)
・構造体配列変数の宣言
(構造体の宣言の後に)
struct タグ名 配列名1[大きさ]; struct point takakukei[50];
特定のメンバーの参照の仕方…構造体変数の後にピリオドをつける
「構造体変数名.メンバー名」
例:点ptの座標を印字する print("%d,%d",pt.x,pt.y);
◇下へ・上へ
(例1) 2次元平面内の点(平面ベクトル)と三角形
struct point2d{ /* 構造体 point2d を宣言 */
double x,y; /* メンバー名 x,y */
};
struct triangle{ /* 構造体 triangle を宣言 */
struct point2d pt1,pt2,pt3;
};
/* 変数 pt1,pt2,pt3 は struct point2d型の変数 */
(triangle 構造体は point2d 構造体を含んでいる)
struct triangle screen;
/* 変数 screen を宣言 */
(このように宣言すると screen.pt1.x は
screenの pt1メンバーの x座標を表す)
◇下へ・上へ
(例2) 学生記録用構造体 (視力検査の記録)
struct gakusei{ /* 学生記録用構造体の宣言 */
int id; /* 学籍番号 */
char name[100]; /* 名前100 文字分(英字換算) */
double shiryoku_r, shiryoku_l; /* 視力(右と左) */
};
struct gakusei students[200]; /* 学生記録用配列の宣言 */
◇下へ・上へ
(例3) 複素数…C では、複素数を直接に扱うことはできないので、
構造体を利用して表現する場合が多い
struct complex{ /* 構造体 complexの宣言 */
double re, im; /* re を実部、im を虚部とする */
};
struct complex z1,z2,z3,zi; /* 複素数構造体変数の宣言 */
complex はプログラム作成者が、任意につけた名前であり、
したがって、実際の意味づけはプログラム作成者が行なう。
このように定義したからといって、複素数の演算が行なえるわけではない。
(複素数の演算プログラム)
◇下へ・上へ
◯データ構造 データ単独ではなくデータとデータの関係の表現
データの集まりを作り出す方法を利用して作られた構造をもつデータ
例:スタック、キュー、リスト、ツリーなど
・スタック stack
最後に入れたデータが最初にとりだされる記憶場所群の概念
入れた逆順に取り出す First In Last Out
基本操作 Push データを入れる
Pop データを取り出す
・キュー queue
待ち行列 First In First Out FIFO 順番は維持
基本操作 配列の下端と上端をつないで循環的に使用する
リングバッファ( 入れる 出す )
使用例
ウインドウシステム(X端末)のキー入力、マウス入力など
Unix のプリンタ制御
マルチタスクでの仕事の切換え
◇下へ・上へ
・リスト
ある要素が次の要素の記憶場所を保持することにより、
一連の要素をメモリ中の不連続な位置に格納する。「いもづる」式
特徴 … 挿入 / 削除 が容易
「n番目」を調べるに手間がかかる
struct node { double data; int next;};
リストのプログラミング例
(双方向リスト:前の要素位置も保持することで、両方向にたどれる
struct node { double data; int next, prev;}; )
◇下へ・上へ
・ツリー
木が枝分れするように複数の方向に分岐しているリスト
枝分れが二つ 2進木 binary tree
使用例
lisp ( emacs mule の内部で使われている )
数式の表現(解析)
モールス符号の解読
データ圧縮に用いられる可変長符号の表現
◇下へ・上へ
○演習10
10.1 配列の要素の操作についての以下のプログラムを作れ。
double a[10], b[10];(それぞれ10個の要素をもつ)
1) 配列 a の全要素を 配列 b にコピーする。PAD (解答例)
2) 配列 a の 0 から 8 の要素の内容を、同じ配列 a の 1 から 9 の要素に
それぞれコピー(移動)する。
実行後のa[0]には何が入っているか考えよ。 (解答例)
注意:手順をうまく考えないと全部同じになる
10.2 次に示すプログラムについて以下の演習を行なえ。
a) 線形リストプログラム を実行し、リスト構造のデータの順番を表示せよ。
(解答例)
b) data メンバーの値が昇順に表示されるように、プログラムの
「データの代入」の root および、各 next メンバーの代入部分の
データのみを直接変えよ。 (プログラムを実行して確認する。) (解答例)
◇一覧へ・上へ
○レポート課題10
10.1 同一のデータ群を配列に格納する場合と、線形リストに格納する
場合について、以下の比較を行い、その理由を簡単に説明せよ。
(手書きでよい)
(a)配列のほうが簡単に実現できる操作をあげよ。
(b)線形リストのほうが簡単に実現できる操作をあげよ。
10.2 キーボードから入力した文字列を、順方向およびうしろから逆順に
表示するプログラムを作成し、実行せよ。(演習8-2を参考にする)
10.3 演習10.2に示したプログラムのリストを順にたどって
data メンバーの総和を求めるプログラムを作り、実行せよ。
プログラムと実行結果のスクリプトを提出すること。
【余裕のある人】
10.4 本文中で定義した学生記録用構造体を利用して、学籍番号と名前
(ローマ字で良い)を入力した後に、それらを表示するプログラム
を作成する。プログラムリストとその実行結果を提出せよ。
*入力する学生については、出席リスト上の任意の3人を選びなさい。