23
二二 (Array) 2-1. 二二二二二 2-2. 二二二二二 2-3. 二二二二二二二 2-4. 二二二二二2-5.

二、陣列 (Array)

Embed Size (px)

DESCRIPTION

二、陣列 (Array). 2-1. 陣列及定義 2-2. 陣列的運算 2-3. 二維陣列的應用 2-4. 指標與結構體 2-5. 2-1 陣列及定義. 直覺的陣列表達方式 a 0 x 0 +a 1 x 1 +a 2 x 2 +...+a n x n = 0 (n 個變數分別為 x 0 , x 1 , ..., x n ) x 稱為變數的名稱 0 ... n 稱為足標 (index) 電腦的陣列表達方式 a[0] x[0]+a[1]x[1]+a[2]x[2]+a[3]x[3]+a[4]x[4] = 0 ( 電腦不用 『 ... 』 ) - PowerPoint PPT Presentation

Citation preview

Page 1: 二、陣列  (Array)

二、陣列 (Array)2-1. 陣列及定義2-2. 陣列的運算2-3. 二維陣列的應用2-4. 指標與結構體2-5.

Page 2: 二、陣列  (Array)

1.直覺的陣列表達方式a0x0+a1x1+a2x2+...+anxn = 0 (n 個變數分別為 x0, x1, ..., xn )

x 稱為變數的名稱0 ... n 稱為足標 (index)

2.電腦的陣列表達方式a[0]x[0]+a[1]x[1]+a[2]x[2]+a[3]x[3]+a[4]x[4] = 0 ( 電腦不用『 ...』 )

3.陣列的宣告 ( 以 C++ 為例 )

int a[5], x[5];

a 的位址為 03C4

a[3] 的位址為 03CA

2-1 陣列及定義

陣列 位址 位移量 實際位置 實際的值

a[0] 03C4 0 03C4 19

a[1] 03C4 2 03C6 21

a[2] 03C4 4 03C8 5

a[3] 03C4 6 03CA 115

a[4] 03C4 8 03CC 28

a[0] a[1] a[2] a[3] a[4]

03C4 03C6 03C8 03CA 03CC

Page 3: 二、陣列  (Array)

範例 :每個整數占 2 個位置,若 a[0] 位置在 03C0 ,則(1)a[1] 的位置為 : 03C2

(2)a[2] 的位置為 : 03C4

Page 4: 二、陣列  (Array)

計算一維陣列所佔的空間1.先算出陣列中每個變數的『長度』2.長度 * 個數 = 實際所值佔的空間 ( 以位元組 Bytes 來

計算 )

3.範例 :

某電腦的變數長度如下 :

int = 2 bytes, long = 4 bytes, double = 8 bytes;

(1) 則陣列 int a[60] 共佔幾個 bytes ?

答 : 60 * 2 = 120 bytes

(2) 如果 a[0] 的位址為 2044 ,則 a[20] 的位址為何 ?

答 : a[20] = 2044+20*2 = 2044+40 = 2084

2-1 陣列及定義

Page 5: 二、陣列  (Array)

計算一維陣列所佔的空間3.範例 :

某電腦的變數長度如下 :

int = 2 bytes, long = 4 bytes, double = 8 bytes;

(3) 如果 a[0] 的位址為 2044 ,則 a[39] 的位址為何 ?

答 : a[39] = 2044+39*2 = 2044+78 = 2122

2-1 陣列及定義

Page 6: 二、陣列  (Array)

計算二維陣列記憶體的位置1.如果已知 List[0][0] 位址為 2044

則 int List[1][2] 與 int List[3][1] 位址為何 ?

1) List[1][2]: 1( 列 )*5+2 = 5 + 2 = 7

2044 + 7*2 = 2044 + 14 = 2058

2) List[3][1]: 3*5+1 = 15 + 1 = 16

2044 + 16*2 = 2044 + 32 = 2076

找出二維陣列所佔的位置1.宣告 List[6][5]; 表示有 6 列第 5

行2. List[1][2]=19 表示第 1 列第 2 行

List[3][1]=25 表示第 3 列第 1 行

2-1 陣列及定義

0 1 2

19

25

第 2 行

第 1 列

第 1 行

第 3 列

Page 7: 二、陣列  (Array)

計算二維陣列的範例已知 sizeof(float) = 4 , float A[0][0] 的位址為 0492 ,則 :

1. float A[8][10] 共佔幾個位元組 ?

答 : 8*10*4 = 320 bytes

2. A[0][9] 的位址 ?

答 : 0492 + (0*10+9)*4 = 0492+36 = 0528

3. A[6][5] 的位址 ?

答 : 0492 + (6*10+5)*4 = 0492+65*4 = 0492+260

= 0752

2-1 陣列及定義

Page 8: 二、陣列  (Array)

