第2回

Size: px
Start display at page:

Download "第2回"

Transcription

1 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 第 回基本データ構造 連結リストとその操作 -. リスト構造 データ部 と ポインタ部 で構成され ポインタをたどることによりデータを扱うことができる構造 -. 単方向リストとその操作 --. 単方向リスト 次のデータへのポインタを つだけ持っているデータ構造 ( データ部は 複数のデータを持っている場合もある ) データ部 ポインタ部 ノード リストを構成する要素のことを ノード (node) という --. 単方向リストを実現するデータ構造 struct singly_list int value; /* データ */ struct singly_list *next; /* 次へのポインタ */ --. 挿入 p 挿入する新しいノード p [/]

2 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page ポインタによって指されているノード p の次に新しいノードを挿入する #include <stdio.h> #include <stdlib.h> struct singly_list /* 単方向リストの構造体定義 */ int value; /* データ */ struct singly_list *next; /* 次へのポインタ */ struct singly_list *g_top; /* 単方向リストの先頭へのポインタ */ void init( void ); struct singly_list *insert( struct singly_list *p, int value ); int main( void ) struct singly_list *now; init(); now = insert( g_top, ); /* 先頭のノードの次に挿入 */ now = insert( g_top, ); /* 先頭のノードの次に挿入 */ now = insert( g_top->next, ); /* 先頭のノードの次の次に挿入 */ now = insert( now, ); /* 新たに追加したのノードの次に挿入 */ return ( 0 ); /* ポインタによって指されているノード p の次に新しいノードを挿入する */ /* 新しいノードへ格納する値も設定する */ /* 戻り値は 正常時 : 挿入したノードのポインタエラー時 :NULL */ struct singly_list *insert( struct singly_list *p, int value ) struct singly_list *new_node; new_node = malloc( sizeof( struct singly_list ) ); if ( new_node!= NULL ) /* 新たなノードが生成できたら */ new_node->next = p->next; /* 新たなノードからのリンクを接続する */ p->next = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->value = value; /* 新たなノードの値を格納する */ return ( new_node ); void init( void ) /* 単方向リストの先頭のノードを生成する */ g_top = malloc( sizeof( struct singly_list ) ); if ( g_top!= NULL ) /* 新たなノードが生成できたら */ g_top ->next = NULL; /* 次のノードは存在しないので NULL */ g_top ->value = 0; /* とりあえず初期値を 0 と設定 */ [/]

3 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page --. 削除 p 削除するノード p ポインタによって指されているノード p の次のノードを削除する #include <stdio.h> #include <stdlib.h> struct singly_list /* 単方向リストの構造体定義 */ int value; /* データ */ struct singly_list *next; /* 次へのポインタ */ struct singly_list *g_top; /* 単方向リストの先頭へのポインタ */ struct singly_list *delete( struct singly_list *p ); int main( void ) /* 初期化と push は省略 */ delete( g_top ); /* 先頭のノードの次を削除 */ delete( g_top->next ); /* 先頭のノードの次の次を削除 */ return ( 0 ); /* ポインタによって指されているノード p の次のノードを削除する */ void delete( struct singly_list *p ) struct singly_list *delete_node; delete_node = p->next; if ( delete_node!= NULL ) /* 削除するノードが存在したら */ p->next = delete_node->next; /* 次のノードへリンクをつなぎ替える */ free( delete_node ); /* 削除するノードをメモリから解放する */ [/]

4 -. 双方向リストとその操作 --. 双方向リスト 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 次のデータと前のデータへのポインタを両方持っているデータ構造 ( データ部は 複数のデータを持っている場合もある ) --. 双方向リストを実現するデータ構造 struct doubly_list int value; /* データ */ struct doubly_list *pre; /* 前へのポインタ */ struct doubly_list *next; /* 次へのポインタ */ --. 挿入 p 挿入する新しいノード p [/]

5 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page () ポインタによって指されているノード p の次に新しいノードを挿入する #include <stdio.h> #include <stdlib.h> struct doubly_list /* 双方向リストの構造体定義 */ int value; /* データ */ struct doubly_list *pre; /* 前へのポインタ */ struct doubly_list *next; /* 次へのポインタ */ struct doubly_list *g_top; /* 双方向リストの先頭へのポインタ */ struct doubly_list *g_end; /* 双方向リストの末尾へのポインタ */ void init( void ); struct doubly_list *insert_next( struct doubly_list *p, int value ); int main( void ) struct doubly_list *now; init(); now = insert_next( g_top, ); /* 先頭のノードの次に挿入 */ now = insert_next( g_top, ); /* 先頭のノードの次に挿入 */ now = insert_next( g_top->next, ); /* 先頭のノードの次の次に挿入 */ now = insert_next( now, ); /* 新たに追加したのノードの次に挿入 */ return ( 0 ); /* ポインタによって指されているノードpの次に新しいノードを挿入する */ /* 新しいノードへ格納する値も設定する */ /* 戻り値は 正常時 : 挿入したノードのポインタエラー時 :NULL */ struct doubly_list *insert_next( struct doubly_list *p, int value ) struct doubly_list *new_node; new_node = malloc( sizeof( struct doubly_list ) ); if ( new_node!= NULL ) /* 新たなノードが生成できたら */ new_node->pre = p; /* 新たなノードからのリンクを接続する */ new_node->next = p->next; /* 新たなノードからのリンクを接続する */ p->next = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->next->pre = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->value = value; /* 新たなノードの値を格納する */ return ( new_node ); void init( void ) /* 双方向リストの先頭のノードを生成する */ g_top = malloc( sizeof( struct doubly_list ) ); g_end = malloc( sizeof( struct doubly_list ) ); if ( (g_top!= NULL) && (e_end!= NULL) ) /* 新たなノードが生成できたら */ g_top->pre = NULL; /* 先頭の前のノードは存在しないので NULL */ g_top->next = g_end; /* 先頭の次のノードは g_end */ g_end->pre = g_top; /* 末尾の前のノードは g_top */ g_end->next = NULL; /* 末尾の次のノードは存在しないので NULL */ g_top->value = 0; /* とりあえず初期値を0と設定 */ g_end->value = 0; /* とりあえず初期値を0と設定 */ [/]

6 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page () ポインタによって指されているノード p の場所に新しいノードを挿入する #include <stdio.h> #include <stdlib.h> struct doubly_list /* 双方向リストの構造体定義 */ int value; /* データ */ struct doubly_list *pre; /* 前へのポインタ */ struct doubly_list *next; /* 次へのポインタ */ struct doubly_list *g_top; /* 双方向リストの先頭へのポインタ */ struct doubly_list *g_end; /* 双方向リストの末尾へのポインタ */ void init( void ); struct doubly_list *insert_now( struct doubly_list *p, int value ); int main( void ) struct doubly_list *now; init(); now = insert_now( g_end, ); /* 末尾のノードに挿入 */ now = insert_now( now, ); /* 新たに追加したノードに挿入 */ now = insert_now( now->next, ); /* 新たに追加したノードの次に挿入 */ now = insert_now( now, ); /* 新たに追加したノードに挿入 */ return ( 0 ); /* ポインタによって指されているノードpの場所に新しいノードを挿入する */ /* 新しいノードへ格納する値も設定する */ /* 戻り値は 正常時 : 挿入したノードのポインタエラー時 :NULL */ struct doubly_list *insert_now( struct doubly_list *p, int value ) struct doubly_list *new_node; new_node = malloc( sizeof( struct doubly_list ) ); if ( new_node!= NULL ) /* 新たなノードが生成できたら */ new_node->pre = p->pre; /* 新たなノードからのリンクを接続する */ new_node->next = p; /* 新たなノードからのリンクを接続する */ p->pre->next = new_node; /* 新たなノードへリンクをつなぎ替える */ p->pre = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->value = value; /* 新たなノードの値を格納する */ return ( new_node ); void init( void ) /* 双方向リストの先頭のノードを生成する */ g_top = malloc( sizeof( struct doubly_list ) ); g_end = malloc( sizeof( struct doubly_list ) ); if ( (g_top!= NULL) && (e_end!= NULL) ) /* 新たなノードが生成できたら */ g_top->pre = NULL; /* 先頭の前のノードは存在しないので NULL */ g_top->next = g_end; /* 先頭の次のノードは g_end */ g_end->pre = g_top; /* 末尾の前のノードは g_top */ g_end->next = NULL; /* 末尾の次のノードは存在しないので NULL */ g_top->value = 0; /* とりあえず初期値を0と設定 */ g_end->value = 0; /* とりあえず初期値を0と設定 */ [/]

