PowerPoint プレゼンテーション

Similar documents
PowerPoint プレゼンテーション

Microsoft Word - no206.docx

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

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

プログラミングI第10回

PowerPoint プレゼンテーション

PowerPoint Template

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

Microsoft PowerPoint - kougi9.ppt

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

第2回

PowerPoint プレゼンテーション

memo

Microsoft PowerPoint - 6.pptx

memo

02: 変数と標準入出力

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

PowerPoint プレゼンテーション

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

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

Microsoft PowerPoint - 11.pptx

02: 変数と標準入出力

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

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

第2回

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - lec10.ppt

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

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

Microsoft PowerPoint - 06.pptx

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

memo

二分木の実装

02: 変数と標準入出力

Microsoft PowerPoint - 05.pptx

memo

第3回 配列とリスト

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

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

Prog1_15th

kiso2-09.key

CプログラミングI

02: 変数と標準入出力

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

memo

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

Microsoft PowerPoint - prog03.ppt

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

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

Microsoft Word - no15.docx

memo

演算増幅器

Microsoft Word - no12.doc

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

Microsoft Word - 13

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

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

Microsoft PowerPoint ppt

Microsoft PowerPoint pptx

r07.dvi

O(N) ( ) log 2 N

ohp07.dvi

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

PowerPoint プレゼンテーション

gengo1-11

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

02: 変数と標準入出力

PowerPoint Presentation

プログラミング及び演習 第1回 講義概容・実行制御

プログラミング基礎

PowerPoint プレゼンテーション

02: 変数と標準入出力

演算増幅器

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

PowerPoint プレゼンテーション

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

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

Microsoft PowerPoint - prog04.ppt

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

02: 変数と標準入出力

program7app.ppt

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

Microsoft PowerPoint - kougi8.ppt

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

PowerPoint プレゼンテーション

Microsoft Word - no11.docx

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

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

untitled

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

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

Microsoft PowerPoint - H22プログラミング第一(E)#12

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

プログラミング実習I

Microsoft Word - no205.docx

Microsoft PowerPoint - prog08.ppt

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

DVIOUT

1. 入力した正の整数を降順に並べ換えて出力するプログラムを作成せよ プログラムは個別にコンパイルし make コマンドで実行すること 入力データは 50 以下とし 以下の数が混在しているとする 16 進数 : 先頭 1 文字が x または X( エックスの小文字か大文字 ) 8 進数 : 先頭 1

Transcription:

プログラミング応用演習 第 4 回再帰的構造体

プログラミングを 余談 : 教えることの難しさ 丁寧に説明しないと分かってもらえない 説明すると 小難しくなる学生が目指すべきところプログラム例を説明されて理解できる違うやり方でも良いので自力で解決できる おっけー 動けば良い という意識でプログラミング 正しく動くことのチェックは必要 解答例と自分のやり方との比較が勉強になる

今日のお題 再帰的構造体 malloc と free

