PowerPoint版

Download Report

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])まで.
感想などあると木村が喜びます