第 1-18, 1-19, 2-27, 2-28 頁1.第一章 5, 7, 8, 9 題2.第二章 1, 2, 3 題11月 9 日上課時間交( 使用 A4大小的紙張,要寫學號及姓名 )

作業

Page 9: 二、陣列  (Array)

陣列運算的方式1.檢索陣列元素

例如 : 取出 A[5] 的值,並放入 x 中。 答 : X = A[5]

2.寫入陣列元素例如 : 將 X 的值放到 A[5] 中。 答 : A[5] = X

3.插入陣列元素4.刪除陣列元素5.複製整個陣列

2-2 陣列的運算

Page 10: 二、陣列  (Array)

陣列『插入』的運算方式1.執行步驟

(1) 自 11(List[2]) 以後的數值往後移一個位置 ( 由後面開始移動 )

(2) 將 67 寫入 11 的位置

2.演算法for (i=3 to 2)

List[i+1] = List[i]

List[2] = 67 // 67 放到 List[2] 的位置

3.複雜度for (i=n-1 to 0)

List[i+1]=List[i] // 共執行 n 次List[0]=67

次數 = n = O(n)

2-2 陣列的運算陣列 值

List[0] 5

List[1] 25

List[2] 11

List[3] 26

List[4] 39

插入 67

陣列 值

List[0] 5

List[1] 25

List[2] 67

List[3] 11

List[4] 26

39 不見了

Page 11: 二、陣列  (Array)

陣列『刪除』的運算方式1.執行步驟

(1) 自 11(List[2]) 以後的數值往前移一個位置 ( 由前面開始移動 )

2.演算法for (i=2 to 3)

List[i] = List[i+1]

3.複雜度for (i=0 to n-1)

List[i]=List[i+1] // 共執行 n 次次數 = n = O(n)

2-2 陣列的運算陣列 值

List[0] 5

List[1] 25

List[2] 11

List[3] 26

List[4] 39

刪除 11

陣列 值

List[0] 5

List[1] 25

List[2] 26

List[3] 39

List[4]

Page 12: 二、陣列  (Array)

陣列『複製』的運算方式1.執行步驟

(1) 自 ListA[0] 開始,將 ListA 複製到 ListB

2.演算法for (i=0 to 4)

ListB[ i ] = ListA[ i ]

3.複雜度for (i=0 to n-1)

List[ i ]=List[ i+1 ] // 共執行 n 次次數 = n = O(n)

2-2 陣列的運算

陣列 值ListA[0]

5

ListA[1]

25

ListA[2]

11

ListA[3]

26

ListA[4]

39

陣列 值ListB[0]

ListB[1]

ListB[2]

ListB[3]

ListB[4]

ListA[5] ListB[5]

Page 13: 二、陣列  (Array)

範例• 範例 一

如果有一個陣列如下stack[0]=5, stack[1]=21, stack[2]=19, stack[3]=32, stack[4]=39則在 stack[2] 的位置『插入』 67 的值,請寫出下面的結果 :stack[0]=5, stack[1]=21, stack[2]=67, stack[3]=19, stack[4]=32。

• 範例 二 如果有一個陣列如下stack[0]=18, stack[1]=12, stack[2]=13, stack[3]=0, stack[4]=0則在 stack[3] 的位置『插入』 42 的值,請寫出下面的結果 :stack[0]=18, stack[1]=12, stack[2]=13, stack[3]=42, stack[4]=0。

• 範例三如果有一個陣列如下stack[0]=18, stack[1]=12, stack[2]=13, stack[3]=32, stack[4]=39則將 stack[2] 的數值刪除後的結果 :stack[0]=18, stack[1]=12, stack[2]=32, stack[3]=39, stack[4]=0。

Page 14: 二、陣列  (Array)

二維陣列的表達法1. A[3][4] 的陣列可以表達『矩陣』

A[0][0] A[0][1] A[0][2] A[0][3]

A[1][0] A[1][1] A[1][2] A[1][3]

A[2][0] A[2][1] A[2][2] A[2][3] 3X4

2-3 二維陣列的應用

Page 15: 二、陣列  (Array)

矩陣的轉置1.轉置 A[3][4]

A[0][0] A[0][1] A[0][2] A[0][3]

A[1][0] A[1][1] A[1][2] A[1][3]

A[2][0] A[2][1] A[2][2] A[2][3] 3X4

2.轉置之後的結果 B[4][3] = A’B[0][0] B[1][0] B[2][0]

B[0][1] B[1][1] B[2][1]

B[0][2] B[1][2] B[2][2]

B[0][3] B[1][3] B[2][3] 4X3

3.演算法for (i=0 to 3) // A 矩陣的行 n

for (j=0 to 2) // A 矩陣的列 n

B[ j ][ i ] = A[ i ] [ j ] // 複雜度為 O(n2)

2-3 二維陣列的應用

範例 : 請寫出下面矩陣的轉置的結果 6 5 7 2 6 3 2 3 4 3 1 5 4 6 2 6 8 1 7 3 8 2 1 1