7 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 削除 p 削除するノード p ポインタによって指されているノード p を削除する #include <stdio.h> #include <stdlib.h> struct doubly_list /* 双方向リストの構造体定義 */ int value; /* データ */ struct doubly_list *pre; /* 前へのポインタ */ struct doubly_list *next; /* 次へのポインタ */ struct doubly_list *g_top; /* 双方向リストの先頭へのポインタ */ struct doubly_list *g_end; /* 双方向リストの末尾へのポインタ */ struct doubly_list *delete_now( struct doubly_list *p ); int main( void ) /* 初期化と push は省略 */ delete( now ); /* 現在のノードを削除 */ delete( now->next ); /* 現在のノードの次を削除 */ return ( 0 ); /* ポインタによって指されているノード p を削除する */ void delete_now( struct doubly_list *p ) if ( p!= NULL ) /* 削除するノードが存在したら */ p->pre->next = p->next; /* 前のノードのリンクをつなぎ替える */ p->next->pre = p->pre; /* 次のノードのリンクをつなぎ替える */ free( p ); /* 削除するノードをメモリから解放する */ [7/]

8 -. 木構造 (tree structure) 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 8 階層の上位から下位に節点をたどることにより データを取り出すことができる構造 root ( ルート ) branch ( ブランチ ) leaf ( リーフ ) の部分を 節 (node) の部分を 枝 (branch) という 特に 最上位の節 ( 赤の節 ) を 根 (root) 最下位の節 ( 緑の節 ) を 葉 (leaf) という さらに 木構造の各節どうしには親子関係があり 上位の節を 親 下位の節を 子 という よって 根 は 親がない節 葉 は 子がない節 ということもできる また 節にぶら下がっている部分を 部分木 という 部分木をさらに区別して 節の左側のものを 左部分木 節の右側の部分を 右部分木 という 右図の例の場合 の子は と の子は と の親は の親は の左部分木は の右部分木は の左部分木は の右部分木は [8/]

9 -. 木構造の種類 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 分木 (binary tree) すべての枝の分岐が 高々 つ であるもの --. 完全 分木 (complete binary tree) 分木のうち 根から葉までの深さがすべて等しいもの --. 分探索木 (binary search tree) 各節において 左の子 < 親 < 右の子の関係になっているもの 根から葉へ向かって データを探索するときに利用される --. ヒープ木 (heap tree) 各節における大小関係が すべての節において親 < 子の関係になっているか 親 > 子の関係になっているもの 親 < 子の関係のヒープ木の場合は 根が最小値となり 親 > 子の関係のヒープ木の場合は 根が最大値となる データを整列するときに利用される -. 分木とその操作 --. 分木を実現するデータ構造 struct binary_tree int value; /* データ */ struct binary_tree *left; /* 左の子へのポインタ */ struct binary_tree *right; /* 右の子へのポインタ */ --. 節の挿入と削除 単方向リストでの挿入 削除と 同様の手順で行なう ( 参考 : 第 回 -. 単方向リストとその操作 ) ただし 葉ではない節を削除する際は その節にぶら下がっている子のつなぎ替えを注意して行なう必要がある 高々 : 多くても の意味 高々 つ だと 0 個または 個または 個が該当する [9/]

10 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 0 [0/] --. 挿入 --. 削除 () 子がない場合 () 子が つの場合 new new

11 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page () 子が つの場合 子が つの場合は 子のどちらか ( 仮に 子 A ) を削除する節の場所に移動し もう一方の子 ( 仮に 子 B ) を 子 A の子にする もともと 子 A にも 子が つあった場合は その子のどちらかを順に下の階層に送る [/]

12 -7. 木構造の応用 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page -7-. 四則演算式の解析 コンパイラや簡易言語等で 計算機が数式を構文解析する際 演算子の優先順位に従って数式の構成を解析するときに 木構造が用いられる 例 )(+) (-) という数式の場合 + - このように 分木に展開する 展開のルールは 葉の部分には 数値を置く それ以外の節は 演算子を置く 演算子の優先順位が高いものほど 深い階層 ( 葉に近いほう ) にする 分木に展開した後 ( 左部分木 )( 演算子 )( 右部分木 ) という計算を進めればよい 計算を進めるにあたり 各節に入っているものを つずつ読み出して処理をすることになるのだが 次のような順番で読み出して処理をすることにより プログラム的な処理を簡素化できる + - この読み出し順に従って記述すると 次のようになる [/]

13 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page このように演算子を 計算するつの項の後ろに配置する記法を 逆ポーランド記法 ( 後置記法 ) という この記法の特徴は 演算子の優先順位を考えることなく 括弧を必要としないで 読み出した順番どおりに計算処理を進められることにある 実際に スタックを用いてこの計算をすると 次のようになる 計算処理をする際のルール 数値の項を読み出したら 演算子を読み出したら を積む を積む + の計算をし結果を積む を積む を積む - の計算をし結果を積む の計算をし結果を積む 例 )+ - という数式の場合 - + [/]

14 -7-. データファイルの圧縮 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page コンピュータで扱う電子データは ネットワーク上で送信したり パッケージとして配布したりする場合 ファイルサイズが小さいほうがよい そのために 元のデータを構成している符号を効率よく置き換えることにより 全体の符号長 ( ビット数 ) を小さくする このことを 圧縮 (compress) という その符号置換の方法の一つに ハフマン法 というものがあり 置換符号の生成に 木構造が用いられる ハフマン法文字などの固定長の符号で構成されているデータについて 出現回数が多いものには短いビット列 少ないものには長いビット列に置き換えることにより つあたりの平均ビット長を最小にする符号化方式 例 ) 文字列データの圧縮 'a', 'b', 'c', 'd' の 文字からなるデータで それぞれの出現回数が 0%, 0%, 0%, 0% で ある場合 木への展開の手順は 葉の部分に文字を置き 出現回数の多い順に並べる 最小の つを選んで それらを子にもつ部分木を作る その子の重みの和を 部分木の重みとする を つの木になるまで繰り返す 作成された木の左右の枝に 0 と を割り振っていく 根から葉までをたどり 枝に割り振った 0/ を並べたビット列を 葉の要素に割り当てる 圧縮前の均等の長さに符号が割り振られているものとの比較をすると 文字 a b c d 固定長符号 出現回数 0% 0% 0% 0% ハフマン符号 この表から 圧縮前の固定長では 文字あたりのビット長は bit だが 圧縮後の 文字あたりの平均ビット長は bit 0. + bit 0. + bit 0. + bit 0. = =.7bit となり 仮に 00 文字分のデータの場合 圧縮前 bit 00 = 00 bit が圧縮後.7 bit 00 = 70 bit で 0bit( 文字分 ) 少なくなる a 0% 0 b 0% 0 c 0% 0% 0 d 0% 0% [/]

15 -8. 再帰プログラム 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page -8-. 木構造と再帰関数 木構造は 親と部分木から成り立っており 部分木をみても その中身は ( 新たな ) 親と部分木となっている その性質に着目すると 節をたどっていくときに 部分木の中身をたどる という処理の中でさらに 部分木の中身をたどる という処理が出てくる このように ある処理をする関数の中で その関数自身を呼び出す仕組みを 再帰 (recursive) という また そのように自分のなかで自分自身の関数を呼び出すことを 再帰的に呼び出す ともいう 例 ) 分木の一番深い階層レベルを調べる 関数 kaisou 引数 : その節の階層レベル その節へのポインタ 左部分木はあるか? ない 左のレベルは その階層で終わりなので それが左部分木の階層レベルになる ある 左のレベルを つ増やして 左部分木について関数 kaisou を呼ぶ戻ってきた値が左部分木の深さなので それが左部分木の階層レベルになる 右部分木はあるか? ない 右のレベルは その階層で終わりなので それが右部分木の階層レベルになる ある 右のレベルを つ増やして 右部分木について関数 kaisou を呼ぶ戻ってきた値が右部分木の深さなので それが右部分木の階層レベルになる 左と右の階層レベルのうち より深いほうが その節以下の深さなので それを戻り値とする 関数 kaisou の処理が終了なので 戻る [/]

16 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page struct binary_tree /* 二分木の節の構造体 */ int value; /* データ */ struct binary_tree *left; /* 左の子へのポインタ */ struct binary_tree *right; /* 右の子へのポインタ */ struct binary_tree *root; /* 根のポインタ */ int kaisou( int level, struct binary_tree *sub_tree ) /* 部分木の階層を調べる */ int left_level, right_level; if ( sub_tree->left == NULL ) /* 左部分木の階層を調べる */ left_level = level; else left_level = kaisou( level +, sub_tree->left ); if ( sub_tree->right == NULL ) /* 右部分木の階層を調べる */ right_level = level; else right_level = kaisou( level +, sub_tree->right ); if ( left_level > right_level ) /* 深いほうを戻り値にする */ return ( left_level ); else return ( right_level ); int main( void ) 子がない場合は その枝のポインタは NULL としてデータを作っている tree_entry(); /* 二分木のデータを作る ( 関数の中身は省略 ) */ printf( "deepest level = %d\n", kaisou(, root ) ); /* 根からたどって深さを調べる */ return ( 0 ); 呼ぶ + 呼ぶ 根の左部分木は で右部分木は なので 全体としては 最終的に深いほうの になる + + で戻る この部分木は ( 左が 右が なので深いほうの になる ) この部分木は [/]

