1 データ構造とアルゴリズム 第 3 回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~

Slides:



Advertisements
Similar presentations
プログラミング入門2 芝浦工業大学情報工学科青木 義満 第11回構造体. プログラミング入門2 2 構造体 5 人分のサッカー選手データ 全てのデータを関数に渡して,処理する場合 char name[5][256]; int assist[5]; int score[5]; void func( char.
Advertisements

アルゴリズムと データ構造 第 3 回 基本的なデータ構造(2) : 配列 1. 前回の復習 アルゴリズムの計算量 最悪(最大)計算量 計算量の漸近的評価 (オーダ)  多項式時間アルゴリズム( polynomial time algorithm )  指数時間アルゴリズム( exponential.
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
理化学研究所 第 10 回 構造体 半田利弘 鹿児島大学 大学院理工学研究科 物理・宇宙専攻 鹿児島大学 プログラミング基礎演習.
アルゴリズムと データ構造 第 2 回 アルゴリズムの計算量 基本的なデータ構造(1). 前回の復習(1) アルゴリズムの数学的定義  チューリングマシンで記述可能な手続きをアルゴリズムと呼ぶ データ構造とは  データをコンピュータの記憶部分に組織化して格納する表現方 法 プログラムとは  プログラムはデータ構造を利用して,アルゴリズムをプログラ.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
C言語講座 第4回 ポインタ.
アルゴリズムとデータ構造 2011年6月13日
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
第16章 構造体 16.1 構造体の定義と構造体変数 16.2 構造体の配列.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
構造体 プログラミング入門2 芝浦工業大学情報工学科 青木 義満
構造体 構造体, 構造体とポインタの組み合わせ,.
第10回 プログラミングⅡ 第10回
C言語講座 第3回 ポインタ、配列.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
プログラミング基礎B 文字列の扱い.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
アルゴリズムとプログラミング (Algorithms and Programming)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
アルゴリズムとデータ構造 2012年6月11日
プログラミング論 ポインタ
アルゴリズムとデータ構造1 2009年6月15日
ネットワーク・プログラミング Cプログラミングの基礎.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
プログラミング論 構造体
アルゴリズムとデータ構造 2010年6月17日
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
マスク合成(のような処理) 出力画像 Out 入力画像1 In1 In1 In2 Out 入力画像2 In
左右反転と180度回転 [0][xsize – 1] [0][0] → i ↓ j [ysize – 1][xsize – 1]
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
C言語講座第5回 2017 構造体.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

1 データ構造とアルゴリズム 第 3 回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~

2 前回の解答 問題1.次のうち、計算量が一番大きいものはどれ か O(1), O(n), O(n 2 ), O(n log n) 問題2.計算量が一番小さいものはどれか O(log n), O(n 3 ), O(n log n), O(n) 問題3.計算量の大きいものから順に並べなさい O(n 3 ), O(nlogn), O(n), O(logn), O(1)

3 得点分布 0729 : : : 設問3不正解 設問2不正解 設問1不正解

4 講義資料 但し虫食い版 できるだけ火曜日夕方までに用意したいと思っているが、 水曜日未明になることも予想される。 水曜日 2 コマよりちょっと早めに来て確認し、印刷して、 授業中に書き込むのを勧める

5 配列( array ) 同じ型の要素の集合 各要素はメモリ上に同じサイズで連続して格納さ れる 添え字 ( インデクス ) を指定することで,要素にラ ンダムにアクセス可能 data[0] data[1] data[2] data[3] 個々のセルに整数型の 要素が格納されている. 100 : 104 : 108 : アドレス メモリ

6 ランダムアクセス (random access) 使いたいデータにすぐアクセスできること CD プレーヤは聴きたい曲にランダムアクセス可能 cf) カセットテープは聴きたい曲を前から順に探す必要が ある ⇒シーケンシャルアクセス (sequential access) 例) data[0] data[1] data[2] data[3] アドレス メモリ 100 : 104 : 108 : 112 : y = data[2];

7 ランダムアクセス (random access) 使いたいデータにすぐアクセスできること CD プレーヤは聴きたい曲にランダムアクセス可能 cf) カセットテープは聴きたい曲を前から順に探す必要が ある ⇒シーケンシャルアクセス (sequential access) 例) data[0] data[1] data[2] data[3] アドレス メモリ 配列名 添字 (インデクス, index ) 100 : 104 : 108 : 112 : y = data[2];

