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

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

PowerPoint プレゼンテーション

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

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

プログラミングI第10回

memo

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

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

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

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - lec10.ppt

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

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

02: 変数と標準入出力

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

Microsoft Word - no206.docx

プログラミング実習I

PowerPoint プレゼンテーション

Microsoft PowerPoint - 6.pptx

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

02: 変数と標準入出力

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

Microsoft Word - no202.docx

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

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

第2回

Microsoft Word - no15.docx

02: 変数と標準入出力

Microsoft PowerPoint pptx

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

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

02: 変数と標準入出力

Microsoft PowerPoint - 05.pptx

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

情報処理Ⅰ演習

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

memo

Microsoft Word - no12.doc

program7app.ppt

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

02: 変数と標準入出力

memo

Microsoft Word - 3new.doc

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

gengo1-11

第3回 配列とリスト

CプログラミングI

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

Microsoft Word - no02.doc

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

02: 変数と標準入出力

Microsoft PowerPoint - 09.pptx

講習No.12

02: 変数と標準入出力

Microsoft PowerPoint - 11.pptx

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

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

02: 変数と標準入出力

第2回

02: 変数と標準入出力

JavaプログラミングⅠ

Prog1_15th

PowerPoint プレゼンテーション

PowerPoint Template

プログラミング基礎

Microsoft PowerPoint - prog06.ppt

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

講習No.9

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

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

Microsoft PowerPoint - kougi9.ppt

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Prog1_10th

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

I117 プログラミング演習II

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

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

memo

02: 変数と標準入出力

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

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

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

Microsoft PowerPoint ppt

Microsoft Word - 13

プログラミング実習I

Microsoft PowerPoint pptx

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

演算増幅器

Microsoft PowerPoint - prog03.ppt

PowerPoint プレゼンテーション

02: 変数と標準入出力

第2回講義:まとめ

プログラミング基礎

PowerPoint プレゼンテーション

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

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

memo

Microsoft Word - no103.docx

目次

Transcription:

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

ポインタ変数の扱い方 1 ポインタ変数の宣言 int *p; double *q; 2 ポインタ変数へのアドレスの代入 int *p; と宣言した時,p がポインタ変数 int x; と普通に宣言した変数に対して, p = &x; は x のアドレスのポインタ変数 p への代入

ポインタ変数の扱い方 3 間接参照 ( 演算子 ) * ポインタ変数名 例 ) *p; により, ポインタ変数が指す変数の実体を 間接的 に扱える

データ構造とポインタ 構造体とポインタ 関数とポインタ 配列とポインタ 文字列とポインタ ポインタ配列 ポインタのポインタ 引数付きmain 関数

構造体とポインタ 1 構造体のポインタ変数宣言 : struct 構造体タグ名 * 構造体ポインタ変数名 ; 例 ) struct DATE_DATA { int year; int month; int day; }; struct DATE_DATA today; struct DATE_DATA *pdata;

構造体とポインタ 2 構造体ポインタ変数の参照 代入 : 構造体ポインタ変数名 -> メンバ名 (* 構造体ポインタ変数名 ). メンバ名 と同じ 例 ) pdata=&today; とアドレスを代入した時, today.year (*pdata).year pdata->year

関数とポインタ 1 ポインタと関数引数 : 値による呼び出し (call by value) 変数の値を引数として関数へ渡す 参照による呼出し (call by reference) アドレスを引数として関数へ渡す 関数の引数はポインタでなければならない

#include <stdio.h> int add20(int x); void addp20(int *p); void main(void) { int k, m, n; m=10; n=10; } k=add20(m); addp20(&n); printf( %d %d %d, k, m, n); 30 10 30 int add20(int x) { } x+=20; return x; void addp20(int *p) { } *p+=20;

関数とポインタ 2 ポインタを返す関数戻り値がポインタとなる関数の宣言 関数のデータ型 * 関数名 ( 引数の並び ) 例 ) void main(void) { int *p; p=func(10); } int *func(int x) { int y; y=x+100; return &y; }

リンクによるリスト (linked list) 目的 : ポインタの応用 動的な記憶領域の確保

リンクによるリスト リストは, 配列のような一種のデータ構造 1 リストは, 項目 ( 要素 ) を一列に並べるという点で配列と同じ 2 配列では, 逐次的な構造が ( 配列中の位置によって ) 自然に指定される 3 リストでは, 項目を入れる 節点 の中に次の節点を明示的に指示するリンク ( ポインタ ) を入れて表現する