17 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 再帰的に呼び出す関数を作る際の注意 自分の関数内で 自分自身を呼び出しているので 終了条件をきちんと設定していないと 無限に呼び続けることになり 終わらなくなってしまう よって 必ず もうこれ以上は呼ばない という条件を設定し 適切に処理を戻す必要がある -8-. 再帰プログラムの例題 ある自然数 n までの総和 (+++ +n) を求めるプログラムを 再帰的に呼び出す関数を用いて作成せよ #include <stdio.h> int sigma( int value ) if ( value == ) else return ( ); return ( + sigma( ) ); int main( void ) int n; printf( "n = " ); scanf( "%d", &n ); if ( n <= 0 ) printf( "Error! Input value is illegal!\n" ); return ( ); printf( "sigma = %d\n", sigma( n ) ); return ( 0 ); この例では エラーチェックが充分でないので n が 0 くらいまでしか正常に動作しない [7/]

18 -9.Appendix 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 単方向リスト操作のプログラム singly_list.c #include <stdio.h> #include <stdlib.h> struct singly_list /* 単方向リストの構造体定義 */ unsigned char value; /* データ */ struct singly_list *next; /* 次へのポインタ */ struct singly_list *g_top; /* 単方向リストの先頭へのポインタ */ void init( void ); struct singly_list *insert( struct singly_list *p, unsigned char value ); void delete( struct singly_list *p ); void disp_list( void ); int main( void ) struct singly_list *now; init(); printf( "init " ); disp_list(); now = insert( g_top, 'A' ); printf( "insert g_top 'A' " ); disp_list(); now = insert( g_top, 'B' ); printf( "insert g_top 'B' " ); disp_list(); now = insert( g_top->next, 'C' ); printf( "insert g_top->next 'C' " ); disp_list(); now = insert( now, 'D' ); printf( "insert now 'D' " ); disp_list(); delete( now ); printf( "delete now " ); disp_list(); delete( g_top ); printf( "delete g_top " ); disp_list(); return ( 0 ); /* ポインタによって指されているノードpの次に新しいノードを挿入する */ /* 新しいノードへ格納する値も設定する */ /* 戻り値は 正常時 : 挿入したノードのポインタエラー時 :NULL */ struct singly_list *insert( struct singly_list *p, unsigned char value ) struct singly_list *new_node; new_node = malloc( sizeof( struct singly_list ) ); if ( new_node!= NULL ) /* 新たなノードが生成できたら */ new_node->next = p->next; /* 新たなノードからのリンクを接続する */ p->next = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->value = value; /* 新たなノードの値を格納する */ return ( new_node ); /* ポインタによって指されているノードpの次のノードを削除する */ void delete( struct singly_list *p ) struct singly_list *delete_node; delete_node = p->next; if ( delete_node!= NULL ) /* 削除するノードが存在したら */ p->next = delete_node->next; /* 次のノードへリンクをつなぎ替える */ free( delete_node ); /* 削除するノードをメモリから解放する */ void init( void ) /* 単方向リストの先頭のノードを生成する */ g_top = malloc( sizeof( struct singly_list ) ); if ( g_top!= NULL ) /* 新たなノードが生成できたら */ g_top->next = NULL; /* 次のノードは存在しないので NULL */ g_top->value = '.'; /* とりあえず初期値を '.' と設定 */ [8/]

19 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 9 void disp_list( void ) struct singly_list *disp_node; disp_node = g_top; while ( disp_node!= NULL ) printf( "%c", disp_node->value ); disp_node = disp_node->next; printf( "\n" ); [9/]

20 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page 双方向リスト操作のプログラム doubly_list.c #include <stdio.h> #include <stdlib.h> struct doubly_list /* 双方向リストの構造体定義 */ unsigned char value; /* データ */ struct doubly_list *pre; /* 前へのポインタ */ struct doubly_list *next; /* 次へのポインタ */ struct doubly_list *g_top; /* 双方向リストの先頭へのポインタ */ struct doubly_list *g_end; /* 双方向リストの末尾へのポインタ */ void init( void ); struct doubly_list *insert_next( struct doubly_list *p, unsigned char value ); struct doubly_list *insert_now( struct doubly_list *p, unsigned char value ); struct doubly_list *delete_now( struct doubly_list *p ); void disp_list( struct doubly_list *p ); #define NOW_DISP_OFFSET 7 int main( void ) struct doubly_list *now; init(); printf( "init " ); disp_list(g_top); now = insert_next( g_top, 'A' ); printf( "insert_next g_top 'A' " ); disp_list(now); now = insert_next( g_top, 'B' ); printf( "insert_next g_top 'B' " ); disp_list(now); now = insert_next( now->next, 'C' ); printf( "insert_next now->next 'C' " ); disp_list(now); now = insert_next( now, 'D' ); printf( "insert_next now 'D' " ); disp_list(now); now = now->pre->pre; printf( "now = now->pre->pre " ); disp_list(now); now = delete_now( now ); printf( "delete_now now " ); disp_list(now); now = delete_now( now ); printf( "delete_now now " ); disp_list(now); init(); printf( "init " ); disp_list(g_top); now = insert_next( g_top, 'A' ); printf( "insert_next g_top 'A' " ); disp_list(now); now = insert_now( now, 'B' ); printf( "insert_now now 'B' " ); disp_list(now); now = insert_now( now->next, 'C' ); printf( "insert_now now->next 'C' " ); disp_list(now); now = insert_now( now, 'D' ); printf( "insert_now now 'D' " ); disp_list(now); now = delete_now( now ); printf( "delete_now now " ); disp_list(now); now = delete_now( now ); printf( "delete_now now " ); disp_list(now); return ( 0 ); /* ポインタによって指されているノード p の次に新しいノードを挿入する */ /* 新しいノードへ格納する値も設定する */ /* 戻り値は 正常時 : 挿入したノードのポインタエラー時 :NULL */ struct doubly_list *insert_next( struct doubly_list *p, unsigned char value ) struct doubly_list *new_node; new_node = malloc( sizeof( struct doubly_list ) ); if ( new_node!= NULL ) /* 新たなノードが生成できたら */ new_node->pre = p; /* 新たなノードからのリンクを接続する */ new_node->next = p->next; /* 新たなノードからのリンクを接続する */ p->next = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->next->pre = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->value = value; /* 新たなノードの値を格納する */ return ( new_node ); [0/]

21 明星大学情報学科 年後期 アルゴリズムとデータ構造 Ⅰ 第 回 Page /* ポインタによって指されているノード p の場所に新しいノードを挿入する */ /* 新しいノードへ格納する値も設定する */ /* 戻り値は 正常時 : 挿入したノードのポインタエラー時 :NULL */ struct doubly_list *insert_now( struct doubly_list *p, unsigned char value ) struct doubly_list *new_node; new_node = malloc( sizeof( struct doubly_list ) ); if ( new_node!= NULL ) /* 新たなノードが生成できたら */ new_node->pre = p->pre; /* 新たなノードからのリンクを接続する */ new_node->next = p; /* 新たなノードからのリンクを接続する */ p->pre->next = new_node; /* 新たなノードへリンクをつなぎ替える */ p->pre = new_node; /* 新たなノードへリンクをつなぎ替える */ new_node->value = value; /* 新たなノードの値を格納する */ return ( new_node ); /* ポインタによって指されているノード p を削除する */ struct doubly_list *delete_now( struct doubly_list *p ) struct doubly_list *now_p; if ( p!= NULL ) /* 削除するノードが存在したら */ p->pre->next = p->next; /* 前のノードのリンクをつなぎ替える */ p->next->pre = p->pre; /* 次のノードのリンクをつなぎ替える */ now_p = p->next; free( p ); /* 削除するノードをメモリから解放する */ return ( now_p ); void init( void ) /* 双方向リストの先頭のノードを生成する */ g_top = malloc( sizeof( struct doubly_list ) ); g_end = malloc( sizeof( struct doubly_list ) ); if ( (g_top!= NULL) && (g_end!= NULL) ) /* 新たなノードが生成できたら */ g_top->pre = NULL; /* 先頭の前のノードは存在しないので NULL */ g_top->next = g_end; /* 先頭の次のノードは末尾 */ g_end->pre = g_top; /* 末尾の前のノードは先頭 */ g_end->next = NULL; /* 末尾の次のノードは存在しないので NULL */ g_top->value = '.'; /* とりあえず初期値を '.' と設定 */ g_end->value = '.'; /* とりあえず初期値を '.' と設定 */ void disp_list( struct doubly_list *p ) struct doubly_list *disp_node; int i; disp_node = g_top; while ( disp_node!= NULL ) printf( "%c", disp_node->value ); disp_node = disp_node->next; printf( "\n" ); for ( i = 0 ; i < NOW_DISP_OFFSET ; i++ ) printf( " " ); disp_node = g_top; while ( (disp_node!= p) && (disp_node!=null) ) printf( " " ); disp_node = disp_node->next; printf( "^now\n" ); [/]

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc 第 5 回基本データ構造 2 連結リストとその操作 第 5 回 Page 1 5-1. リスト構造 データ部 と ポインタ部 で構成され ポインタをたどることによりデータを扱うことができる構造 5-2. 単方向リストとその操作 5-2-1. 単方向リスト 次のデータへのポインタを 1 つだけ持っているデータ構造 ( データ部は 複数のデータを持っている場合もある ) データ部 ポインタ部 ノード リストを構成する要素のことを

