第12回:木構造

Size: px
Start display at page:

Download "第12回:木構造"

Transcription

1 アルゴリズムとデータ構造 講義スライド 4 スタック キュー リスト 茨城大学工学部知能システム工学科井上康介 E2 棟 801 号室

2 第5章 データ構造 授業の最初で述べたとおり 大量 複雑なデータを扱う上 では データを構造化 組織化する必要がある どのようなデータ構造 (data structure) を採用するかに よって 問題解決のアルゴリズムも異なってくる つまり アルゴリズムとデータ構造とは密接な関係にあり よいデータ構造を選ぶことがよいプログラムを作ることに つながる 特に重要なデータ構造として リスト ツリー グラフが 上げられる ツリー (木) は第6章 グラフは第7章で扱う この章では スタック (stack: 棚) キュー (queue: 待ち 行列) リスト (list) を説明する.213 2

3 データ構造とは 代表的なデータ構造として 以下のものが挙げられる 1. 表 (table: テーブル) 2. 棚 (stack: スタック) 3. 待ち行列 (queue: キュー) 4. リスト (list) 5. 木 (tree: ツリー) 6. グラフ (grah) 表については ふつうの配列で扱うことができるので ここでは扱わない 良いデータ構造とは何かの基準は一概には言えないが データの追加 削除 検索が効率よく行えること およ び 複雑な構造が簡潔に表現できることなどがある

4 これから学ぶデータ構造 テーブル ( ただの配列 ) スタック ( 後入れ先だし ) a[0] a[0][0] a[0][1] a[1] a[1][0] a[1][1] a[2] a[2][0] a[2][1] a[3] a[3][0] a[3][1] a[4] a[5] a[4][0] a[5][0] a[4][1] a[5][1] キュー ( 先入れ先出し ) 4

5 これから学ぶデータ構造 リスト ( 一本鎖 ) データデータデータ 次のデータへのポインタ 終端は NULL ツリー ( 分岐を含む ) データ データ データ データ データ データ 5

6 これから学ぶデータ構造 グラフ ネットワーク (ループも含む) 3分 秦病院 油縄子 Bulldog 秦病院 6分 油縄子 Bulldog 4分 7分 5分 カワチ 茨大 カスミ グラフ (接続関係だけ) カワチ 10分 茨大 カスミ ネットワーク (区間に属性) 6

7 スタック スタック (stack) は 一時的データ置き場 (buffer) と して利用される代表的なデータ構造の一つである データを棚に上から順に積んでいき 取り出すときも上 から取り出す データを放り込む操作を プッシュ (ush) 取り出す操作を ポップ (o) という o ush このように 取り出せるのは最後に Data-1 Data-0 入れたデータからである Data-2 このような方式を LIFO (Last In First Out: 後入れ先出し) と呼ぶ スタックの実装は 1次元配列を 用いて行われる スタック (棚) (前半) 7

8 スタック スタックは データを格納する配列 と 現在いくつのデー タが入っているか を示す スタックポインタ から実現さ れる 配列を stack[] スタックポインタを s とするとき 次のようになる s==4 での ush は あふれ プッシュ Data-A Data-B Data-D Data-C s==0 での o は 空っぽ ポップ これらは エラー処理 stack[3] stack[2] stack[1] stack[0] s=

9 スタック (ソースコード).217 プリプロセッサでスタックのサイズ MaxSize を定義 スタックの実体である配列 stack[] はグローバル変数 として定義 スタックポインタ s もグローバル変数と して定義し 0 に初期化している (ほんとうは グロー バル変数は極力使わないことが望ましい) プッシュ関数 int ush(int n); とポップ関数 int o(int *n); では int型の返値を返す メイン関数では while文でループさせてユーザからの 文字入力を繰り返し受けている int getchar(void) は キーボードから文字を読み 込み int型に変換して返す関数 9

10 スタック (ソースコード) while文のかっこ内でキーボードから1文字を読み込む 読み込んだ文字が 'i' あるいは 'I' であるときは ユーザからデータを入力して それをスタックにプッ シュする スタックが既にいっぱいの場合, それ以上プッシュでき ない このとき 関数 ush() は -1 を返す 読み込んだ文字が 'o' あるいは 'O' であるときは ス タックからデータを1つポップする スタックが空の場合は取り出せないので関数 o() は -1 を返す プッシュもポップも 正常に実行した場合は返値は 0 となる 10

11 スタック (ソースコード) さて, ポップを行ったとき データが正しく取り出せれば 0 を スタックが空のときは -1 を返す このために 返 値 という情報チャンネルは使われてしまう では, 2つめの情報 ポップにより取り出したデータ を どうやって呼出側に返せばよいだろうか データを返すために ここでは ポインタ渡し (参照渡し) という方法が使われている (通常は 値渡し) ポップしたデータを入れる変数は main関数のローカル 変数 n であり main関数で o() を呼び出すとき 引 数としてその n へのポインタ (n のアドレス) を o() に渡す o() 内では もらったアドレスにデータを書き込む 11

12 スタック (ソースコード) それぞれの関数を見ていこう ush() では 最初にサイズあふれ (s >= MaxSize) が起きていないかチェックしている 起きていない場合は 配列の s の位置に 値渡しで受け 取ったデータ n を書き込み s を1つ増やす 正常終了 なので この場合は返値として 0 を返す サイズあふれが起きていた場合 何もせずに -1 を返す 値渡しでデータを受け取る際 main関数のローカル変数 n がコピーされ これが関数に渡されている 従って 関 数 ush() の中で n に変更を加えたとしても main関数 内の n の値には影響しない 12

