◎第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人を選びなさい。
一覧へ