( 連結 ) リスト構造 吉田先生の データ構造とアルゴリズム でやりましたね? こんなデータ構造を作りたい : 21 33 39 ここで使われているを どう表現するか? これ ( ここではデータとポインタの組 ) をセル (cell) と呼ぶ struct cell { int data; ; struct cell *next; // データ // 次のセルへのポインタ 構造体の定義の中に同じ構造体へのポインタがある こうして循環する構造体を再帰的構造体という

再帰的構造体でポインタを使う理由 struct cell { ; int data; struct cell next; next をポインタではなく構造体そのものにすると コンパイルエラーになる この構造体のメモリイメージは? この構造体は大きさを決められない ( 無限大 ) 無限に続く ポインタ型の記憶領域のサイズは どれも同じ printf("%lu\n",sizeof(int*)); printf("%lu\n",sizeof(double*)); printf("%lu\n",sizeof(struct cell*));

リスト構造の終端 この斜線は何? 21 33 39 リストの最後なので 次は 無い 無いことを示す特別なポインタ値を入れておく 多くの場合 NULL を使う ちなみに 何もないことを Java では null と小文字で表記する C 言語では大文字で表記するので 間違えないように

プログラム例 #include <stdio.h> typedef struct _cell { int data; struct _cell *next; cell; void printlist(cell *p) { printf("( "); while( p!= NULL ) { printf("%d ",p->data); p = p->next; printf(")\n"); int main() { cell a,b,c; a.data=21; a.next=&b; b.data=33; b.next=&c; c.data=39; c.next=null; printlist(&a); return 0; ここで定義しようとしている構造体へのポインタをメンバとする ( 再帰的構造体 ) このとき typedef と構造体の宣言を同時にする場合でも 構造体の名前を省略できない a b c 21 33 39

ほかの再帰的構造の例 2 分木 これらの構造の単位を C 言語で表現してみよう 双方向リスト 双方向木

ほかの再帰的構造の例 2 分木 typedef struct _cell { int data; struct _cell *left; struct _cell *right; ; 双方向リスト typedef struct _cell { int data; struct _cell *left; struct _cell *right; ; 双方向木 typedef struct _cell { int data; struct _cell *parent; struct _cell *left; struct _cell *right; ;

動的メモリ割り付け 特に型を定めないポインタ long unsigned int の別名 void *malloc(size_t size); OS に size byte のメモリを要求する 成功すれば 先頭のポインタを返す 失敗すれば ( メモリが枯渇するなど ) NULL を返す 必要に応じて メモリを確保して使う : 動的メモリ割り付け 不要になったら 解放する (OS に通知する ): void free(void *ptr); 解放するメモリ領域の先頭のポインタを渡す

リスト構造を使ったスタック (1) #include <stdio.h> #include <stdlib.h> /* 連結リストの cell の定義 */ cell *push(int x, cell *stack) { cell *r = malloc(sizeof(cell)); if (r == NULL) { fprintf(stderr,"stack overflow\n"); exit(1); r->data = x; r->next = stack; return r; cell *pop(cell *stack) { cell *r; if (stack == NULL) { fprintf(stderr,"stack underflow\n"); exit(1); r = stack->next; free(stack); return r; push int top(cell *stack) { return stack->data; /* printlist の定義 */ int main() { cell *root = NULL; root = push(39,root); root = push(33,root); root = push(21,root); printlist(root); return 0; pop

push の様子 root x 39 stack r??

push の様子 root x 39 stack r 39

push の様子 ( 二つ目 ) root 39 x 33 stack r??

push の様子 ( 二つ目 ) root 39 x stack malloc で確保したメモリ領域は free するまで有効 33 x, stack, r の有効範囲は push 関数の中だけ r 33

ポインタのポインタ root ( こっちだけ ) どちらも cell* 型

ポインタのポインタ root cell のメンバ next の記憶領域を指す ポインタ値が入る記憶領域を指すポインタを考えることもできる これの型は cell**

リスト構造を使ったスタック (2) #include <stdio.h> #include <stdlib.h> /* 連結リストの cell の定義 */ /* printlist の定義 */ void push(int x, cell **stack) { cell *r = malloc(sizeof(cell)); if (r == NULL) { fprintf(stderr,"stack overflow\n"); exit(1); r->data = x; r->next = *stack; *stack = r; int pop(cell **stack) { int d; cell *r = *stack; if (*stack == NULL) { fprintf(stderr,"stack underflow\n"); exit(1); d = (*stack)->data; *stack = (*stack)->next; free(r); return d; int main() { cell *root = NULL; push(39,&root); push(33,&root); push(21,&root); printlist(root); return 0;

おまけ : 現実的なメモリ管理 malloc や free は OS にメモリ管理を依頼する OS の機能を呼び出す : システムコール OS はそれなりの作業をして返す 人間の感覚では瞬時とはいえ 多少の時間がかかる システムコールのオーバーヘッド 回数が多いときには無視できなくなる オーバーヘッドを減らすために malloc( や free) の回数を減らす : まとめて malloc して 少しずつ使う / まとめて free する といったメモリ管理を行うプログラムを書くこともある