13 スタック (ソースコード) 一方 o() では main関数内のローカル変数 n のポイ ンタを受け取る 関数 o() 内においては n はそのポインタ (アドレス) を示す変数であり, そのアドレスに書かれた情報を読み書 きするときは *n としてアクセスする 関数では まずスタックが空 (s==0) でないかチェック し 空でないときは s を1だけ減らしてから 配列の s 番要素を *n に書き込み 正常終了を示す返値 0 を返す 空の場合は何もせずに異常終了の返値 -1 を返す 13

14 スタックからのポップ 関数 o()の引数はポインタ渡しによる n これは main()関数内のローカル変数 n への参照 である グローバル変数 s 0 関数 main() 3 2 o(&n) stack c n o -51 int o(int int *n) *n n

15 キュー スタックでは データを入れたのとは逆の順番でデータ を取り出していた (LIFO方式) このやり方は まさに再 帰呼出で紹介したような用途に向く 一方 例えば役所 の窓口に人がどんどん来る場合を考えよう LIFO方式では 最後に列に加わった人から処理を行うが これは言うまでもなく不公平である 列に並んだ人々を 最初に並んだ人から順番に捌いていく必要がある これ を FIFO (First In First Out: 先入れ先出し) という このモデルを キュー (queue: 待ち行列) という 例 PCがインターネットで通信するとき ネットからは 続々とデータが流入するが 処理が追いつかない場合が ある このとき データを一時的にキューに置いておき 手が空き次第 先に来たデータから順に処理する

16 キュー 実装は スタックと同様 1次元配列 待ち行列の先頭位置を head 終端を tail とする tail の位置にデータを入れ head から出す キューのサイズは, (配列サイズ)ー1 になる queue[5] Data-F head tail queue[4] Data-E head tail queue[3] Data-D head tail queue[2] Data-C これが限界 head tail queue[1] Data-B Data-H head tail queue[0] Data-A Data-G head tail 16

17 キュー (ソースコード).223. プリプロセッサで配列サイズ MaxSize を100としている よって 容量は99となる キューの実体である配列 queue[] および先頭 末端位 置 head tail はグローバル変数として定義 キューにデータを入れる関数は int queuein(int n) データを取り出す関数は int queueout(int *n) main関数では スタックの場合と同様 キーボードから1 文字ずつの入力を繰り返し受け付け それが 'i' または 'I' のときはデータを入れ 'o' または 'O' の時はデー タを出している 17

18 キュー (ソースコード) キューがいっぱいの時に更にデータを入れようとすると queuein() が -1 を返す キューが空の時に取り出し をしようとすると queueout() が -1 を返す点はスタッ クと同じ また queueout() において 取り出した データを返すために参照渡しを使っている点も同じ キューにデータを入れる関数 queuein() においては キューがいっぱいであるかどうかを tail の次の位置が head と同じかどうかによって調べている 次の位置 を求めるために (tail+1)%maxsize とい う計算をしている MaxSize が 100 とするとき もしも tail が配列最後の位置 99 にあったとすれば 次の位置 は先頭 0 であり それはこの計算で求まる 18

19 キュー (ソースコード) tail の次の位置が head と重ならなければ キューには まだ余裕がある このとき tail の位置にデータ n を書 き込み tail を1つ進める queueout() では 最も古いデータを取り出す その位 置は head である 最初にキューが空かどうかを調べる head == tail な らキューは空っぽなので取り出せない head 位置のデータ queue[head] を ポインタ変数 *n に代入することで main関数に返した後 head を一つ進 める head の 次の位置 は (head+1)%maxsize である 例 配列サイズが100のとき 99の次は(99+1)%100=0 19

20 リストとは リスト (list) とは, データを鎖のようにつなぎ合わせて管理するデータ構造である. 各データは次のデータを指すポインタを持っている. このポインタで次々とデータをつないでいく ( リンクする ) ことによって, 任意の数のデータを扱える. 一方, データを配列で扱う場合は, あらかじめ決められた配列サイズを超えるデータは格納できない. リストでは, データを新たに格納するたびに, そのデータのための記憶領域を新規に確保していくので, サイズの制限がない ( もちろんコンピュータ上のメモリサイズ以上は格納できないが ). といっても理解しづらいので, 絵的に理解しよう..228~229 20

21 リストとは リスト構造においてつながれる各データ要素 (ノード node) は レコード によって構成される ノードはデータを入れる データ部 の他に 次のノードの アドレスを指し示す ポインタ部 を含む 最後尾のポインタ部は NULL としておく プログラムからリスト構造にアクセスするため リストの 先頭へのポインタ head を変数として記録しておく head ノード A データ部 B C ポインタ部 21

22 リストとは リストのノードはレコードであるから C言語において は構造体を用いて実装することができる struct tfield { char name[20]; データ部 char tel[20]; struct tfield *ointer; ポインタ部 }; このように 自分自身と同じ構造体へのポインタを持つ 構造体を 自己参照構造体 (self-referential structure) という 教科書.228 のコードに 誤植 tfieled ではなく tfield 型です 22

23 リストとは 前述の通り リスト構造では 必要に応じてノードを追 加 削除することができる このためにはノードのためのメモリ領域を 動的に確保 解放 しなくてはならない この目的で使われるのが メモリの動的確保 という方法で ある C言語ではメモリの動的確保のための関数が2つ用意され ている これらの間には微妙な違いがあるがほとんど同 じ ここでは malloc() を使う void *malloc(size_t size); void *calloc(size_t nmemb, size_t size); 23