More information

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - kougi10.ppt C プログラミング演習 第 10 回二分探索木 1 例題 1. リストの併合 2 つのリストを併合するプログラムを動かしてみる head1 tail1 head2 tail2 NULL NULL head1 tail1 tail1 があると, リストの併合に便利 NULL 2 #include "stdafx.h" #include struct data_list { int data;

More information

Microsoft Word - 中間試験 その1_解答例.doc

Microsoft Word - 中間試験 その1_解答例.doc 問題 1.C 言語 情報技術 Ⅱ 前半中間試験 次の宣言をしている時 以下の問いに答えよ unsigned char moji_1; struct Kouzou { unsigned char code; unsigned char str[10]; }; struct Kouzou mk[3]; 明星大学情報学科 3 年後期 情報技術 Ⅱ 中間試験その 1 Page 1 1-1. 各値を求めよ (1)sizeof(

More information

Taro-2分探索木Ⅱ(公開版).jtd

Taro-2分探索木Ⅱ(公開版).jtd 2 分探索木 Ⅱ 0. 目次 5. 2 分探索木の操作 5. 1 要素の探索 5. 2 直前の要素の探索 5. 3 直後の要素の探索 5. 4 要素の削除 5. 5 問題 問題 1-1 - 5. 2 分探索木の操作 5. 1 要素の探索 要素 44 の探索 (1) 要素 と 44 を比較して 左部分木をたどる (2) 要素 33 と 44 を比較して 右部分木をたどる (3) 要素 44 を見つけた

More information

Microsoft PowerPoint - 05.pptx

Microsoft PowerPoint - 05.pptx アルゴリズムとデータ構造第 5 回 : データ構造 (1) 探索問題に対応するデータ構造 担当 : 上原隆平 (uehara) 2015/04/17 アルゴリズムとデータ構造 アルゴリズム : 問題を解く手順を記述 データ構造 : データや計算の途中結果を蓄える形式 計算の効率に大きく影響を与える 例 : 配列 連結リスト スタック キュー 優先順位付きキュー 木構造 今回と次回で探索問題を例に説明

More information

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 ポインタ変数の扱い方 1 ポインタ変数の宣言 int *p; double *q; 2 ポインタ変数へのアドレスの代入 int *p; と宣言した時,p がポインタ変数 int x; と普通に宣言した変数に対して, p = &x; は x のアドレスのポインタ変数 p への代入 ポインタ変数の扱い方 3 間接参照 (

More information

Microsoft Word - 13

Microsoft Word - 13 担当 : 富井尚志 (tommy@ynu.ac.jp) アルゴリズムとデータ構造 講義日程 1. 基本的データ型 2. 基本的制御構造 3. 変数のスコープルール. 関数 4. 配列を扱うアルゴリズムの基礎 (1). 最大値, 最小値 5. 配列を扱うアルゴリズムの基礎 (2). 重複除去, 集合演算, ポインタ 6. ファイルの扱い 7. 整列 (1). 単純挿入整列 単純選択整列 単純交換整列

More information

第2回

第2回 第 4 回基本データ構造 1 明星大学情報学科 2 3 年前期 アルゴリズムとデータ構造 Ⅰ 第 4 回 Page 1 配列 スタック キューとその操作 4-1. 配列とその操作 配列型 同じ型の変数を並べたもの 配列にする型は 基本型 配列型 構造体 ポインタいずれでもよい 要素の並べ方を 次元 という 1 次元配列 ( 直線状 ) 2 次元配列 ( 平面状 ) 3 次元配列 ( 立体状 ) a[5]

More information

memo

memo 計数工学プログラミング演習 ( 第 6 回 ) 2016/05/24 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : 再帰呼び出し 2 分探索木 深さ優先探索 課題 : 2 分探索木を用いたソート 2 再帰呼び出し 関数が, 自分自身を呼び出すこと (recursive call, recursion) 再帰を使ってアルゴリズムを設計すると, 簡単になることが多い

More information

Taro-2分探索木Ⅰ(公開版).jtd

Taro-2分探索木Ⅰ(公開版).jtd 2 分探索木 Ⅰ 0. 目次 1. 2 分探索木とは 2. 2 分探索木の作成 3. 2 分探索木の走査 3. 1 前走査 3. 2 中走査 3. 3 問題 問題 1 問題 2 後走査 4. 2 分探索木の表示 - 1 - 1. 2 分探索木とは 木はいくつかの節点と節点同士を結ぶ辺から構成される 2 つの節点 u,v が直接辺で結ばれているとき 一方を親節点 他方を子節点という ある節点の親節点は高々

More information

Taro-リストⅢ(公開版).jtd

Taro-リストⅢ(公開版).jtd リスト Ⅲ 0. 目次 2. 基本的な操作 2. 1 リストから要素の削除 2. 2 リストの複写 2. 3 リストの連結 2. 4 問題 問題 1 問題 2-1 - 2. 基本的な操作 2. 1 リストから要素の削除 まず 一般的な処理を書き つぎに 特別な処理を書く 一般的な処理は 処理 1 : リスト中に 削除するデータを見つけ 削除する場合への対応 特別な処理は 処理 2 : 先頭のデータを削除する場合への対応

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 前回の出席確認演習 #include int main() { FILE *fp; int c, linecount, length, maxlength; fp=fopen("/usr/share/dict/words","r"); if (fp == NULL) return 1; linecount=0; length=0;

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 4 回再帰的構造体 プログラミングを 余談 : 教えることの難しさ 丁寧に説明しないと分かってもらえない 説明すると 小難しくなる学生が目指すべきところプログラム例を説明されて理解できる違うやり方でも良いので自力で解決できる おっけー 動けば良い という意識でプログラミング 正しく動くことのチェックは必要 解答例と自分のやり方との比較が勉強になる 今日のお題 再帰的構造体

More information

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - lec10.ppt 今日の内容, とポインタの組み合わせ, 例題 1. 住所録例題 2. と関数とは. を扱う関数. 例題 3. のリスト とポインタの組み合わせ 今日の到達目標 自分で を定義する 自分で定義したについて, 配列やポインタを作成する データ型 基本データ型 char 文字 (1 文字 ) int 整数 double 浮動小数など その他のデータ型配列 データの並び ( 文字列も, 文字の並び ) ポインタ

More information

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1 4. ソート ( 教科書 p.205-p.273) 整列すなわちソートは アプリケーションを作成する際には良く使われる基本的な操作であり 今までに数多くのソートのアルゴリズムが考えられてきた 今回はこれらソートのアルゴリズムについて学習していく ソートとはソートとは与えられたデータの集合をキーとなる項目の値の大小関係に基づき 一定の順序で並べ替える操作である ソートには図 1 に示すように キーの値の小さいデータを先頭に並べる

More information

Microsoft PowerPoint - 06.pptx

Microsoft PowerPoint - 06.pptx アルゴリズムとデータ構造第 6 回 : 探索問題に対応するデータ構造 (2) 担当 : 上原隆平 (uehara) 2015/04/22 内容 スタック (stack): 最後に追加されたデータが最初に取り出される 待ち行列 / キュー (queue): 最初に追加されたデータが最初に取り出される ヒープ (heap): 蓄えられたデータのうち小さいものから順に取り出される 配列による実装 連結リストによる実装

More information

memo

memo 計数工学プログラミング演習 ( 第 6 回 ) 2017/05/16 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : 再帰呼び出し 2 分探索木 深さ優先探索 課題 : 2 分探索木を用いたソート 2 再帰呼び出し 関数が, 自分自身を呼び出すこと (recursive call, recursion) 再帰を使ってアルゴリズムを設計すると, 簡単になることが多い

More information

Microsoft Word - no206.docx

Microsoft Word - no206.docx 3.2 双方向リスト 今までのリストは 前から順にたどることしかできませんでした 今度は逆にもたどることができる 双方向リストを扱います この場合は 構造体には次を表すポインタの他に前を表すポインタを持つ ことになります 今回は最初と最後をポインタを使うと取り扱いが面倒になるので 最初 (start) と最後 (end) を どちらとも構造体 ( 値は意味を持たない ) を使うことにします こうすることによって

More information

Microsoft Word - 12

Microsoft Word - 12 担当 : 富井尚志 (tommy@ynu.ac.jp) アルゴリズムとデータ構造 講義日程. 基本的データ型. 基本的制御構造. 変数のスコープルール. 関数. 配列を扱うアルゴリズムの基礎 (). 最大値, 最小値. 配列を扱うアルゴリズムの基礎 (). 重複除去, 集合演算, ポインタ. ファイルの扱い 7. 整列 (). 単純挿入整列 単純選択整列 単純交換整列 8. 整列 (). マージ整列

More information

プログラミングI第10回

プログラミングI第10回 プログラミング 1 第 10 回 構造体 (3) 応用 リスト操作 この資料にあるサンプルプログラムは /home/course/prog1/public_html/2007/hw/lec/sources/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog1 2007 Lec 101 Programming1 Group 19992007 データ構造

More information

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint - kougi11.ppt C プログラミング演習 中間まとめ 2 1 ソフトウエア開発の流れ 機能設計 外部仕様 ( プログラムの入力と出力の取り決め ) 構成設計 詳細設計 論理試験 内部データ構造や関数呼び出し方法などに関する取り決めソースプログラムの記述正しい入力データから正しい結果が得られるかテスト関数単位からテストをおこなう 耐性試験 異常な入力データに対して, 異常を検出できるかテスト異常終了することはないかテスト

More information

Taro-リストⅠ(公開版).jtd

Taro-リストⅠ(公開版).jtd 0. 目次 1. 再帰的なデータ構造によるリストの表現 1. 1 リストの作成と表示 1. 1. 1 リストの先頭に追加する方法 1. 1. 2 リストの末尾に追加する方法 1. 1. 3 昇順を保存してリストに追加する方法 1. 2 問題 問題 1 問題 2-1 - 1. 再帰的なデータ構造によるリストの表現 リストは データの一部に次のデータの記憶場所を示す情報 ( ポインタという ) を持つ構造をいう

More information

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル 概略設計書 作成者築山修治作成日 2012 年 10 月 1 日 概要 ( どのような入力に対して, どのような出力をするかの概要説明 ) * 木 T および質問点対の集合 P が与えられたとき, 各質問点対 p = (v,w) P の最下位共通先祖 ( すなわち木 T において点 v と w の共通の先祖 a で,a の真の子孫には v と w の共通の先祖が無いような点 ) を見出す関数である.

More information

PowerPoint Presentation

PowerPoint Presentation 今週のトピックス アルゴリズムとデータ構造 第 10 回講義 : 探索その 1 探索 (search) 逐次探索 (sequential search) 2 分探索 (binary search) 内挿探索 (interpolation search) Produced by Qiangfu Zhao (Since 2009), All rights reserved (c) 1 Produced

More information

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - kougi9.ppt C プログラミング演習 第 9 回ポインタとリンクドリストデータ構造 1 今まで説明してきた変数 #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) { double x; double y; char buf[256]; int i; double start_x; double step_x; FILE*

More information

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1 2007 7 17 2 1 1.1 LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP 2 2 5 5 5 1: 1 2 データの追加 データの取り出し 5 2 5 2 5 2: 1.2 [1] pp.199 217 2 (binary tree) 2 2.1 (three: ) ( ) 秋田高専 校長 準学士課程学生

More information

Prog1_10th

Prog1_10th 2012 年 6 月 20 日 ( 木 ) 実施ポインタ変数と文字列前回は, ポインタ演算が用いられる典型的な例として, ポインタ変数が 1 次元配列を指す場合を挙げたが, 特に,char 型の配列に格納された文字列に対し, ポインタ変数に配列の 0 番の要素の先頭アドレスを代入して文字列を指すことで, 配列そのものを操作するよりも便利な利用法が存在する なお, 文字列リテラルは, その文字列が格納されている領域の先頭アドレスを表すので,

More information

PowerPoint Template

PowerPoint Template プログラミング演習 Ⅲ Linked List P. Ravindra S. De Silva e-mail: ravi@cs.tut.ac.jp, Room F-413 URL: www.icd.cs.tut.ac.jp/~ravi/prog3/index_j.html 連結リストとは? 一つひとつの要素がその前後の要素との参照関係をもつデータ構造 A B C D 連結リストを使用する利点 - 通常の配列はサイズが固定されている

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング応用演習 第 5 回演習 前回までのお話 ポインタ ポインタを用いた文字列処理 構造体 ファイル 再帰的構造体 リスト構造 動的メモリ管理 今日のお題 ポインタやファイルなど これまでの内容の練習 教材 以前 以下に単語を収録したファイルがあることを紹介した : /usr/share/dict/words この中からランダムに単語を取り出したファイルを用意した http://sun.ac.jp/prof/yamagu/2019app/

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 03 変数と式 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 3.1 変数と型 変数とは p.60 C 言語のプログラム中で, 入力あるいは計算された数や文字を保持するには, 変数を使用する. 名前がついていて値を入れられる箱, というイメージ. 変数定義 : 変数は変数定義 ( 宣言 ) してからでないと使うことはできない. 代入 : 変数には値を代入できる.

More information

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - algo ppt [互換モード] 平衡木 アルゴリズム概論 - 探索 (2)- 安本慶一 yasumoto[at]is.naist.jp 二分探索木 高さがデータを挿入 削除する順番による 挿入 削除は平均 O(log n) だが, 最悪 O(n) 木の高さをできるだけ低く保ちたい 平衡木 (balanced tree) データを更新する際に形を変形して高さが log 2 n 程度に収まるようにした木 木の変形に要する時間を log

More information

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - algo ppt [互換モード] ( 復習 ) アルゴリズムとは アルゴリズム概論 - 探索 () - アルゴリズム 問題を解くための曖昧さのない手順 与えられた問題を解くための機械的操作からなる有限の手続き 機械的操作 : 単純な演算, 代入, 比較など 安本慶一 yasumoto[at]is.naist.jp プログラムとの違い プログラムはアルゴリズムをプログラミング言語で表現したもの アルゴリズムは自然言語でも, プログラミング言語でも表現できる

More information

二分木の実装

二分木の実装 二分木の実装 この回の要点 二分木の C 言語による実装を理解する 再帰呼び出しによる木のなぞりの実装を理解する 関数ポインタを使った汎用処理の実装を理解する 実装コードの構成 汎用的構造 各ノードは void* を持つ 二分木のノード BinTreeNode.h BinTreeNode.cc 二分木 BinTree.h BinTree.cc テスト用 TestBinTree.cc BinTree

More information

memo

memo 数理情報工学演習第一 C ( 第 8 回 ) 206/06/3 DEPARTMENT OF MATHEMATICAL INFORMATICS 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 プライオリティキュー ヒープ 課題 : ヒープソート 2 プロトタイプ宣言 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

Microsoft Word - Cプログラミング演習(11)

Microsoft Word - Cプログラミング演習(11) 第 11 回 (7/2) 4. いくつかのトピック (1) ビットごとの演算子 C 言語には, 次のようなビット単位で演算を行う特別な演算子が用意されている & ビットごとの AND ビットごとの OR ^ ビットごとの XOR( 排他的論理和 ) ~ 1 の補数これらの演算子は文字型と整数型で機能し, 浮動小数点数型では使用できない AND, OR, XOR は, それぞれのオペランドの対応するビットを比較して結果を返す

More information

memo

memo 計数工学プログラミング演習 ( 第 5 回 ) 2017/05/09 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 内容 文字列 双方向リスト ハッシュ 2 文字列 文字列は char の配列 char name[] = ABC ; name は ABC を格納するのに十分な長さの配列 長さは, 文字列の長さ + 1 ( 終端記号用 ) char name[4]

More information

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a = 問 1 配列の宣言整数型配列 data1 にデータが初期設定されている この配列 data1 のデータを下図のように 整数型配列 data2 に代入しなさい また data2 の内容を printf( "data2[0] = %d\n", data2[0] ); printf( "data2[5] = %d\n", data2[5] ); を用いて出力しなさい 実行結果 data2[0] = 76

More information

Taro-ポインタ変数Ⅰ(公開版).j

Taro-ポインタ変数Ⅰ(公開版).j 0. 目次 1. ポインタ変数と変数 2. ポインタ変数と配列 3. ポインタ変数と構造体 4. ポインタ変数と線形リスト 5. 問題 問題 1 問題 2-1 - 1. ポインタ変数と変数 ポインタ変数には 記憶領域の番地が格納されている 通常の変数にはデータが格納されている 宣言 int *a; float *b; char *c; 意味ポインタ変数 aは 整数型データが保存されている番地を格納している

More information

alg2015-6r3.ppt

alg2015-6r3.ppt 1 アルゴリズムとデータ 構造 第 6 回探索のためのデータ構造 (1) 補稿 : 木の巡回 ( なぞり ) 2 木の巡回 ( 第 5 回探索 (1) のスライド ) 木の巡回 * (traverse) とは 木のすべての節点を組織だった方法で訪問すること 深さ優先探索 (depth-first search) による木の巡回 *) 木の なぞり ともいう 2 3 1 3 4 1 4 5 7 10

More information

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt 計算機言語第 7 回 長宗高樹 目的 関数について理解する. 入力 X 関数 f 出力 Y Y=f(X) 関数の例 関数の型 #include int tasu(int a, int b); main(void) int x1, x2, y; x1 = 2; x2 = 3; y = tasu(x1,x2); 実引数 printf( %d + %d = %d, x1, x2, y);

More information

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード] 情報工学実験 II 実験 2 アルゴリズム ( リスト構造とハッシュ ) 実験を始める前に... C 言語を復習しよう 0. プログラム書ける? 1. アドレスとポインタ 2. 構造体 3. 構造体とポインタ 0. プログラム書ける? 講義を聴いているだけで OK? 言語の要素技術を覚えれば OK? 目的のプログラム? 要素技術 データ型 配列 文字列 関数 オブジェクト クラス ポインタ 2 0.

