1 / 23

二、陣列 (Array)

二、陣列 (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 ( 電腦不用 『 ... 』 )

Download Presentation

二、陣列 (Array)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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

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

  4. 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

  5. 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

  6. 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

  7. 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

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

  9. 2-2陣列的運算 • 陣列運算的方式 • 檢索陣列元素例如: 取出A[5]的值,並放入x中。 答: X = A[5] • 寫入陣列元素例如: 將X的值放到A[5]中。 答: A[5] = X • 插入陣列元素 • 刪除陣列元素 • 複製整個陣列

  10. 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不見了

  11. 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

  12. 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]

  13. 範例 • 範例 一如果有一個陣列如下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。

  14. 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

  15. 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 答

  16. 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

  17. 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) } }

  18. 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

  19. 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;

  20. 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]

  21. 2-3 • 範例:如果宣告一個字串為name[10]=“Mary”,則name[2]為r name[3]為y。字串的結尾通常為 \0。

  22. 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

  23. 2-5字串 字串的運算 4. substr (取出字串的部分)範例: char name[8] = “Mary”; char str[12]; substr(str, name, 1, 2); // 由 name 的第 1 個字元開始取出字元,共取出 2 個// 此時 str 的內容為 “ar” 由第幾個字元開始取 (由 0 起算) 總共要取出幾個字元

More Related