Transcript PowerPoint版
プログラミング演習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])まで.
感想などあると木村が喜びます