More information

program7app.ppt

program7app.ppt プログラム理論と言語第 7 回 ポインタと配列, 高階関数, まとめ 有村博紀 吉岡真治 公開スライド PDF( 情報知識ネットワーク研 HP/ 授業 ) http://www-ikn.ist.hokudai.ac.jp/~arim/pub/proriron/ 本スライドは,2015 北海道大学吉岡真治 プログラム理論と言語, に基づいて, 現著者の承諾のもとに, 改訂者 ( 有村 ) が加筆修正しています.

More information

PowerPoint Presentation

PowerPoint Presentation 算法数理工学 第 2 回 定兼邦彦 クイックソート n 個の数に対して最悪実行時間 (n 2 ) のソーティングアルゴリズム 平均実行時間は (n log n) 記法に隠された定数も小さい in-place ( 一時的な配列が必要ない ) 2 クイックソートの記述 分割統治法に基づく 部分配列 A[p..r] のソーティング. 部分問題への分割 : 配列 A[p..r] を 2 つの部分配列 A[p..q]

More information

Taro-スタック(公開版).jtd

Taro-スタック(公開版).jtd 0. 目次 1. 1. 1 配列によるの実現 1. 2 再帰的なデータ構造によるの実現 1. 3 地図情報処理 1. 4 問題 問題 1 グラフ探索問題 - 1 - 1. は データの出し入れが一カ所で行われ 操作は追加と削除ができるデータ構造をいう 出入口 追加 削除 操作 最初 111 追加 111 222 追加 111 222 333 追加 111 222 333 444 追加 111 222