24 リストとは 関数 malloc() は 引数 size で与えられたバイト数 のメモリ領域をそのプログラムのために確保し, 確保さ れた領域の先頭アドレスを返値として返す void *malloc(size_t size); 例えば int型の配列 (要素数10) の領域を確保して配 列 a[] を作るには 以下のようにする int *a; a = (int *)malloc(sizeof(int)*10); ただし sizeof(型名) は その型のサイズ (バイト 数) を表す 24

25 リストとは メモリ動的確保関数 malloc() を使って ノードの動的 確保を以下の関数で記述できる struct tfield *talloc(void) { return (struct tfield *)malloc(sizeof(struct tfield)); } tfield型ポインタへの型キャスト tfield型のサイズ この関数を用いて struct tfield *; = talloc(); 初期化前では 何が入って いるかは分からない とすると tfield 型のデータ領域を新たに確保し それへのポインタが に代入される 25

26 リストとは ノード内部のデータの参照方法は以下の通り 下記のように ノードへのポインタ によってノードが 指定されている場合 名前欄は ->name 電話番号欄は ->tel ポインタ欄は ->ointer により参照され る (*).name とかと同じ意味 ->ointer ->name ->tel inoue 一方, ノードがポインタでなく実体で記述されている 場合 つまり struct tfield node; として指定されて いる場合は それぞれの欄は node.name node.tel node.ointer として参照される 何を言っているか分からない人は十分復習すること 26

27 入力とは逆順なリストの作成 教科書.230 の例題 34 は ユーザが名前と電話番号を 次々に入力したとき そのデータが 入力されたのと逆順 で並ぶような リストを作成する手順である リストの先頭ノードを示すポインタを head とする 初期状態は空のリストであり このとき head は NULL データ追加手順は以下の通り (1) ノード 1つを新規生成し で指し示す = talloc(); (2) が指すノードにデータを書き込む (3) が指すノードのポインタ部に head をコピー ->ointer = head; (4) head から が指すノードを指す head = ; coy head Sato coy 27

28 入力とは逆順なリストの作成 次以降も同じ手順を繰り返すことで 入力とは逆順のリス トを生成できる (1) ノード 1つを新規生成し で指し示す = talloc(); (2) が指すノードにデータを書き込む (3) が指すノードのポインタ部に head をコピー ->ointer = head; (4) head から が指すノードを指し示す head = ; 手順 (3) と (4) の順序を取り違えるとまずいことになる head head Ota Sato Ota Sato 28

29 入力とは逆順なリストの作成 これを繰り返すと 入力されたのとは逆の順番のリスト構 造ができあがる head A B head C B A D C B head A 29

30 入力とは逆順なリストの作成 (ソース).231 動的メモリ確保関数 malloc() を使うため stdlib.h をインクルードする main関数では ローカル変数として リストの先頭を 示すポインタ head 新規ノードのポインタ を宣言 head を NULL で初期化している 次の while文では まず talloc() により新規ノード を作成してそのアドレスを に代入し ユーザから入 力された2つの文字列を ->name ->tel に代入 もしユーザから入力終了信号を受けた場合は, ループを 抜ける そうでないときは, (1) 新ノードのポインタ部 に旧リストの先頭アドレス (head) を代入 (2) head の指し示す先を新ノードに変更. 30

31 入力とは逆順なリストの作成 ( ソース ) while 文を抜けた時点で, ユーザから入力されたデータ群を逆順に保存したリスト構造ができている. その次の処理は, リスト構造の内容を表示する. 最初にポインタ変数 に head をコピー. これにより, は先頭ノードのアドレスを示す. 次の while 文は が NULL でない限り繰り返す. まず, が指し示すノードの内容を表示. 次に, = ->ointer とすることで, ポインタ変数 が, 今表示したノードの次のノードのアドレスを指し示すようにする. つまり, ここで は 視点 の役割. 末尾のノードのポインタ部は NULL なので, これにより に NULL が入って while 文を抜けることになる. 次ページで説明 31

32 リストの内容表示について 前のページの リストの内容表示の部分を説明する 今回は 変数 は 視点 として使う =head; while(!=null){ ループを抜けて終了 rintf("%15s%15s n",->name,->tel); =->ointer; がもともと指し示していたノードのポイン } タ部の情報を にコピーすると言うことは 視点 はもう一つ次のノードを指し示す head 作ったリスト構造 表示 表示 名3 電3 名2 電2 表示 名1 電1 講義スライドでは いちいち変数 から矢印を描くのは煩雑なので が示しているノードの上に単に と表記することが多いです 32

33 ノードへのポインタの表示方法 今後, 先ほどのポインタ変数 のように, 様々なノードを指し示すポインタについては, 上の図のようにいちいち矢印で指し示さず, 下の図のようにノードに と示すだけにする. が指し示すノードを ノード などと書く. =->ointer; head Iida Ota Sato head Iida Ota Sato 33

34 入力順のリストの作成 ここまでの話は, 入力順と逆順のリストの作成. では, 入力順のリストはどうすれば作れるか 途中まで作ったリストの最後尾のさらにあとに新規ノードを追加していけばよい. 仕上げとして, 最後に作ったノードのポインタ部を NULL にする. head A B head A B C D 34

