◎第10回 複合データとデータ構造
◇下へ・一覧へ
○テキスト
4章(4.2)
6章(ただし、データ構造についてのみ)
◇下へ・上へ
○配列 変数を順にならべたもの
同じ型のデータの集まり
個々の変数を配列要素と呼び、添字の番号で順に取り扱える
( 添字 subscript )
○ポインタと配列
Cにおいては、ポインタと配列の間に強い関係がある。
配列の添字を使って実行できる操作はポインタでもできる。
int a[10]; /* 大きさが10の配列a */
int *pa; /* 整数へのポインタ */
pa= &a[0]; /* aの0番目の要素を指すようにpaをセット */
この代入の後では、paとaは同じ値をもつ。つまりpa= &a[0];という
代入式は pa=a;のようにも書ける。
[注意]ポインタは変数だから、pa=a、pa++のような演算可能
配列名は変数ではないので、a=pa、a++は正しくない
◇下へ・上へ
○構造体 Pascalではレコード
異なる(かもしれない)型のデータの集まり
メモリ内の連続した場所に並べてあり、要素に名前をつけて指定する
C では struct、 Pascal では record
(よく使われる例)
給料支払いレコード
従業員‥‥名前、住所、社会保険番号、給料などの属性の集合
グラフィックス
一つの点‥‥一対の座標
長方形‥‥‥一対の点
・構造体の宣言
struct タグ名 { struct point{
型名1 メンバー名1;(構造体の中の変数名) int x;
型名2 メンバー名2; int y;
... ...
}; };
・構造体変数の宣言
(構造体の宣言の後に)
struct タグ名 変数名1,変数名2, ...; struct point pt1,pt2;
(変数pt1,pt2は struct point型の構造体)
・構造体配列変数の宣言
(構造体の宣言の後に)
struct タグ名 配列名1[大きさ]; struct point takakukei[50];
特定のメンバーの参照の仕方…構造体変数の後にピリオドをつける
「構造体変数名.メンバー名」
例:点pt1の座標を印字する printf("%d,%d",pt1.x,pt1.y);
◇下へ・上へ
(例1) 2次元平面内の点(平面ベクトル)と三角形
struct point2d{ /* 構造体 point2d を宣言 */
double x; /* メンバー名 x */
double y; /* メンバー名 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 x座標、y座標で構成される構造体pointを定義し(両座標は
整数であるとする)、2点pt1,pt2の座標を印字するプログラムを
作成せよ。(解答例)
10.3 次に示すプログラムについて以下の演習を行なえ。
a) 線形リストプログラム を実行し、リスト構造のデータの順番を表示せよ。
(解答例)
b) data メンバーの値が昇順に表示されるように、プログラムの
「データの代入」の root および、各 next メンバーの代入部分の
データのみを直接変えよ。 (プログラムを実行して確認する。) (解答例)
◇一覧へ・上へ
○レポート課題10
10.1 スタックあるいは待ち行列を、配列で実現する方法と線形リスト
で実現する方法との長所、短所を簡単に述べよ。(手書きで良い)
(テキストp153【復習6.1】)
10.2 演習10.2を利用して、n角形の各点の座標を印字するプログラム
を作成し、実行せよ。構造体配列変数を用いなさい。
10.3 演習10.3の線形リストプログラム のリストを順にたどって
data メンバーの総和を求めるプログラムを作成し、実行せよ。
プログラムと実行結果のスクリプトを提出すること。
【余裕のある人】はここをクリック!