More information

memo

memo 数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

Microsoft PowerPoint - 7.pptx

Microsoft PowerPoint - 7.pptx 7. 木構造 7-1. データ構造としての木 グラフ理論での木の定義 根付き木 7-2.2 分探索木 7-3. 高度な木 ( 平衡木 ) AVL 木 B 木 1 7-1 1. データ構造としての木 2 木構造 木構造を表すデータ構造の一つとしてヒープがある しかし ヒープでは 配列を用いプではるため 要素数で木の形状が一通りに決定してしまった ここでは 再帰的なデータ構造を用いることにより より柔軟な木構造が構築可能なより柔軟な木構造が構築可能なことを見ていく

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 講座準備 講座資料は次の URL から DL 可能 https://goo.gl/jnrfth 1 ポインタ講座 2017/01/06,09 fumi 2 はじめに ポインタはC 言語において理解が難しいとされる そのポインタを理解することを目的とする 講座は1 日で行うので 詳しいことは調べること 3 はじめに みなさん復習はしましたか? 4 & 演算子 & 演算子を使うと 変数のアドレスが得られる

More information

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - 11.pptx ポインタと配列 ポインタと配列 配列を関数に渡す 法 課題 : 配列によるスタックの実現 ポインタと配列 (1/2) a が配列であるとき, 変数の場合と同様に, &a[0] [] の値は配列要素 a[0] のアドレス. C 言語では, 配列は主記憶上の連続領域に割り当てられるようになっていて, 配列名 a はその配列に割り当てられた領域の先頭番地となる. したがって,&a[0] と a は同じ値.

More information

文字数は1~6なので 同じ本数の枝を持つパスで生成される呪文の長さは最大で6 倍の差がある 例えば 上図のようなケースを考える 1サイクル終了した時点では スター節点のところに最強呪文として aaaaaac が求まる しかしながら サイクルを繰り返していくと やがてスター節点のところに aaaaaa

文字数は1~6なので 同じ本数の枝を持つパスで生成される呪文の長さは最大で6 倍の差がある 例えば 上図のようなケースを考える 1サイクル終了した時点では スター節点のところに最強呪文として aaaaaac が求まる しかしながら サイクルを繰り返していくと やがてスター節点のところに aaaaaa [Problem E] 最強の呪文 例えば 上図のような場合を考えると 節点 0( スター ) から節点 1 に至るパスの最強の呪文は aa であるが 節点 0 から節点 2 に至るパスの最強の呪文は aabc であり 節点 0 と節点 1 の間のパスとして最強の aa は用いられていない したがって スターから各節点への最強の呪文を求めていく方法は旨く機能しないと考えられる 一方 上図において 節点

More information

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値 1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値 O. value を持つ とする このようなオブジェクトを保存する二分木ヒープについて考える 二分木ヒープは以下の二つの制約のある二分木である

More information

人工知能入門

人工知能入門 藤田悟 黄潤和 探索とは 探索問題 探索解の性質 探索空間の構造 探索木 探索グラフ 探索順序 深さ優先探索 幅優先探索 探索プログラムの作成 バックトラック 深さ優先探索 幅優先探索 n 個の ueen を n n のマスの中に 縦横斜めに重ならないように配置する 簡単化のために 4-ueen を考える 正解 全状態の探索プログラム 全ての最終状態を生成した後に 最終状態が解であるかどうかを判定する

More information

Microsoft Word - no12.doc

Microsoft Word - no12.doc 7.5 ポインタと構造体 構造体もメモリのどこかに値が格納されているのですから 構造体へのポインタ も存在します また ポインタも変数ですから 構造体のメンバに含めることができます まずは 構造体へのポインタをあつかってみます ex53.c /* 成績表 */ #define IDLENGTH 7 /* 学籍番号の長さ */ #define MAX 100 /* 最大人数 */ /* 成績管理用の構造体の定義

More information

Microsoft Word - Cプログラミング演習(9)

Microsoft Word - Cプログラミング演習(9) 第 9 回 (6/18) 3. ファイルとその応用 外部記憶装置に記録されたプログラムやデータを, ファイルと呼ぶ シーケンシャルファイルやランダムファイルへのデータの記録や読み出し, 更新の手順について学習する (1) ファイルとレコードファイル複数の関連したデータを一つに集めたり プログラムを外部記憶装置に保存したものレコードファイルを構成する一塊のデータ ex. 個人カードフィールドレコードを構成する個別の要素

More information

CプログラミングI

CプログラミングI C プログラミング I Swap 関数を作る Stack データ構造のための準備 整数変数 x と y の値を取り替える関数 swap を作る 最初の試み : swap-01.c #include void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; int main(void) { int x=10, y=30;

More information

Taro-再帰関数Ⅱ(公開版).jtd

Taro-再帰関数Ⅱ(公開版).jtd 0. 目次 6. 2 項係数 7. 二分探索 8. 最大値探索 9. 集合 {1,2,,n} 上の部分集合生成 - 1 - 6. 2 項係数 再帰的定義 2 項係数 c(n,r) は つぎのように 定義される c(n,r) = c(n-1,r) + c(n-1,r-1) (n 2,1 r n-1) = 1 (n 0, r=0 ) = 1 (n 1, r=n ) c(n,r) 0 1 2 3 4 5

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 総機 1 ( 月 1) 11: 動的メモリ確保 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2015-06-22 1 まとめ : ポインタを使った処理 内容 説明 呼び出し元の変数を書き換える第 9 回 文字列を渡す 配列を渡す 第 10 回 ファイルポインタ

More information

2018年度「プログラミング言語」配布資料 (12)

2018年度「プログラミング言語」配布資料 (12) 2018 年度 プログラミング言語 配布資料 (12) 五十嵐淳 2019 年 1 月 1 日 目次 1 2 分探索木 in C (C/bst/) 1 1.1 2 分木の表現............................................. 1 1.2 探索.................................................. 4 1.3 挿入..................................................

More information

第1回 プログラミング演習3 センサーアプリケーション

第1回 プログラミング演習3 センサーアプリケーション C プログラミング - ポインタなんて恐くない! - 藤田悟 fujita_s@hosei.ac.jp 目標 C 言語プログラムとメモリ ポインタの関係を深く理解する C 言語プログラムは メモリを素のまま利用できます これが原因のエラーが多く発生します メモリマップをよく頭にいれて ポインタの動きを理解できれば C 言語もこわくありません 1. ポインタ入門編 ディレクトリの作成と移動 mkdir

More information