35 入力順のリストの作成 面倒な問題 : ノード作成手順が 最初のノード と 次以降のノード で異なる. 最初のノードへのポインタ :head から 次以降のノードへのポインタ : 既存リスト最後尾から 最後尾ノードへのポインタを old とすると head A ノード作成 : head=talloc(); データ記入 : head->name, head->tel へ head A old B C コードが異なる ノード作成 : =talloc(); old->ointer=; データ記入 : ->name, ->tel へ 35

36 入力順のリストの作成 ( ソースコード ) 教科書.232~233 のソースコード (Dr34_1) 前半部 head=talloc(); 前処理 scanf("%s %s",head->name,head->tel); old=head; ( 最後尾ノードをポインタ old でポイントしておく ) while (=talloc(),scanf("%s %s",->name,->tel)!=eof){ old->ointer=; old=; } old->ointer=null; 後処理 head old old old ムダ A B C 36

37 ダミー ノード 先ほどのソース コードのデータ入力部は head=talloc(); scanf("%s %s",head->name,head->tel); 前処理での入力処理 old=head; while (=talloc(),scanf("%s %s",->name,->tel)!=eof){ old->ointer=; old=; } old->ointer=null; ループ内での入力処理 データ入力処理が scanf() 一つだけならいいが, より複雑な処理の場合, これは避けたい. これを避けるための一つの方法がダミー ノードである. 先頭ノードはデータを格納せず, ダミーとする. 37

38 ダミー ノード ( ソースコード ) 教科書.234~235 のソースコード (Dr34_2) 前半部 head=talloc(); scanf("%s %s",head->name,head->tel); old=head; while (=talloc(),scanf("%s %s",->name,->tel)!=eof){ old->ointer=; old=; } old->ointer=null; 入力処理はこれに統一 head old old old old A B C ダミー ノード 実際のデータ 38

39 ダミー ノード ( ソースコード ) 教科書.234~235 のソースコード (Dr34_2) 後半部 ( リスト内容の表示 ) =head->ointer; ( 視点は第 2ノードからスタートする ) while (!=NULL){ rintf("%15s%15s n",->name,->tel); =->ointer; } head A B C : NULL ダミー ノード 実際のデータ 39

40 リストへの挿入 リスト構造は データ列の途中の任意の位置においてデー タを挿入 削除するのに適している 配列の場合 挿入 削除に伴って他のデータの移動が必要 となるが リストではつなぎ換えだけでよい リストの場合 A C B D a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] 配列の場合 A C D B

41 リストへの挿入 教科書の例では 既存のリストの中から 特定のデータ (キーデータ) を逐次探索で探し出し そのノードの次の位置にデータを挿入する 例えば B のデータの次に C を挿入する場合 視点 を head で初期化 の位置のデータが B なら発見 そうで ないなら視点を右へずらす (=->ointer;) 発見したら ->ointer のところにノードを挿入 head ノード挿入手順 A B n=talloc(); scanf("%s",n->name); n n->ointer=->ointer; ->ointer=n; C D - 新規ノード n を作成 - そのポインタ部を次の ノードへ - のポインタ部を新しい ノードへ 41

42 リストへの挿入 (ソース) リストの先頭位置を示すポインタ head はグローバル変数として宣言 (struct tfield の型定義の部分) リストの生成は関数 genlist()にまとめられている ここでは逆順 リストの生成を行っている リスト内容表示は関数 dislist()にまとめられている ノードの挿入を行っているのは関数 link()である 引数は char 型 へのポインタ key であり キーデータの文字列に対応している (key というポインタ (アドレス) は char 型の配列の位置を表して おり, その配列に文字コード列が入っている. ) key の実体 (配列) は main関 数のローカル変数である key 'I' 'n' 'o' 'u' key[0] key[1] key[2] key[3] 42

43 リストへの挿入 (ソース) 関数 link() の中で行っている処理を見てみよう ローカル変数としてノードへのポインタ と n がある 最初にノードを一つ作成し それへのポインタを n に代 入 その中に入れるデータをキーボードから入力してい る 次に を視点として head で初期化 while (!=NULL) のループを回し いま視点を置いてい るノードの name欄が key と一致するかどうかを strcm() によって調べる 合致した場合は 視点位置 の次にノード n を挿入 ま ず n のポインタを の次 (->ointer) に向ける 次 に のポインタを n に向ける 合致しない場合は視点を次へ送る (=->ointer) 43

44 リストへの挿入 (ソース) キーデータが存在しなかった場合, 最後のノードで合致し ないことが分かった後 =->ointer; の処理によっ て には NULL が入る これにより while文の条件 ( が NULL でない限り続け ろ) が満たされなくなり while文を抜ける すると, 関数の最後でエラーメッセージを表示して終了す る つまり 新しいノード n は作りっぱなしで放置され てしまう (見つかったノード がリストの最後尾であった場合も 新規ノード n のポインタを n->ointer=->ointer とするので n->ointer はきちんと NULL になる ) 44

45 リストへの挿入 (キーデータ不在時) キーデータが見つからないときはリストの先頭へデータを 追加するように書き直したコードが 単に 先程の whileループを抜けたところでエラーメッ セージを出すだけではなく, そこに先頭への挿入手順を書 き加えればよい 先頭への挿入手順 (復習) (1) 新しいノード n のポイン タ部を 既存リストの先頭位置 (それまでの head) に向 ける (2) head を新しいノード n に向ける head Keisatsu 110 n Kyuukyuu