配列 : char a[5] A L I S T a[0] a[1] a[2] a[3] a[4] リンクによるリスト : A L I S T 節点 リンク

リンクによるリスト 1 リストの先頭の節点を指すダミーの節点を設定して, これを head ( または root) で表すことにする 2 リスト中で最後に位置する節点として, ダミーの節点を設定して, これを tail で表すことにする head tail A B C NULL

C 言語によるリストの実現 準備 1 記号定数 NULL ポインタに対する特別な値であることを示す記号としてゼロの代わりに使われる 2 sizeof 演算子 ( 教科書 p-22) データ型や変数の大きさ ( バイト数 ) を求める演算子 sizeof( 型名または変数名 ) 例 ) sizeof(int) 4 バイト

C 言語によるリストの実現 3 型変換演算子 ( キャスト演算子 ) ( 教科書 p-40) データ型の一時的変換を行う演算子 ( 型 ) ( 変数または式 ) 例 ) (float) 8

C 言語によるリストの実現 4 動的に記憶領域を確保するための標準関数 #include <stdlib.h> malloc ( 記憶領域の大きさ ( バイト数 n) ) n バイトの初期化されていないメモリへのポインタを返す malloc から返されるポインタは, 適当な型に変換されなければならない

C 言語によるリストの実現 5 記憶領域を解放する #include <stdlib.h> free ( 解放する記憶領域を指すポインタ ) 必要の無くなった記憶領域を OS へ返す メモリの無駄をなくす

C 言語によるリストの実現 構造体を使った節点の実現 struct node { int key; struct node *next; }; node key next 自己参照構造体 : 構造体の中に, 自分自身の構造体を参照するメンバを含めることができる

C 言語によるリストの実現 malloc を使った新しい節点の動的な生成 struct node *x; x=(struct node *) malloc(sizeof(*x)); 型変換 標準関数 sizeof 演算子

初期化 head tail struct node *head, *tail; void listinitialize(void) { }; NULL head = (struct node *) malloc(sizeof(* head)); tail = (struct node *) malloc(sizeof(* tail)); head->next = tail; tail->next = NULL;

リスト表現を用いた操作 挿入 削除 参照 節点 ( 要素 ) の並べ変え

挿入 head tail A B C NULL X

挿入 head tail A B C NULL X

挿入 struct node *insertafter(int v, struct node *p) { struct node *x; x = (struct node *) malloc(sizeof(* x)); x->key = v; x->next = p->next; p->next = x; return x; p }; q

挿入 struct node *insertafter(int v, struct node *p) { struct node *x; x = (struct node *) malloc(sizeof(* x)); x->key = v; x->next = p->next; p->next = x; return x; p x }; v q

削除 void deletenext(struct node *p) { struct node *x; x = p->next; p->next = p->next->next; free(x); }; p v x q

削除 void deletenext(struct node *p) { struct node *x; x = p->next; p->next = p->next->next; free(x); }; p q v

削除 void deletenext(struct node *p) { struct node *x; x = p->next; p->next = p->next->next; free(x); }; p q

参照 k 番目の要素 ( 節点 ) の値を参照 リストでは,head からリンクをたどっていくしかない (k ステップかかる ) 配列では,1 ステップ, すなわち a[k] ですむ

配列 : char a[5] A L I S T a[0] a[1] a[2] a[3] a[4] リンクによるリスト : A L I S T

参照 head tail A B C struct node *x; NULL x = head; while(x->next->next!= NULL) { x = x->next; printf("%d ", x->key); };

節点の並べ変え ポインタのつけかえのみ head tail A B C 例 ) C をリストの末尾から先頭へ移動 NULL

節点の並べ変え ポインタのつけかえのみ head tail A B C NULL

節点の並べ変え ポインタのつけかえのみ head tail A B C NULL

節点の並べ変え ポインタのつけかえのみ head tail A B C NULL 3 つのポインタのつなぎ変え

今日の課題 課題 1 授業中に紹介した linked list のプログラムを完全なプログラムにしなさい main 関数の中で scanf を使って数字を読み込むこと

今日の課題 課題 2 課題 1 で作成したプログラムに 登録した値すべてを表示する機能を追加しなさい

今日の課題 課題 3( 発展課題 ) 課題 2 で作成したプログラムに 登録した値が小さい順にソートする機能を追加しなさい

考察で期待すること linked list の挿入や削除を理解する 各ステップにおけるリストの状態を表示してみる etc