プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌 前回までの復習 構造体 typedef 構造体のサイズ 構造体の応用 関数の引数に構造体を使う 関数の引数に構造体へのポインタを使う 構造体の配列 今日学ぶこと 共用体(union type) 列挙(enumerated type) 構造体、構造体のポインタ、typedefなどを用 いた、リンクトリストの実装例 共用体 異なる型を持つ値を保持する ただし、同時に一つの値しか保持できない 共用体型の宣言 union 共用体型名 { 型名 識別子; 型名 識別子; … }; 共用体の例 Sample11.cを打ち込んで、コンパイル・実行し てみよう union YearにtypedefでYearという型名を与え ている メンバーが異なる型の場合、unionのサイズ (sizeof 演算子の結果)はどうなるか? 試してみよう! 列挙型 識別子を値として格納できる型 構文 例 enum 列挙型名 {識別子1, 識別子2,…}; enum Week {SUN, MON, TUE, WED, THU, FRI, SAT}; enum Week型の変数には、SUNからSATまでのいず れかを保持できる Sample12.cを入力し、コンパイル・実行してみよう 列挙型を使うと、プログラムが分かりやすくなる 列挙型の数値を指定する 列挙型は、内部的には0から順に1づつ増え る整数が割り当てられている 例 typedef enum Week {SUN, MON, TUE, WED, THU, FRI, SAT} Week; この例だと、Week型は0から6までの整数値 値を明示的に割り当てることも出来る typedef enum Week {SUN, MON = 0, TUE = 5,…}; のように 列挙型とマクロを比較する マクロを使っても、同様にプログラムを読みや すくすることが出来る: #define SUN 0 などなど(教科書p. 381) 列挙型は自動的に値を割り振ってくれる デバッガでプログラムを追跡する際に、列挙 子型の識別子名が表示される(かも) 列挙子型のスコープは定義されたブロックで あること リンクトリスト(Linked List) データが数珠つながりになったようなデータ 構造(それぞれをノードnodeという) シーケンシャルアクセス(始めから順にしかア クセスできない) 途中にノードを挿入することが容易 次のノードには容易にアクセスできる 前のノードへのアクセスは困難 この点は、次にやるダブルリンクトリストを使うと 解消できる リンクトリストの実装 実装は、構造体を使う データそのものを表すメンバ 次の構造体を指すポインタ 構造体へのポインタをメンバに 次のような構造体を考えてみよう struct _Node { char *contents; struct _Node *next; }; 保持するデータは、contentsが指す文字列 nextは、次の構造体を指すポインタ typedefで詳細を隠蔽 typedef struct _Node { char *contents; struct _Node *next; } *Node これで、Node型が定義された. 実際は、struct _Node 型のポインタだが、そ のことは使う人には意識させない メンバーへのアクセス Node型は、struct _Node型へのポインタなの で、 Node n; n->contents = “abc”; のようになるが、マクロを使って、実装の詳細 を隠蔽する #define NODE_GET_CONTENTS(n) (n)->contents #define NODE_GET_NEXT(n) (n)->next メンバへの代入も同様に、マクロで定義する 実装の詳細の隠蔽:メリット 実装の詳細を隠蔽(typedefなど) 使い方だけを公開(マクロによるアクセサ accesser) メリット? 後から内部の実装を変更できる コードの不要な部分を知らなくても使えるようにす る 今日学んだこと 共用体(union type) 列挙(enumerated type) 構造体、構造体のポインタ、typedefなどを用 いた、リンクトリストの実装例 レポート課題 (1)二つのリンクトリストsl1, sl2が与えられた とき、sl1の末尾にsl2を連結する関数、void sllist_append (SLList sl1, SLList sl2) を書け sl1の最後のノードまで読み飛ばし、sl1の最後の ノードの次を、sl2のheadにすればよい (2)リンクトリストについて、文献などを調査し たことを簡潔にまとめよ. レポート課題 締め切り:2005年1月10日一杯(日本時間で) 提出:メールで木村([email protected])まで. 感想などあると木村が喜びます
© Copyright 2024 ExpyDoc