46 リストからの削除 既に存在するリストからキーデータを逐次探索で探し出し, そのノードをリストから削除する関数 del()を作る ダミー ノードを用いない場合は 先頭データを削除する 場合 と 先頭以外の場合 とで手順が異なるため 場合分けが 必要である 視点2つ と old を用意し 双方 head で初期化 while(!=null) のループで 視点 を回す キーデータが先頭 (A) だったとき (キーデータ発見の時点 で ==head) head を ->ointer に向ける head,old A B C ほんとは不要になったノードの消去を

47 リストからの削除 キーデータが先頭ではなかったとき (例えば C) キーデータと一致するノード () の一つ手前のノード (old) のポインタを の次のノード位置 (->ointer) に向けかえる, old は head で初期化していた 最初の位置 (A) では 発見しなかった場合 old = としてから を一つ進める ( = ->ointer) 発見したら old のポインタを ->ointer へ向ける キーデータが C の時, old A old->ointer = ->ointer;, old B C D 47

48 リストからの削除 発見したノード () が最後尾だとした場合も今のアルゴリ ズムできちんと処理可能 ノードが複数の場合 (検索キー C),old A,old B C old->ointer = ->ointer; = NULL ノードが一つだけしかなかった場合 (検索キー A),old A head = ->ointer; = NULL 48

49 リストからの削除 (ソース) 削除の関数は del() void del(char *key) キー文字列へのポインタを受け取っている { struct tfield *,*old; 視点 old 視点の一つ前のノード =old=head; 初期化 while (!=NULL){ if (strcm(key,->name)==0){ 視点位置 での照合 if (==head) head=->ointer; else old->ointer=->ointer; return; 抜ける 場合分けしてポインタ向けかえ } old=; =->ointer; 視点を右にずらす old は一個遅れて追従 } rintf("キーデータが見つかりません n"); エラーメッセージ } 49

50 リストからの削除 (ダミー ノード版) 先程の例では 削除されるべきノードが head に直結して いる場合と 次以降である場合とで head を変更す る 場合と old->ointer を変更する 場合の場合分 けが必要となる 前の議論と同様, この場合もダミー ノードが有用 これにより head 直後に対する場合分けがなくなるので 一つ手前の視点 である old を使う必要がなくなる 視点位置を とするとその次を見る の次のノー ドの名前欄 は ->ointer->name 次のノードのポ インタ欄 は ->ointer->ointer で参照できる ソースは.246 を head で初期化 ->ointer が NULL でない限り続ける while ループを回す 50

51 リストからの削除 (ダミー ノード版) ループ内部では ->ointer->name (の一つ先のノー ドのデータ部) と key との照合を行う 合致しない場合は 単に を1つ進める 合致した場合 ->ointer を ->ointer->ointer に向けかえる つまり のポインタ部を の二つ先につ ないでしまう 検索データが B の場合 A B C ダミー ノード ->ointer->name つまり A を調べる A B より 合致せず ここで合致 を2つ先 (->ointer->ointer) につなぐ 51

52 メモリ領域の開放 教科書のやり方では 削除されたノードへのポインタを向け変 えてすましている つまり 削除されたノードのメモリ領域 は どこからも参照されないムダ領域として残る ノードはもともと malloc() によって動的に確保されたも の つまり, プログラムのためにコンピュータから分けても らった領域である 教科書のやり方では ノードを削除してもそのノードのための メモリ領域はプログラムのために確保され続けるため 大量に ノードの作成 削除を繰り返すと 無駄に確保され続ける無用 のメモリ領域 (ゴミ) が大量に生まれてしまう コンピュータを ゴミ屋敷 のようにしないためには きちん とゴミを処分しなくてはならない 即ち 不要になったメモリ 領域を開放し コンピュータに返してやる 52

53 メモリ領域の開放 malloc() を使って動的に確保したメモリを解放してシス テム (コンピュータ) に返還する関数 free() 例えば ポインタ で参照されるノードを解放するに は free(); とすればよい これだけで スライド上に 大きな赤のバッテンで描いた消去処理が実現できる 例えば教科書.244 のコードでは 以下を追加すればよい if (strcm(key,->name)==0) 赤ペンなどで if (==head) 書き加えてください { head=->ointer; free();} else { old->ointer=->ointer; free();} return; } お行儀の良いプログラミングを 53

54 いろいろなリスト構造 ここまでで扱ってきたリスト構造 head から順にノード を後ろへたどっていき 最後は NULL で終わる このよう なリストを 線形リスト (linear list) と呼ぶ リストにはこれ以外の形式もある 循環リスト (circular list) 線形リストの最後が NULL で はなく 先頭ノードへのポインタとなっている 従って データの終端はない 線形リスト A B C D A B C D 循環リスト

55 双方向リスト また 線形リストでは常に前から後ろへ進むことしかできな い 次のノードへのポインタ (順ポインタ) はあるが 手 前のノードへのポインタ (逆ポインタ) はない 順ポインタとともに 逆ポインタも付け加えたリストがあり これを 双方向リスト (doubly-linked list) と呼ぶ ノードの構造体にはこれら2つのポインタ部, すなわち 順方向 のポインタ right 逆方向のポインタ left が入る 循環型でない場合は 両端の外側ポインタは NULL とし 両端 ノードへのポインタ head と tail を用いる 順ポインタ head A left tail B right C 逆ポインタ 55

56 双方向リストの作成 教科書の例では 末端である tail を起点にして 逆順リ ストの作成 を行い 左端を head からつなぐことによ り 逆順リストの生成手順を使って入力順リストを作って いる ソースは head A B tail C =talloc(); =talloc(); =talloc(); ->left=tail; ->left=tail; ->left=tail; tail=; tail=; tail=; ->right=head;->right=head;->right=head; head=; head=; head=; =->left; = NULL =->left; =->left; 56

