◎第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 メンバーの総和を求めるプログラムを作成し、実行せよ。 プログラムと実行結果のスクリプトを提出すること。 【余裕のある人】はここをクリック!
一覧へ