( ) ( ) 30 ( ) 27 [1] p LIFO(last in first out, ) (push) (pup) 1

( ) ( ) 30 ( ) 27 [1] p LIFO(last in first out, ) (push) (pup) 1 () 2006 2 27 1 10 23 () 30 () 27 [1] p.97252 7 2 2.1 2.1.1 1 LIFO(last in first out, ) (push) (pup) 1 1: 2.1.2 1 List 4-1(p.100) stack[] stack top 1 2 (push) (pop) 1 2 void stack push(double val) val stack

More information

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し 1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値 O. value を持つとする このようなオブジェクトを保存する二分木ヒープについて考える 二分木ヒープは以下の二つの制約のある二分木である

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 2 ( 月 4) 11: 動的メモリ確保 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2014-06-22 1 まとめ : ポインタを使った処理 内容 説明 呼び出し元の変数を書き換える第 9 回 文字列を渡す 配列を渡す 第 10 回 ファイルポインタ

More information

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く 変数 入出力 演算子ここまでに C 言語プログラミングの様子を知ってもらうため printf 文 変数 scanf 文 if 文を使った簡単なプログラムを紹介した 今回は変数の詳細について習い それに併せて使い方が増える入出力処理の方法を習う また 演算子についての復習と供に新しい演算子を紹介する 変数の宣言プログラムでデータを取り扱う場合には対象となるデータを保存する必要がでてくる このデータを保存する場所のことを

More information

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; Point; 問題 18. 問題 17 の Point を用いて 2 点の座標を入力するとその 2 点間の距 離を表示するプログラムを作成せよ 平方根は

More information

Microsoft Word - no11.docx

Microsoft Word - no11.docx 3. 関数 3.1 関数関数は数学の関数と同じようなイメージを持つと良いでしょう 例えば三角関数の様に一つの実数値 ( 角度 ) から値を求めますし 対数関数の様に二つの値から一つの値を出すものもあるでしょう これをイメージしてもらえば結構です つまり 何らかの値を渡し それをもとに何かの作業や計算を行い その結果を返すのが関数です C 言語の関数も基本は同じです 0 cos 1 cos(0) =

More information

Microsoft Word - NonGenTree.doc

Microsoft Word - NonGenTree.doc ジェネリクスとコンパレータを使用しない 2 分探索木のプログラム例 BinTreeNG.java: 2 分探索木のクラス BinTreeNG BinTreeTesterNG.java: BinTreeNG を利用するプログラム例 === BinTreeNG.java =========================================================================

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 2 ( 月 4) 09: ポインタ 文字列 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2014-06-09 1 関数できなかったこと 配列を引数として渡す, 戻り値として返す 文字列を扱う 呼び出し元の変数を直接書き換える 例 : 2 つの変数の値を入れ替える関数

More information

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - kougi7.ppt C プログラミング演習 第 7 回メモリ内でのデータの配置 例題 1. 棒グラフを描く 整数の配列から, その棒グラフを表示する ループの入れ子で, 棒グラフの表示を行う ( 参考 : 第 6 回授業の例題 3) 棒グラフの1 本の棒を画面に表示する機能を持った関数を補助関数として作る #include "stdafx.h" #include void draw_bar( int

More information

[Problem F] 古い記憶 良さそうな方法は思いつかなかった アイディア募集中!!! かなり強引に解いている 各判定データに対して 30 秒程度かかる 元の文章と改ざん文章の関係を考える ウィルス感染の可能性は高々 2 回であり 各々の感染では 1 文字削除 1 文字追加 1 文字変更が行われ