57 循環 双方向リスト 双方向リストの両端のノード同士を相互に接続すれば, 循 環 双方向リストとなる (tail は不要となる) head tail A B ダミー ノード ダミー ノードが以下の2点で重要な役割を果たす (1) 先頭ノードに対する特別な処理の排除 (2) データ探索における番兵の役割 リストの作成時には まず空きリストから初めて新しい ノードを後ろへつなげていく head ダミー ノード 57

58 循環 双方向リスト 既存の循環 双方向リストに新たなノードを加える手順は 以下のようになる (順番に注意) (1) (新ノード) の right を先頭ノード (head) へ (2) の left を最後尾ノード (head->left) へ (3) 最後尾ノード (head->left) の right を へ (4) 先頭ノード (head) の left を へ 教科書に誤植.252 一つめの A は 正しくは D 初期状態 head A B この順番を間違うと何が起こるか考えてみること 58

59 自己再編成探索 (試験範囲外) 線形リストとして記録されたデータに対して逐次探索を行 うことを考える 逐次探索ではデータの先頭から1つ1つ調べていくので 後ろにあるものほど探索に時間がかかる ここで 一つの傾向を利用して探索効率を高めることを考 える 自己再編成探索 (self re-organizing search) 傾向 一度使われたデータは再度使われる可能性が高い そこで データが探索されるたびに 探索されたデータを 前の方に移動する 例 PC上で漢字変換をした場合 直前に変換した漢字が 今回の第1候補となる 学習機能 データの挿入 削除を頻繁に行う リストが適切

60 自己再編成探索 (探索データを先頭へ) まず逐次探索を行う 視点 と視点の手前 old を用意し て head で初期化 の位置を照合 一致しないときは old を のところへ 引っ張ってきてから を進める (=->ointer) 一致した場合 まず手前ノード (old) を の次のノード (->ointer) へつなげる 次に のポインタを先頭ノード (head) へ向け head を に向ける 探索データが C の場合 head, old, old A B C D 60

61 自己再編成探索 (探索データを1つ前へ) 探索データを1つだけ前に持って行くのは少し大変 探索データと1つ前との入れ替えのために, 2つ前 の位 置も分かっていなければならない ダミー ノード, old1, old2 の利用 で一致しないとき old1 を old2 へ old2 を へ を次へ 一致したら (1) old1->ointer を q として保存 (2) old1 のポインタを に (3) old2 のポインタを の次 に (4) のポインタを q に 探索データが C の場合 head old2,old1, old2 A 見つかったのがAまたはDのときは q B C D 61

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

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

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 - 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

第2回

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

More information

PowerPoint プレゼンテーション

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

More information

プログラミング実習I

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

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

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

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

memo

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

More information

Microsoft PowerPoint - 05.pptx

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

More information

PowerPoint プレゼンテーション

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

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 プレゼンテーション プログラミング応用演習 第 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

Microsoft PowerPoint - 11.pptx

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

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

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - 09.pptx 情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源

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

memo

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

More information

memo

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

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

Microsoft Word - 3new.doc

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

More information

Microsoft PowerPoint - 06.pptx

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

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

gengo1-11

gengo1-11 関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i

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

Microsoft PowerPoint - lec10.ppt

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

More information

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき

More information

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

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

More information

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do 8 構造体と供用体 ( 教科書 P.71) 構造体は様々なデータ型,int 型,float 型や char 型などが混在したデータを一つのまとまり, 単位として扱える.( 配列は一つのデータ型しか扱えない.) 構造体は柔軟なデータ構造を扱えるので, プログラムを効率よく開発できる. つまり構造体を使用すると, コード量を抑え, バグを少なくし, 開発時間を短くし, 簡潔なプログラムが作れる. 共用体は,

More information

memo

memo 計数工学プログラミング演習 ( 第 3 回 ) 2017/04/25 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 内容 ポインタの続き 引数の値渡しと参照渡し 構造体 2 ポインタで指されるメモリへのアクセス double **R; 型 R[i] と *(R+i) は同じ意味 意味 R double ** ポインタの配列 ( の先頭 ) へのポインタ R[i]

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

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

