4
◇下へ・一覧へ ○テキスト 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 a,b,c; /* 変数 a,b,c は struct point2d型の変数 */ }; (triangle 構造体は point2d 構造体を含んでいる) struct triangle screen; /* 変数 screen を宣言 */ (このように宣言すると screen.a.x は screenの aメンバーの 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 にコピーする。 2) 配列 a の 0 から 8 の要素の内容を、同じ配列 a の 1 から 9 の要素に それぞれコピー(移動)する。 注意:手順をうまく考えないと全部同じになる 10.2 次に示すプログラムについて以下の課題を行なえ。 a) このプログラムを実行し、リスト構造のデータの順番を表示せよ。 b) data メンバーの値が昇順に表示されるように、プログラムの 「データの代入」の root および、各 next メンバーの代入部分の データのみを直接変えよ。 (プログラムを実行して確認する。) c) リストを順にたどって data メンバーの総和を求めるプログラム を作り実行せよ。 ◇一覧へ・上へ #include <stdio.h> #define N 100 main() { struct node{ double data; int next; }; struct node node[N];/* 構造体タグ名と配列名はこの例のように、*/ int root; /* 同じでも良いし、異なっていてもよい */ int p; /* データの代入 */ root=3; node[0].data=5.8409 ; node[0].next=2; node[1].data=3.90478 ; node[1].next=8; node[2].data=6.91004 ; node[2].next=9; node[3].data=8.40485 ; node[3].next=5; node[4].data=8.57378 ; node[4].next=7; node[5].data=3.18693 ; node[5].next=0; node[6].data=6.04144 ; node[6].next=1; node[7].data=8.46476 ; node[7].next=-1; node[8].data=2.98526 ; node[8].next=4; node[9].data=1.63546 ; node[9].next=6; p=root; while( p != -1 ){ printf("%g\n", node[p].data ); p=node[p].next; } exit(1); }