230 likes | 341 Views
二、陣列 (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 ( 電腦不用 『 ... 』 )
E N D
二、陣列 (Array) 2-1. 陣列及定義 2-2. 陣列的運算 2-3. 二維陣列的應用 2-4. 指標與結構體 2-5.
2-1 陣列及定義 • 直覺的陣列表達方式a0x0+a1x1+a2x2+...+anxn = 0 (n個變數分別為x0, x1, ..., xn)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 (電腦不用『...』) • 陣列的宣告(以C++為例)int a[5], x[5];a 的位址為 03C4a[3]的位址為03CA a[0] a[1] a[2] a[3] a[4] 03C4 03C6 03C8 03CA 03CC
範例: • 每個整數占2個位置,若a[0]位置在03C0 ,則 • a[1]的位置為: 03C2 • a[2]的位置為: 03C4
2-1陣列及定義 • 計算一維陣列所佔的空間 • 先算出陣列中每個變數的『長度』 • 長度 * 個數 = 實際所值佔的空間 (以位元組Bytes來計算) • 範例:某電腦的變數長度如下: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陣列及定義 • 計算一維陣列所佔的空間 • 範例:某電腦的變數長度如下: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陣列及定義 • 找出二維陣列所佔的位置 • 宣告 List[6][5]; 表示有6列第5行 • List[1][2]=19表示第1列第2行List[3][1]=25表示第3列第1行 第1行 第2行 第1列 第3列 • 計算二維陣列記憶體的位置 • 如果已知List[0][0]位址為2044則int List[1][2]與int List[3][1]位址為何? • List[1][2]: 1(列)*5+2 = 5 + 2 = 72044 + 7*2 = 2044 + 14 = 2058 • List[3][1]: 3*5+1 = 15 + 1 = 162044 + 16*2 = 2044 + 32 = 2076
2-1陣列及定義 • 計算二維陣列的範例 • 已知sizeof(float) = 4,float A[0][0]的位址為0492,則: • float A[8][10]共佔幾個位元組?答: 8*10*4 = 320 bytes • A[0][9]的位址?答: 0492 + (0*10+9)*4 = 0492+36 = 0528 • A[6][5]的位址?答:0492 + (6*10+5)*4 = 0492+65*4 = 0492+260 = 0752
作業 • 第1-18, 1-19, 2-27, 2-28 頁 • 第一章 5, 7, 8, 9 題 • 第二章 1, 2, 3 題 • 11月9日上課時間交 • (使用A4大小的紙張,要寫學號及姓名)
2-2陣列的運算 • 陣列運算的方式 • 檢索陣列元素例如: 取出A[5]的值,並放入x中。 答: X = A[5] • 寫入陣列元素例如: 將X的值放到A[5]中。 答: A[5] = X • 插入陣列元素 • 刪除陣列元素 • 複製整個陣列
2-2陣列的運算 • 陣列『插入』的運算方式 • 執行步驟(1) 自11(List[2])以後的數值往後移一個位置(由後面開始移動)(2) 將67寫入11的位置 • 演算法for (i=3 to 2) List[i+1] = List[i]List[2] = 67 // 67放到List[2]的位置 • 複雜度for (i=n-1 to 0) List[i+1]=List[i] // 共執行 n 次List[0]=67次數 = n = O(n) 插入67 39不見了
2-2陣列的運算 • 陣列『刪除』的運算方式 • 執行步驟(1) 自11(List[2])以後的數值往前移一個位置(由前面開始移動) • 演算法for (i=2 to 3) List[i] = List[i+1] • 複雜度for (i=0 to n-1) List[i]=List[i+1] // 共執行 n 次次數 = n = O(n) 刪除11
2-2陣列的運算 • 陣列『複製』的運算方式 • 執行步驟(1) 自ListA[0]開始,將ListA複製到ListB • 演算法for (i=0 to 4) ListB[ i ] = ListA[ i ] • 複雜度for (i=0 to n-1) List[ i ]=List[ i+1 ] // 共執行 n 次次數 = n = O(n) ListB[5] ListA[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。
2-3二維陣列的應用 • 二維陣列的表達法 • 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二維陣列的應用 • 矩陣的轉置 • 轉置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 • 轉置之後的結果 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 • 演算法for (i=0 to 3) // A矩陣的行 n for (j=0 to 2) // A矩陣的列 nB[ j ][ i ] = A[ i ] [ j ] // 複雜度為O(n2) 範例: 請寫出下面矩陣的轉置的結果 6 5 7 2 6 3 2 3 4 3 1 5 4 6 2 6 8 1 7 3 8 2 1 1 答
2-3二維陣列的應用 • 矩陣的相加(減) • 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] • 演算法for (i=0 to 2) // A矩陣的列 n for (j=0 to 2) // A矩陣的行 nC[ 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二維陣列的應用 • 矩陣的相乘 • 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] • 演算法for (i=0 to 2) // A矩陣的列 n for (j=0 to 2){ // B矩陣的行 nC[ i ][ j ] = 0; for (k=0 to 1){ // B矩陣的列 nC[ i ][ j ] = C[ i ][ j ] + A[ i ][ k ] x B[ k ][ j ] O(n3) } }
2-4指標與結構體 • 指標 • 定義: 變數在記憶體中的位址宣告一個變數 I,表示在記憶體中給定一個位址 03C8I = 5 表示將 5 放到 03C8 的位址 • 表示變數所占的位址*A = &I (假設此時 *A 的位址是 03C4)=> 此時 A 的內容含有 I 的位址 • 此時的 A 稱為 指標下面兩行的結果相同I = 6*A = 6 記憶體中的位址 03C4 03C6 03C8 03CA 03CC A I = 5 範例: 寫出 A 的內容 int A, *B; A = 5; *B = &A; *B = 7; 答:A = 7
2-4指標與結構體 • 結構體 • 定義: 將多個不同型態的變數集合在一起 • 表示一個人的基本資料struct student { char name[8]; // 姓名int age; // 年齡int height; // 身高} • 結構體體的使用student S1, S2; // 宣告2個學生 S1, S2strcpy(S1.name,“Mary”); // 第1 位學生的姓名為 MaryS1.age = 12; // 第 1 位學生的年齡 12S1.height = 160;
2-5字串 • 字串的基本觀念 • 定義: 字元是指單一的字母(如A, B, C, F, ...),而字串則為一連串的字元(如Friend, Quit, Book, ...),字串的結尾使用‘\0’作為結束 • 宣告方式char name[10] = “Mary”;char str[12]; • 在記憶體中所佔的位址 位址: name[0] name[1] name[2] name[3] name[9] name[10] str[12]
2-3 • 範例:如果宣告一個字串為name[10]=“Mary”,則name[2]為r name[3]為y。字串的結尾通常為 \0。
2-5字串 • 字串的運算 • strlen (求出字串的長度)範例: char name[8] = “Mary”; int I = strlen(name); // 此時 I 的內容為 4 • strcpy (字串的複製)範例: char name[10] = “Mary”; char str[12];strcpy(str, name); // 將 name 的內容複製到 str • 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” 由第幾個字元開始取 (由 0 起算) 總共要取出幾個字元