memo

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

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

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用 RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用体型のローカル変数を文字列操作関数で操作する場合の注意事項 (RXC#013) 配列型構造体または共用体の配列型メンバから読み出した値を動的初期化に用いる場合の注意事項

More information

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1 7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 10001 番地とすると, そこから int 型のサイズ, つまり 4 バイト分の領域が確保される.1

More information

Prog1_10th

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

More information

データ構造

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

More information

Microsoft Word - no11.docx

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

More information

Microsoft Word - no202.docx

Microsoft Word - no202.docx 1.4 ポインタと配列 ポインタ変数は前回説明したように 値の入っているアドレスを示す変数です では 配列はどの ようにメモリ上に格納されるか調べてみましょう ex07.c /* ポインタと配列の関係 */ int a[3]={1, 2, 3; /* int 型の大きさ 3 の配列として宣言 */ int *i; /* int 型へのポインタとして宣言 */ double x[3] = {1.0,

More information

program7app.ppt

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

More information

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

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

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

Microsoft Word - 13

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

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 Presentation

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

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

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先 第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先頭の要素要素から最後までが直線的に直結している構造 Set 同じものは含まないという構造. 要素間につながりはない

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

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

More information

情報処理Ⅰ演習

情報処理Ⅰ演習 C プログラミング Ⅱ の基礎 アドレス 変数のために用意されたメモリ領域の位置 アドレス 0x1000 0x1001 0x100 0x1003 0x1004 0x100 0x1006 0x1007 0x1008 0x1009 0x100A 0x100B メモリ 整数型の変数を宣言 int ; アドレス 0x1000 0x1001 0x100 0x1003 0x1004 0x100 0x1006 0x1007

More information

メソッドのまとめ

メソッドのまとめ 配列 (2) 2 次元配列, String http://jv2005.cis.k.hosei.c.jp/ 授業の前に自己点検 配列変数に格納される配列の ID と配列の実体の区別ができていますか 配列変数の宣言と配列の実体の生成の区別ができていますか メソッドの引数に配列が渡されるとき 実際に渡されるものは何ですか このことの重要な帰結は何ですか 引数の値渡しと参照渡しということばを例を挙げて説明できますか

More information

Microsoft PowerPoint - lec06 [互換モード]

Microsoft PowerPoint - lec06 [互換モード] 内 容 Ⅶ. クラスの定義 クラス定義の基本 フィールドの定義 メソッド定義 例題 : 円クラスのフィールドとメソッドの定義 コンストラクタ 例題 :Circle2を使ったアプレット 1 2 クラス定義の基本 オブジェクト指向のプログラム プログラム実行時に登場するオブジェクトの性質や挙動を記述する オブジェクトの性質や挙動を記述したものが クラス である Java プログラムを書くとはクラスを定義すること

More information

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

Microsoft PowerPoint - handout07.ppt [互換モード] Outline プログラミング演習第 7 回構造体 on 2012.12.06 電気通信大学情報理工学部知能機械工学科長井隆行 今日の主眼 構造体 構造体の配列 構造体とポインタ 演習課題 2 今日の主眼 配列を使うと 複数の ( 異なる型を含む ) データを扱いたい 例えば 成績データの管理 複数のデータを扱う 配列を使う! 名前学籍番号点数 ( 英語 ) 点数 ( 数学 ) Aomori 1 59.4

More information

演算増幅器

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

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

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n を入力してもらい その後 1 から n までの全ての整数の合計 sum を計算し 最後にその sum

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

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

プログラミング入門1

プログラミング入門1 プログラミング入門 2 第 8 回表形式データ (1) 1 テーマ : 表形式データ (1) 配列と複合データを用いた表形式データ データの登録 データの検索 データの更新 実際的はソフトウェアでは 表形式データの ( 例えば データベースのデータ ) を利用する場面が非常に多く とても重要である そこで 表形式を扱うプログラミングを繰り返しとりあげる 2 テーマ : 表形式データ (1) 配列と複合データを用いた表形式データ

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

講習No.9

講習No.9 日本語は通常 2 バイトの文字コード.JIS コード, シフト JIS コード, Unicode (UTF-8) 等の様々な文字コードがある. アスキーコード表 (ASCII code) アスキーコード ( 値 ) 漢字変換無しでキーボードから直接入力できる半角文字 32 48 0 64 @ 80 P 96 ` 112 p 33! 49 1 65 A 81 Q 97 a 113 q 34 " 50

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

演算増幅器

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

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

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

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

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

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

More information

Microsoft PowerPoint ppt

Microsoft PowerPoint ppt 基礎演習 3 C 言語の基礎 (5) 第 05 回 (20 年 07 月 07 日 ) メモリとポインタの概念 ビットとバイト 計算機内部では データは2 進数で保存している 計算機は メモリにデータを蓄えている bit 1bit 0 もしくは 1 のどちらかを保存 byte 1byte 1bitが8つ集まっている byte が メモリの基本単位として使用される メモリとアドレス メモリは 1byte

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

人工知能入門

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

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

memo

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

More information

PowerPoint プレゼンテーション

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

More information

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63> C 言語講座第 2 回 作成 : ハルト 前回の復習基本的に main () の中カッコの中にプログラムを書く また 変数 ( int, float ) はC 言語では main() の中カッコの先頭で宣言する 1 画面へ出力 printf() 2 キーボードから入力 scanf() printf / scanf で整数を表示 / 入力 %d 小数を表示 / 入力 %f 3 整数を扱う int 型を使う

More information

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要. 概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要. http://www.ns.kogakuin.ac.jp/~ct13140/progc/ C-2 ブロック 変数のスコープ C 言語では, から をブロックという. for( ) if( )

More information

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード] 第 3 回 Java 基本技術講義 クラス構造と生成 33 クラスの概念 前回の基本文法でも少し出てきたが, オブジェクト指向プログラミングは という概念をうまく活用した手法である. C 言語で言う関数に似ている オブジェクト指向プログラミングはこれら状態と振る舞いを持つオブジェクトの概念をソフトウェア開発の中に適用し 様々な機能を実現する クラス= = いろんなプログラムで使いまわせる 34 クラスの概念

More information

Microsoft PowerPoint - prog03.ppt

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

More information

計算機ソフトウエア

計算機ソフトウエア データ構造とプログラミング技法 ( 第 2 回 ) ー線形構造ー 線形構造 用語 : レコード : ひとまとまりのデータ ( 構造体 ) 線形リスト :n 0 個のレコードの1 次元並び 順配置 : 表 リンク配置 : 連鎖リスト 順配置された線形リスト : 表 論理構造 物理構造 a b c d f 要素の 位置 の順序関係を アドレスの値の順序関係で表現する方法 0000 0001 0002 0003

More information

Microsoft Word - no206.docx

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

More information

Microsoft Word - no103.docx

Microsoft Word - no103.docx 次は 数える例です ex19.c /* Zeller の公式によって 1 日の曜日の分布を求めるプログラム */ int year, month, c, y, m, wnumber, count[7] = {0, i; for(year = 2001; year

More information

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include 2. #include /*troupper,islower,isupper,tolowerを使うため宣言*/ 3. 4. int get_n(char *); 5. void replace(char

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション プログラミング初級 第 7 回 2017 年 5 月 29 日 配列 ( 復習 )~ 文字列 1 配列とは 2 配列 : 複数の変数をグループとしてまとめて扱うもの 配列 変数 int data[10]; 整数型の配列 同種のデータ型を連続して確保したものを配列とよぶ = 整数がそれぞれにひとつずつ入る箱を 10 個用意したようなもの int data; 整数型の変数 = 整数がひとつ入る dataという名前の箱を用意したようなもの

More information

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

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

More information

Microsoft Word - no12.doc

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

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

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

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

More information

Microsoft PowerPoint - prog04.ppt

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

More information

プログラミング入門1

プログラミング入門1 プログラミング入門 1 第 9 回 メソッド (3) 授業の前に自己点検 以下の質問に答えられますか? メソッドの宣言とは 起動とは何ですか メソッドの宣言はどのように書きますか メソッドの宣言はどこに置きますか メソッドの起動はどのようにしますか メソッドの仮引数 実引数 戻り値とは何ですか メソッドの起動にあたって実引数はどのようにして仮引数に渡されますか 戻り値はどのように利用しますか 変数のスコープとは何ですか

More information

2006年10月5日(木)実施

2006年10月5日(木)実施 2010 年 7 月 2 日 ( 金 ) 実施 ファイル処理ファイルとはファイル (file) は日常用語では紙などを綴じたものを表すが, コンピュータ用語ではデータの集合体を指す言葉である ファイルは例えば, 文書ファイルやプログラムファイルのように, 用途によって分類されることもあれば, また, テキストファイルやバイナリファイルのように, ファイルの作り方によって分類されることもある なお,

More information

Microsoft PowerPoint pptx

Microsoft PowerPoint pptx 情報処理 Ⅱ 第 10 回 2010 年 12 月 20 日 ( 月 ) 授業の進め方 プリプロセッサ指令 構造体 ファイル入出力 その他の型 記憶域管理関数 2 年以降でさらに学習 習熟 自分の思う通りに, 適切な形で, 配列 文字列プログラムとして表現する. ポインタ変数の関数識別子算術型有効範囲再帰呼び出しライブラリ関数制御文演算子 式評価 プログラムの作成 コンパイル 実行 2 本日学ぶこと

More information

ファイル入出力

ファイル入出力 C プログラミング Ⅱ の基礎 とは ファイルへデータを書き込んだり ( 出力 ), ファイルからデータを読み込んだり ( 入力 ) する C 言語では キーボードからの入力 画面への出力と同じようなコードで 処理を実現できる プログラム 入力 出力 ファイル 出力 入力 2 入出力の基本 ストリーム プログラム上で様々な装置への入出力を行う機構様々な入出力装置を統一的な方法で扱うことができる ハードディスクなどではファイルデータによって入出力が行われる

More information

アルゴリズムとデータ構造

アルゴリズムとデータ構造 講義 アルゴリズムとデータ構造 第 3 回基本的なデータ構造 ( リスト スタック キュー ) 大学院情報科学研究科情報理工学専攻情報知識ネットワーク研究室喜田拓也 講義資料 2018/5/23 今日の内容 基本的なデータ構造リスト : 最も基本的なデータ集合の表現 配列 / 連結リスト / 双連結リストによる実装 スタック : 積み上げ式のデータ格納方式キュー : 入れた順に取り出せるデータ格納方式

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

もう少し詳しい説明 1. アルゴリズムを構築するための 4 枚のサンプル画像を次々と読み込むここで重要なことは画像を順番に読み込むための文字列操作 for 文の番号 i を画像の番号として使用している strcpy は文字列のコピー,sprinf は整数を文字列に変換,strcat は文字列を繋げる

もう少し詳しい説明 1. アルゴリズムを構築するための 4 枚のサンプル画像を次々と読み込むここで重要なことは画像を順番に読み込むための文字列操作 for 文の番号 i を画像の番号として使用している strcpy は文字列のコピー,sprinf は整数を文字列に変換,strcat は文字列を繋げる サンプルプログラムの概要 1. アルゴリズムを構築するための 4 枚のサンプル画像を次々と読み込む 2. RGB 分離を行い,R 画像を用いて閾値 40 で 2 値化 3. ラベリングを行う ( ここで対象物の数を数えることになる ) 4. ラベル付された対象の重心を計算 5. ラベル値と重心位置を 2 値画像に表示 ( 赤い数字がラベル値, 緑色の点が重心位置を表している ) 6. テキストファイルに結果を書き出し

More information

ポインタ変数

ポインタ変数 プログラミング及び実習 7 馬青 1 文字列処理 文字列 文字列は " ( ダブルクォーテーション ) で囲んで表現される 文字列というデータ型が存在しないので 文字列は文字の配列 あるいはポインタ変数として扱われる また 文字の配列あるいはポインタ変数を宣言するときのデータ型は char を用いる 従って char s[]="ryukoku Uni."; あるいは char *s="ryukoku

More information

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){ ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す

More information