8 配列を扱うときの注意点 C 言語による配列の宣言例 doubleheight[MAX]; intdata[4]; アドレス data[0] data[1] data[2] data[3] C C の場合は添字が必 ず0から始まる! 100 : 104 : 108 : 112 : メモリ

9 各部の計算量は? int printData(int n, int data[]) /* data の要素数は n とする */ { int i, j; for (i=0; i<n; i++) printf(“%d\n”, i); for (i=0; i<n; i++) printf(“%d \n”, data[i]); for (j=0; j<n; j++){ for (i=0; i<n; i++){ printf(“i*j は %d \n”, i*j); } return 0; } O(n) O(n 2 ) O(n)+O(n)+O(n 2 ) → O(n 2 )

10 異なる型のデータをまとめて扱うに は? 配列は同じ型のデータの集まり 文字列と数値など,異なる型のデータをまとめる にはどうしたらよいだろうか? 名前は文字列で 表現しよう 身長は整数型? 実数型? 4名分のデータの集 合をどう表わそう? 1名分のデータを まとめて管理でき ると便利だな 青木 177 小田 158 金子 167 佐藤 174

11 構造体( Structure ) (C 言語 ) さまざまな型をもつデータをまとめた もの ※「構造体」は C 言語特有の呼び名. ※一般には,「レコード構造( record structure )」と呼ばれる. cf.) PASCAL → レコード型 nam e heigh t メンバー 文字型配列 整数型

12 構造体宣言の例 struct STUDENT { char name[10]; int height; } st1, st2 ; 構造体タグ {}内で定義する構造体の名 前 メンバー (member) STUDENT 型の変数の定義 STUDENT 型 nam e heigh t nam e heigh t 変数 st1 変数 st2

13 メンバーの参照 ※ (構造体型の変数の名前). (メンバー名)で表 わせる st1.name = aoki; st1.height = 177; st2.name = oda; st2.height = 158; STUDENT 型 177 a o k i 158 o d a 変数 st1 変数 st2 ドット演算子(. 演算子,.operator ) nam e heigh t nam e heigh t

14 同じ型の構造体を並べて配列を作ることができ る struct STUDENT { char name[10]; int height; } ; struct STUDENT stData[4]; STUDENT 型構造体の 配列 構造体の配列 青木 177 小田 158 金子 167 佐藤 174 stData[0] stData[1] stData[2] stData[3] STUDENT 型 4名分のデータ をまとめて扱え る!

15 配列の短所 データの数をあらかじめ宣言する必要がある データを格納するための領域を自由に追加したり、 不要になったら領域を開放したい … どうする? ⇒ ポインタを利用 int a[3];

16 ポインタ( pointer )とは 変数を指し示すためのデータ型 他のデータへの参照を示す(他のデータが ある場所の番地が格納される) ポインタ型がある言語 C, PASCAL cf.) ポインタ型がない言語 BASIC, FORTRAN

17 ポインタ ポインタ型変数 ptr アドレス n 104番地 : メモリ空 間 ptr 80番地 : 「 ptr は n を指している 」 とは? int 型変数 n

18 ポインタとアドレス アドレス 50 104番地 : メモリ空 間 104番地 80番地 : 変数 n のデータが入っ ているメモリ上のア ドレスが格納される ポインタ型変数 ptr int 型変数 n

19 ポインタ型変数宣言の例 int n; int *ptr; n = 50; ptr = & n; アドレス演算子 (単項 & 演算子, &operator ) データが格納されているアドレスを 取り出す演算子 ← n は int 型の変数 ← ptr は int 型の変数を指すポインタ変数 ポインタであることを表わす記号 ( “ アスタリスク ” という)

20 ポインタ型変数宣言の例 int n; int *ptr; n = 50; ptr = & n; ptr n 104 番地 :80 番地 : 番地 :80 番地 : 104 番地 番地 :80 番地 :

