Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.

Similar presentations


Presentation on theme: "プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌."— Presentation transcript:

1 プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌

2 前回までの復習 構造体 typedef 構造体のサイズ 構造体の応用 関数の引数に構造体を使う 関数の引数に構造体へのポインタを使う
構造体の配列

3 今日学ぶこと 共用体(union type) 列挙(enumerated type)
構造体、構造体のポインタ、typedefなどを用いた、リンクトリストの実装例

4 共用体 異なる型を持つ値を保持する ただし、同時に一つの値しか保持できない 共用体型の宣言 union 共用体型名 { }; 型名 識別子;
型名 識別子; };

5 共用体の例 Sample11.cを打ち込んで、コンパイル・実行してみよう
union YearにtypedefでYearという型名を与えている メンバーが異なる型の場合、unionのサイズ(sizeof 演算子の結果)はどうなるか? 試してみよう!

6 列挙型 識別子を値として格納できる型 構文 例 enum Week型の変数には、SUNからSATまでのいずれかを保持できる
enum Week {SUN, MON, TUE, WED, THU, FRI, SAT}; enum Week型の変数には、SUNからSATまでのいずれかを保持できる Sample12.cを入力し、コンパイル・実行してみよう 列挙型を使うと、プログラムが分かりやすくなる

7 列挙型の数値を指定する 列挙型は、内部的には0から順に1づつ増える整数が割り当てられている 例 値を明示的に割り当てることも出来る
typedef enum Week {SUN, MON, TUE, WED, THU, FRI, SAT} Week; この例だと、Week型は0から6までの整数値 値を明示的に割り当てることも出来る typedef enum Week {SUN, MON = 0, TUE = 5,…}; のように

8 列挙型とマクロを比較する マクロを使っても、同様にプログラムを読みやすくすることが出来る: 列挙型は自動的に値を割り振ってくれる
#define SUN 0 などなど(教科書p. 381) 列挙型は自動的に値を割り振ってくれる デバッガでプログラムを追跡する際に、列挙子型の識別子名が表示される(かも) 列挙子型のスコープは定義されたブロックであること

9 リンクトリスト(Linked List) データが数珠つながりになったようなデータ構造(それぞれをノードnodeという)
シーケンシャルアクセス(始めから順にしかアクセスできない) 途中にノードを挿入することが容易 次のノードには容易にアクセスできる 前のノードへのアクセスは困難 この点は、次にやるダブルリンクトリストを使うと解消できる

10 リンクトリストの実装 実装は、構造体を使う データそのものを表すメンバ 次の構造体を指すポインタ

11 構造体へのポインタをメンバに 次のような構造体を考えてみよう struct _Node { char *contents;
struct _Node *next; }; 保持するデータは、contentsが指す文字列 nextは、次の構造体を指すポインタ

12 typedefで詳細を隠蔽 typedef struct _Node { char *contents;
struct _Node *next; } *Node これで、Node型が定義された. 実際は、struct _Node 型のポインタだが、そのことは使う人には意識させない

13 メンバーへのアクセス Node型は、struct _Node型へのポインタなので、 Node n;
n->contents = “abc”; のようになるが、マクロを使って、実装の詳細を隠蔽する #define NODE_GET_CONTENTS(n) (n)->contents #define NODE_GET_NEXT(n) (n)->next メンバへの代入も同様に、マクロで定義する

14 実装の詳細の隠蔽:メリット 実装の詳細を隠蔽(typedefなど) 使い方だけを公開(マクロによるアクセサ accesser) メリット?
後から内部の実装を変更できる コードの不要な部分を知らなくても使えるようにする

15 今日学んだこと 共用体(union type) 列挙(enumerated type)
構造体、構造体のポインタ、typedefなどを用いた、リンクトリストの実装例

16 レポート課題 (1)二つのリンクトリストsl1, sl2が与えられたとき、sl1の末尾にsl2を連結する関数、void sllist_append (SLList sl1, SLList sl2) を書け sl1の最後のノードまで読み飛ばし、sl1の最後のノードの次を、sl2のheadにすればよい (2)リンクトリストについて、文献などを調査したことを簡潔にまとめよ.

17 レポート課題 締め切り:2005年1月10日一杯(日本時間で) 提出:メールで木村(iwao@sci.toyama-u.ac.jp)まで.
感想などあると木村が喜びます


Download ppt "プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌."

Similar presentations


Ads by Google