PowerPoint プレゼンテーション

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

PowerPoint プレゼンテーション

Microsoft Word - no206.docx

Microsoft PowerPoint - kougi9.ppt

PowerPoint プレゼンテーション

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

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

PowerPoint Template

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

memo

プログラミングI第10回

第2回

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

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

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

memo

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - 05.pptx

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft PowerPoint pptx

プログラミング基礎

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

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

memo

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

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

Microsoft PowerPoint - 06.pptx

第2回

Microsoft PowerPoint - 11.pptx

02: 変数と標準入出力

memo

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

2006年10月5日(木)実施

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

Microsoft Word - no15.docx

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

r07.dvi

ohp07.dvi

Microsoft PowerPoint - lec10.ppt

二分木の実装

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

02: 変数と標準入出力

Prog1_12th

PowerPoint Presentation

Prog1_15th

PowerPoint プレゼンテーション

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

Microsoft Word - no12.doc

第3回 配列とリスト

演算増幅器

Microsoft Word - no205.docx

PowerPoint プレゼンテーション

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

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

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

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

Microsoft Word - 13

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - prog03.ppt

memo

CプログラミングI

02: 変数と標準入出力

O(N) ( ) log 2 N

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

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

untitled

Microsoft PowerPoint - kougi8.ppt

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

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

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint ppt

kiso2-09.key

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

memo

gengo1-11

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

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

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

memo

Microsoft PowerPoint - prog06.ppt

02: 変数と標準入出力

program7app.ppt

Microsoft PowerPoint - 4.pptx

Microsoft PowerPoint - 5Chap15.ppt

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

AquesTalk プログラミングガイド

02: 変数と標準入出力

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

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

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

PowerPoint プレゼンテーション

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

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

Transcription:

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

前回の出席確認演習 #include <stdio.h> 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; maxlength=0; while((c=fgetc(fp))!= EOF) { if (c == '\n') { linecount++; if (maxlength < length) maxlength=length; length=0; else { length++; printf("linecount: %d\n",linecount); printf("maxlength: %d\n",maxlength); return 0;

前回の出席確認演習 求めなければならない情報は何か? 最長の行の長さ 各行の長さ ファイルの終了まで 1byte ずつ読むことを繰り返すサンプルが与えられている この繰り返しの中で各行の長さをどのように求めるか?

各行の長さを求める 読んでいるファイルの内容 \n a b o u n d s \n a b o u t \n a b o v e \n 0 1 2 3 4 5 6 7 0 1 2 3 4 5 0 1 2 3 4 5 0 改行を読んだら 0 になる 1byte 読むごとに 1 ずつ増える 次の改行を読んだら 0 にする前に長さが分かる こう変化する値があれば良い 最初は 0 にしておく

最大の長さを求める 暫定の最大値を用意しておく これまでに読んだ中で最長のものの長さ 最初は小さな値 ( 例えば 0) にしておく 長さが一つ分かるごとに 暫定の最大値と比較し より長ければ暫定最大値を更新 全部読むと 暫定ではなく 最大値となる

前回の出席確認演習 ( 再掲 ) #include <stdio.h> 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; maxlength=0; while((c=fgetc(fp))!= EOF) { if (c == '\n') { linecount++; if (maxlength < length) maxlength=length; length=0; else { length++; 各行の長さ 改行でないときに 1 増やす printf("linecount: %d\n",linecount); printf("maxlength: %d\n",maxlength); 最大の長さ length の方が長ければ maxlength を更新する 改行であれば 0 にする return 0;

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

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

再帰的構造体でポインタを使う理由 struct cell { ; int data; struct cell next; next をポインタではなく構造体そのものにすると コンパイルエラーになる この構造体のメモリイメージは? struct cell の記憶場所 int の記憶場所 パディング

再帰的構造体でポインタを使う理由 struct cell { ; int data; struct cell next; next をポインタではなく構造体そのものにすると コンパイルエラーになる この構造体のメモリイメージは? struct cell の記憶場所

再帰的構造体でポインタを使う理由 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; 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 x 39 stack r 39

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

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

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

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 する といったメモリ管理を行うプログラムを書くこともある