21 参考)間接演算子 int n; int *ptr; n = 50; ptr = & n; printf(“ptr が指しているものの中身は %d” , *ptr); ptr 104 番地 : 104 番地 間接演算子 ( indirect operator ) ptr が n を指すとき, *ptr は n の別名(エイリアス)となる n 50 先ほどの*とは意味 が異なるので注意

22 参考 ) C 言語におけるポインタの使い 方 データ構造としてのポイン タ 参照渡しのためのポインタ 配列参照のためのポインタ void exsample1 (int a, int b, int *sum, int * diff) { *sum = a + b; *diff = a - b; } int a[5]; int i; for (i = 0; i < 5; i++) { a[i] = a[i] + 3; } int a[5]; int *p; for (p = a; p < a+5; p++) { *p = *p + 3; }

23 ポインタ図示の例 ポインタ ptr 整数型変数 ポインタ t mp 構造体 (レコード型変数) データ構造を図示するときは,ポインタは矢印を 使って表現される データ構造として見る場合は,ポインタがどのデ ータを指しているかが重要 (ポインタに入って いるアドレス値そのものは意識しなくて良い)

24 プログラム例 #include /* ITEM 型構造体の型定義 */ struct ITEM { int data; /* 整数値 */ struct ITEM *next; /* 次の ITEM 型構造体へのポインタ */ }; /* メイン部 */ int main(void) { struct ITEM *ptr; /* ITEM 型構造体へのポインタ変数.変数名は ptr */ ptr = (struct ITEM*)malloc(sizeof(struct ITEM)); /* メモリ確保 */ (*ptr).data = 100; (*ptr).next = NULL; free(ptr); /* メモリ解放 */ return 0; }

25 解説 ITEM 型構造体の型定義 struct ITEM { int data; struct ITEM *next; } ; ITEM 型構造体は, int 型のデータが入る箱と ITEM 型構造体へのポインタが入る箱から成る int 型の箱の名前(メンバー名)は data ポインタ型の箱の名前は next ITEM 型 int 型 ポインタ型 data next

26 変数の定義 struct ITEM *p tr ; struct ITEM 型構造体変数のアドレス を入れる箱(ポインタ変数 ptr )を用 意 この時点では,箱の中身は不定 ? ptr

27 メモリ領域の確保 ptr = (struct ITEM*)malloc(sizeof(struct ITEM)); struct ITEM 型構造体変数を入れるための箱 (メモリ領域)を確保. 箱のサイズは ITEM 型構造体の大きさ. その箱のアドレスを ptr に入れる. ptr ??

28 データの代入 (*ptr).data = 100; (*ptr).next = NULL; ptr の指すもののメンバー data に 100 を代入 ptr の指すもののメンバー next に NULL( ナル,0 番地 ) を代入 ptr ?? 100 *ptr.data と書くと, *(ptr.data) と解釈されるので注意する. ()の書忘れを防ぐため, -> 演算子(アロー演算子)を 用いて ptr -> data = 100 ; と書いても良い.

29 データの代入 (*ptr).data = 100; (*ptr).next = NULL; ptr の指すもののメンバー data に 100 を代入 ptr の指すもののメンバー next に NULL( ナル,0 番地 ) を代入 ptr ?? 100 NULL は斜線で表わされ ることが多い *ptr.data と書くと, *(ptr.data) と解釈されるので注意する. ()の書忘れを防ぐため, -> 演算子(アロー演算子)を 用いて ptr -> data = 100 ; と書いても良い.

30 メモリの解放 f ree(ptr); ptr が指しているメモリ領域を解放し,システムに 返す ptr 100

31 メモリリーク プログラムの実行中に確保したメモリ領域が解放 されないこと メモリリークすると、メモリ領域中の使用できる 部分が減る ptr 100 そっちを指すのは、僕 を解放してからにして よ~ malloc

32 ポインタを用いたデータ構造の実現 例 リスト (list) p.26 ~ 要素を順番に並べたもの 配列による実現 ポインタによる実現 詳細は次週 しりとり りんご ごじら らっぱ ぱそこん

33 まとめ 配列とは 構造体とは ポインタとは

34 本日の問題 問題 以下の4個のメンバーから構成される構造 体を定義せよ。タグ名を IMAGE とする。 ・整数値の番号 n ・ローマ字タイトル name ・実数値の平均輝度 avL ・次の IMAGE 型構造体へのポインタ next