Page 16: 二、陣列  (Array)

矩陣的相加 ( 減 )1. A[3][3] + B[3][3]

A[0][0] A[0][1] A[0][2] B[0][0] B[0][1] B[0][2] C[0][0] C[0][1] C[0][2]

A[1][0] A[1][1] A[1][2] + B[1][0] B[1][1] B[1][2] = C[1][0] C[1][1] C[1][2]

A[2][0] A[2][1] A[2][2] B[2][0] B[2][1] B[2][2] C[2][0] C[2][1] C[2][2]

2.演算法for (i=0 to 2) // A 矩陣的列 n

for (j=0 to 2) // A 矩陣的行 n

C[ i ][ j ] = A[ i ] [ j ] + B[ i ][ j ] // 複雜度為 O(n2)

範例 : 請寫出下面兩個矩陣相加的結果3 2 1 + 4 1 2 = 7 3 3

4 3 2 2 1 3 6 4 5

2-3 二維陣列的應用

Page 17: 二、陣列  (Array)

矩陣的相乘1. A[3][2] X B[2][3]

A[0][0] A[0][1] B[0][0] B[0][1] B[0][2] C[0][0] C[0][1] C[0][2]

A[1][0] A[1][1] + B[1][0] B[1][1] B[1][2] = C[1][0] C[1][1] C[1][2]

A[2][0] A[2][1] C[2][0] C[2][1] C[2][2]

2.演算法for (i=0 to 2) // A 矩陣的列 n

for (j=0 to 2){ // B 矩陣的行 n

C[ i ][ j ] = 0;

for (k=0 to 1){ // B 矩陣的列 n

C[ i ][ j ] = C[ i ][ j ] + A[ i ][ k ] x B[ k ][ j ] O(n3) }

}

2-3 二維陣列的應用

Page 18: 二、陣列  (Array)

指標1.定義 : 變數在記憶體中的位址

宣告一個變數 I ,表示在記憶體中給定一個位址 03C8

I = 5 表示將 5 放到 03C8 的位址

2.表示變數所占的位址*A = &I ( 假設此時 *A 的位址是 03C4)

=> 此時 A 的內容含有 I 的位址3.此時的 A 稱為 指標

下面兩行的結果相同I = 6

*A = 6

2-4 指標與結構體

03C8 5

記憶體中的位址03C4 03C6 03C8 03CA 03CC

I = 5A

範例 : 寫出 A 的內容 int A, *B; A = 5; *B = &A; *B = 7;

答 : A = 7

Page 19: 二、陣列  (Array)

結構體1.定義 : 將多個不同型態的變數集合在一起2.表示一個人的基本資料

struct student {

char name[8]; // 姓名 int age; // 年齡 int height; // 身高 }

3.結構體體的使用student S1, S2; // 宣告 2 個學生 S1, S2

strcpy(S1.name,“Mary”); // 第 1 位學生的姓名為  Mary

S1.age = 12; // 第 1 位學生的年齡 12

S1.height = 160;

2-4 指標與結構體

Page 20: 二、陣列  (Array)

字串的基本觀念1.定義 :

字元是指單一的字母 ( 如 A, B, C, F, ...) ,而字串則為一連串的字元( 如 Friend, Quit, Book, ...) ,字串的結尾使用‘ \0’作為結束

2.宣告方式char name[10] = “Mary”;

char str[12];

3.在記憶體中所佔的位址

2-5 字串

M a r y \0

位址 : name[0] name[1] name[2] name[3] name[9]

\0

name[10]

str[12]

Page 21: 二、陣列  (Array)

2-3

• 範例 :如果宣告一個字串為 name[10]=“Mary”,則 name[2] 為 r name[3] 為 y 。

字串的結尾通常為 \0 。

Page 22: 二、陣列  (Array)

字串的運算1. strlen ( 求出字串的長度 )

範例 : char name[8] = “Mary”;

int I = strlen(name); // 此時 I 的內容為 4

2. strcpy ( 字串的複製 )範例 : char name[10] = “Mary”;

char str[12];

strcpy(str, name); // 將 name 的內容複製到 str

3. strcmp ( 字串的比較 )範例 : char name[8] = “Mary”;

char str1[12] = “Mary”;

char str2[12] = “Mary1”;

int I = strcmp(str1, name); // name 和 str1 內容相同,傳回 0

int J = strcmp(str2, name); // name 和 str2 內容不同,傳回 1

2-5 字串

Page 23: 二、陣列  (Array)

字串的運算4. substr ( 取出字串的部分 )

範例 : char name[8] = “Mary”;

char str[12];

substr(str, name, 1, 2); // 由 name 的第 1 個字元開始取出字元,共取出 2 個 // 此時 str 的內容為 “ ar”

2-5 字串

由第幾個字元開始取( 由 0 起算 ) 總共要取出幾個字元