Upload
dora-castaneda
View
42
Download
2
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
二、陣列 (Array)2-1. 陣列及定義2-2. 陣列的運算2-3. 二維陣列的應用2-4. 指標與結構體2-5.
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
範例 :每個整數占 2 個位置,若 a[0] 位置在 03C0 ,則(1)a[1] 的位置為 : 03C2
(2)a[2] 的位置為 : 03C4
計算一維陣列所佔的空間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 陣列及定義
計算一維陣列所佔的空間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 陣列及定義
計算二維陣列記憶體的位置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 列
計算二維陣列的範例已知 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 陣列及定義
第 1-18, 1-19, 2-27, 2-28 頁1.第一章 5, 7, 8, 9 題2.第二章 1, 2, 3 題11月 9 日上課時間交( 使用 A4大小的紙張,要寫學號及姓名 )
作業
陣列運算的方式1.檢索陣列元素
例如 : 取出 A[5] 的值,並放入 x 中。 答 : X = A[5]
2.寫入陣列元素例如 : 將 X 的值放到 A[5] 中。 答 : A[5] = X
3.插入陣列元素4.刪除陣列元素5.複製整個陣列
2-2 陣列的運算
陣列『插入』的運算方式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 不見了
陣列『刪除』的運算方式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]
陣列『複製』的運算方式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]
範例• 範例 一
如果有一個陣列如下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。
二維陣列的表達法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 二維陣列的應用
矩陣的轉置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
答
矩陣的相加 ( 減 )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 二維陣列的應用
矩陣的相乘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 二維陣列的應用
指標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
結構體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 指標與結構體
字串的基本觀念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]
2-3
• 範例 :如果宣告一個字串為 name[10]=“Mary”,則 name[2] 為 r name[3] 為 y 。
字串的結尾通常為 \0 。
字串的運算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 字串
字串的運算4. substr ( 取出字串的部分 )
範例 : char name[8] = “Mary”;
char str[12];
substr(str, name, 1, 2); // 由 name 的第 1 個字元開始取出字元,共取出 2 個 // 此時 str 的內容為 “ ar”
2-5 字串
由第幾個字元開始取( 由 0 起算 ) 總共要取出幾個字元