[Problem F] 古い記憶 良さそうな方法は思いつかなかった アイディア募集中!!! かなり強引に解いている 各判定データに対して 30 秒程度かかる 元の文章と改ざん文章の関係を考える ウィルス感染の可能性は高々 2 回であり 各々の感染では 1 文字削除 1 文字追加 1 文字変更が行われ [Problem F] 古い記憶 良さそうな方法は思いつかなかった アイディア募集中!!! かなり強引に解いている 各判定データに対して 30 秒程度かかる 元の文章と改ざん文章の関係を考える ウィルス感染の可能性は高々 2 回であり 各々の感染では 1 文字削除 1 文字追加 1 文字変更が行われる 削除と追加は双対な関係であるので 改ざん文章に対して 改ざん文章そのもの ( 実際にはウィルス感染が起こっていなかった

More information

プログラミング基礎

プログラミング基礎 C プログラミング Ⅰ 条件分岐 if~else if~else 文,switch 文 条件分岐 if~else if~else 文 if~else if~else 文 複数の条件で処理を分ける if~else if~else 文の書式 if( 条件式 1){ 文 1-1; 文 1-2; else if( 条件式 2){ 文 2-1; 文 2-2; else { 文 3-1; 文 3-2; 真条件式

More information

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - 6.pptx 6. データ構造入門 6-1. 連結リスト (Linked List) 6-2. スタック (Stack) 6-. キュー (Queue) 6-4. デク (Double-Ended-Queue) 6-. 抽象データ型 (Abstract Data Type) データ構造とは データの保存を効率的に行うもの 1 ito 2.712.14 suzuki データ構造 1 2 6-1. 連結リスト (Linked

More information

プログラミング実習I

プログラミング実習I プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 m.imura@kwansei.ac.jp 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 09: ポインタ 文字列 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-06-08 1 関数できなかったこと 配列を引数として渡す, 戻り値として返す 文字列を扱う 呼び出し元の変数を直接書き換える 例 : 2 つの変数の値を入れ替える関数

More information

プログラム言語及び演習Ⅲ

プログラム言語及び演習Ⅲ 平成 28 年度後期データ構造とアルゴリズム期末テスト 各問題中のアルゴリズムを表すプログラムは, 変数の宣言が省略されているなど, 完全なものではありませんが, 適宜, 常識的な解釈をしてください. 疑問があれば, 挙手をして質問してください. 時間計算量をオーダ記法で表せという問題では, 入力サイズ n を無限大に近づけた場合の漸近的な時間計算量を表せということだと考えてください. 問題 1 入力サイズが

More information

演算増幅器

演算増幅器 構造体 ここまでに char int doulbe などの基本的なデータ型に加えて 同じデータ型が連続している 配列についてのデータ構造について習った これ以外にも もっと複雑なデータ型をユーザが定義 することが可能である それが構造体と呼ばれるもので 異なる型のデータをひとかたまりのデー タとして扱うことができる 異なるデータをまとめて扱いたい時とはどんな場合だろうか 例えば 住民データを管理したい

More information

untitled

untitled C -1 - -2 - concept lecture keywords FILE, fopen, fclose, fscanf, fprintf, EOF, r w a, typedef gifts.dat Yt JZK-3 Jizake tsumeawase 45 BSP-15 Body soap set 3 BT-2 Bath towel set 25 TEA-2 Koutya

More information

memo

memo 計数工学プログラミング演習 ( 第 3 回 ) 2016/04/26 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 内容 ポインタ malloc 構造体 2 ポインタ あるメモリ領域 ( アドレス ) を代入できる変数 型は一致している必要がある 定義時には値は不定 ( 何も指していない ) 実際にはどこかのメモリを指しているので, #include

More information

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - CproNt02.ppt [互換モード] 第 2 章 C プログラムの書き方 CPro:02-01 概要 C プログラムの構成要素は関数 ( プログラム = 関数の集まり ) 関数は, ヘッダと本体からなる 使用する関数は, プログラムの先頭 ( 厳密には, 使用場所より前 ) で型宣言 ( プロトタイプ宣言 ) する 関数は仮引数を用いることができる ( なくてもよい ) 関数には戻り値がある ( なくてもよい void 型 ) コメント

More information

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - prog03.ppt プログラミング言語 2 第 03 回 (2007 年 05 月 07 日 ) 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 1 今日やること hp://www.nlab.ice.uec.ac.jp/~s-okubo/class/language/ にアクセスすると 教材があります 2007 年 05 月 07 日分と書いてある部分が 本日の教材です 本日の内容

More information

memo

memo 計数工学プログラミング演習 ( 第 4 回 ) 2016/05/10 DEPARTMENT OF MATHEMATICA INFORMATICS 1 内容 リスト 疎行列 2 連結リスト (inked ists) オブジェクトをある線形順序に並べて格納するデータ構造 単方向連結リスト (signly linked list) の要素 x キーフィールド key ポインタフィールド next x->next:

More information

Taro-最大値探索法の開発(公開版

Taro-最大値探索法の開発(公開版 最大値探索法の開発 0. 目次 1. 開発過程 1 目標 1 : 4 個のデータの最大値を求める 目標 2 : 4 個のデータの最大値を求める 改良 : 多数のデータに対応するため 配列を使う 目標 3 : n 個のデータの最大値を求める 改良 : コードを簡潔に記述するため for 文を使う 目標 4 : n 個のデータの最大値を求める 改良 : プログラムをわかりやすくするため 関数を使う 目標

More information

Microsoft Word - 3new.doc

Microsoft Word - 3new.doc プログラミング演習 II 講義資料 3 ポインタ I - ポインタの基礎 1 ポインタとは ポインタとはポインタは, アドレス ( データが格納されている場所 ) を扱うデータ型です つまり, アドレスを通してデータを間接的に処理します ポインタを使用する場合の, 処理の手順は以下のようになります 1 ポインタ変数を宣言する 2 ポインタ変数へアドレスを割り当てる 3 ポインタ変数を用いて処理 (

More information

Microsoft PowerPoint pptx

Microsoft PowerPoint pptx 情報処理 Ⅱ 第 12 13回 2011 年 1 月 31 17 日 ( 月 ) 本日学ぶこと ファイル入出力, 標準入力 標準出力 記憶域管理関数 (malloc など ) 問題 ファイルを入力にとり, 先頭に行番号をつけて出力できる? 行列の積を, ファイルを介して読み書き 計算できる? Wakayama University./line 1:Wakayama 2:University 3 2

More information

Microsoft Word - Cプログラミング演習(12)

Microsoft Word - Cプログラミング演習(12) 第 12 回 (7/9) 4. いくつかのトピック (5)main 関数の引数を利用したファイル処理 main 関数は, 起動する環境から引数を受け取ることができる 例えば 次に示すように,main 関数に引数を用いたプログラムを作成する 01 /* sample */ 02 /* main 関数の引数 */ 03 #include 04 05 main(int argc, char

More information

演算増幅器

演算増幅器 ファイルこれまでにデータの入力方法として キーボードからの入力を用いてきた 構造体を習った際に実感してもらえたと思うが 入力データ量が多いときにはその作業は大変なものとなり 入力するデータを間違えた場合には最初からやり直しになる そこで今回はこれらの問題を解決するため あらかじめ入力データをテキストエディタなどで編集し ファイルとして保存したものを入力データとして用いる方法を習っていく さらにプログラムで作成したデータをファイルに出力する方法も併せて習っていく

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 09: ポインタ 文字列 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/teachers/w 483692/CPR/ 207-06-4 関数できなかったこと 2 配列を引数として渡す, 戻り値として返す 文字列を扱う 呼び出し元の変数を直接書き換える 例 : 2 つの変数の値を入れ替える関数

More information

PowerPoint Presentation

PowerPoint Presentation ファイルの入出力 芝浦工業大学情報工学科 青木義満 今回の講義内容 ファイル入出力 ファイルからのデータ読込み ファイルと配列 2 1 ファイルへのデータ書き込み ( 復習 ) ソースファイル名 :fileio1.c データをファイルに書き込み #include int main(void) { ファイルポインタ宣言 int student_id = 100; char name[

More information

第3回 配列とリスト

第3回 配列とリスト 連結リスト Algorithms and Data Structures on C この回の要点 連結リストによるリスト 連結リストの構造 連結リストの利点と欠点 C 言語による連結リストの実現 ヘッダファイルによるソースファイルの分割 連結リスト (linked list) リストの実現の一種 リストに含まれる各要素をリンクによって連結した構造 リンクとは 他のデータへの参照のこと 各要素は 自分から次のデータへのリンクを持つ

More information

Prog1_15th

Prog1_15th 2012 年 7 月 26 日 ( 木 ) 実施構造体と typedef typedef 宣言によって,struct 構造体タグ名という表記を再定義し, データ型名のように扱うことができる 構文は typedef struct 構造体タグ名 再定義名 ; となり, この場合の構造体変数の宣言は, 再定義名を用いて行うことができる なお, ここでは 構造体タグ名は省略可能である 構造体を指すポインタ

More information

PowerPoint Presentation

PowerPoint Presentation 二分探索木 今回の要点 二分探索木の構造 どのような条件を満たさねばならないか? 二分探索が効率よく出来るため 二分探索木の操作 探索の方法 挿入の方法 削除の方法 各操作の実装コード 二分探索木の性質 どのような形がもっと探索に適しているか? 二分探索木とは 木構造 枝分かれした構造を表現するのに適する 根から葉に向かってたどる = 探索 何らかの特徴を持って構成されていると探索しやすい 二分探索木

More information

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - ca ppt [互換モード] 大阪電気通信大学情報通信工学部光システム工学科 2 年次配当科目 コンピュータアルゴリズム 良いアルゴリズムとは 第 2 講 : 平成 20 年 10 月 10 日 ( 金 ) 4 限 E252 教室 中村嘉隆 ( なかむらよしたか ) 奈良先端科学技術大学院大学助教 y-nakamr@is.naist.jp http://narayama.naist.jp/~y-nakamr/ 第 1 講の復習

More information

Microsoft Word - Cプログラミング演習(10)

Microsoft Word - Cプログラミング演習(10) 第 10 回 (6/25) 3. ファイルとその応用 (3) ファイルの更新 シーケンシャルファイルの更新 シーケンシャルファイルでは, 各レコードが可変長で連続して格納されており, その中の特定のレコードを変更することができない そこで一般的には, マスタファイルからデータを取り出し, 更新処理を行ったあとに新マスタファイルに書き込む 注 ) マスタファイル : 主ファイル, 基本ファイルと呼ばれるファイルで内容は比較的固定的であり,

More information

cp-7. 配列

cp-7. 配列 cp-7. 配列 (C プログラムの書き方を, パソコン演習で学ぶシリーズ ) https://www.kkaneko.jp/cc/adp/index.html 金子邦彦 1 本日の内容 例題 1. 月の日数配列とは. 配列の宣言. 配列の添え字. 例題 2. ベクトルの内積例題 3. 合計点と平均点例題 4. 棒グラフを描く配列と繰り返し計算の関係例題 5. 行列の和 2 次元配列 2 今日の到達目標

More information

Taro-再帰関数Ⅲ(公開版).jtd

Taro-再帰関数Ⅲ(公開版).jtd 0. 目次 1 1. ソート 1 1. 1 挿入ソート 1 1. 2 クイックソート 1 1. 3 マージソート - 1 - 1 1. ソート 1 1. 1 挿入ソート 挿入ソートを再帰関数 isort を用いて書く 整列しているデータ (a[1] から a[n-1] まで ) に a[n] を挿入する操作を繰り返す 再帰的定義 isort(a[1],,a[n]) = insert(isort(a[1],,a[n-1]),a[n])

More information

データ構造

データ構造 アルゴリズム及び実習 7 馬青 1 表探索 定義表探索とは 表の形で格納されているデータの中から条件に合ったデータを取り出してくる操作である 但し 表は配列 ( 連結 ) リストなどで実現できるので 以降 表 の代わりに直接 配列 や リスト などの表現を用いる場合が多い 表探索をただ 探索 と呼ぶ場合が多い 用語レコード : 表の中にある個々のデータをレコード (record) と呼ぶ フィールド

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 11: 動的メモリ確保 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-06-22 1 まとめ : ポインタを使った処理 内容呼び出し元の変数を書き換える文字列を渡す 配列を渡すファイルポインタ複数の値を返す大きな領域を確保する

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 基幹 7 ( 水 5) 13: 構造体 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-07-06 1 例題 : 多角形の面積 n = 5 (5 角形 ) の例 n 1 n 1 1 p 1 T 0 S = i=0 p 0 T i = i=0 2

More information

02: 変数と標準入出力

02: 変数と標準入出力 C プログラミング入門 総機 1 ( 月 1) 13: 構造体 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2015-07-06 1 例題 : 多角形の面積 n = 5 (5 角形 ) の例 n 1 n 1 p 1 S = T i = 1 2 p i p i+1 i=0 i=0

More information

Prog1_6th

Prog1_6th 2012 年 5 月 24 日 ( 木 ) 実施 多分岐のプログラム 前回は多段階の 2 分岐を組み合わせて 3 種類以上の場合分けを実現したが, 式の値の評価によって, 一度に多種類の場合分けを行う多分岐の利用によって見通しのよいプログラムを作成できる場合がある ( 流れ図は右図 ) 式の評価 : 値 1 : 値 2 : 値 n : 該当値無し 処理 1 処理 2 処理 n 既定の処理 switch

More information

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数 関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数 関数の定義 戻り値の型 関数名 引数の型 引数の名前 int funcname ( int a, char b) { int c ; c = a * b ; return c ; 引数の型 引数の名前 戻り値 戻り値の型は int 変数 c の型も int return

More information

講習No.12

講習No.12 前回までの関数のまとめ 関数は main() 関数または他の関数から呼び出されて実行される. 関数を呼び出す側の実引数の値が関数内の仮引数 ( 変数 ) にコピーされる. 関数内で定義した変数は, 関数の外からは用いることができない ( ローカル変数 ). 一般に関数内で仮引数を変化しても, 呼び出し側の変数は変化しない ( 値渡し ). 関数内で求めた値は return 文によって関数値として呼び出し側に戻される.

More information