1 / 92

陣列結構

Chapter 2. 陣列結構. 2.1 前言. 「陣列」 ( Array) 結構具有以下重要特徵: 一個陣列可以包含許多個 陣列元素 ,陣列元素之個數又稱為 陣列之大小 。 同一個陣列裡的元素都 具備相同的資料型態 (Data Type) 。 為方便資料的存取,可將陣列設計成一維 (Dimension) 、二維、三維, ... ,甚至更多維的陣列。. 2.1 前言. 宣告一個陣列時,作業系統會在記憶體空間指定一個 起始位置 給該陣列,並且根據 陣列的資料型態和大小 來配予一組 連續 的記憶體位置。

adila
Télécharger la présentation

陣列結構

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. Chapter 2 陣列結構 資料結構導論 - C語言實作

  2. 2.1 前言 • 「陣列」(Array)結構具有以下重要特徵: • 一個陣列可以包含許多個陣列元素,陣列元素之個數又稱為陣列之大小。 • 同一個陣列裡的元素都具備相同的資料型態(Data Type)。 • 為方便資料的存取,可將陣列設計成一維(Dimension)、二維、三維,...,甚至更多維的陣列。 資料結構導論 - C語言實作

  3. 2.1 前言 • 宣告一個陣列時,作業系統會在記憶體空間指定一個起始位置給該陣列,並且根據陣列的資料型態和大小來配予一組連續的記憶體位置。 • 陣列元素在記憶體中的位置是連續且相鄰的,因此只要透過一套簡單的陣列元素位址計算公式,便能得知某陣列元素所在之記憶體位置。 • 經由陣列索引(Index),可以迅速且直接地存取陣列中的元素資料。 資料結構導論 - C語言實作

  4. 2.2 宣告陣列 • 宣告陣列時須定義下列幾項屬性: • 陣列的資料型態。 • 陣列的名稱。 • 陣列的維度,即中括號([ ])的個數。 • 陣列每一維度的元素個數,亦即陣列大小。 • 陣列元素的初值,此項可以省略。 資料結構導論 - C語言實作

  5. 2.2 宣告陣列 • 以C語言為例,宣告陣列的語法如下: 資料結構導論 - C語言實作

  6. 2.2.1 一維陣列 【例1】宣告一個可以用來存放6次考試成績的整數陣列。 int grades[6] = {83, 75, 92, 74, 88, 93}; 資料結構導論 - C語言實作

  7. 2.2.2 二維陣列 【例2】宣告二維陣列。 資料結構導論 - C語言實作

  8. 2.2.2 二維陣列 【例3】宣告grades[50][6]為一個可以用來儲存50位同學之5次資料結構考試成績之二維陣列。 int grades[50][6] ; 資料結構導論 - C語言實作

  9. 2.3 陣列的表示法 • 一維陣列的表示法 • 二維陣列的表示法 • 三維陣列的表示法 • 多維度陣列的表示法 • 上三角矩陣 • 下三角矩陣 • 我們將「陣列」與「矩陣」視為同義詞 資料結構導論 - C語言實作

  10. 2.3.1 一維陣列的表示法 • A[n] = {A[0],A[1],…,A[n-1]} • 假設 • 一維陣列A在記憶體的起始位置為α。 • 每個陣列元素所需的儲存空間是z個位元組(Byte) 。 • 陣列元素A[i]的記憶體位址為Loc(A[i]) 。 • 則: Loc(A[i]) = A的起始位址 + A[i]相對於陣列起始位置之位移 = α + i  z。 資料結構導論 - C語言實作

  11. 2.3.1 一維陣列的表示法 【例1】設陣列A是一個大小為10的一維陣列,且陣列A在記憶體之起始位置為1000,且每個元素都需要2個位元組的儲存空間。則 A[7]的記憶體位置為何? 【解答】 Loc(A[7]) = A的起始位址 + A[7]相對於陣列起始位置之位移= 1000 + 7  2 = 1014。 資料結構導論 - C語言實作

  12. 2.3.1 一維陣列的表示法 【例2】設d[100] 為一個實數陣列,每一個元素佔4個位元組。若d[10]的位址為2000,則d[88]的位址為何? 【解答】 Loc(d[88]) = d[10]的位址 + d[88]相對於d[10]之位移= 2000 + (88-10)  4 = 2312。 資料結構導論 - C語言實作

  13. 2.3.1 一維陣列的表示法 • A[f:t] = {A[f] ,A[f-1] ,... ,A[0] , A[1] , ... ,A[t] } 。 • 假設 • 一維陣列A[f]在記憶體的起始位置為α。 • 每個陣列元素所需的儲存空間是z個位元組(Byte) 。 • 陣列元素A[i]的記憶體位址為Loc(A[i])。 • 則: Loc(A[i]) = A的起始位址 + A[i]相對於陣列起始位置之位移 = α + (i-f)  z。 資料結構導論 - C語言實作

  14. 2.3.1 一維陣列的表示法 【例3】設A[-15:25]在記憶體的起始位置為123,且每一元素佔4個位元組,則A[3]的位址為何? 【解答】 Loc(A[3]) = A[-15:25]的起始位址 + A[3]相對於A[-15:25]之位移= 123 + (3-(-15))  4= 195。 資料結構導論 - C語言實作

  15. 2.3.2 二維陣列的表示法 • B[m][n] = {B[0][0],B[0][1],…,B[m-1][n-1] } 。 • 共計有mn個元素。 資料結構導論 - C語言實作

  16. 2.3.2 二維陣列的表示法 • 將二維的陣列元素轉換成一維排列的方式有下列兩種: • 以列為主(Row Major) 。 • 以行為主(Column Major) 。 資料結構導論 - C語言實作

  17. 2.3.2 二維陣列的表示法 • 以列為主(Row Major)的表示法: • 假設 • 假設二維陣列B在記憶體的起始位置為α 。 • 陣列之個別元素所需的記憶體空間大小為z 。 • 陣列元素B[i][j]的記憶體位址為Loc(B[i][j]) 。 • 則: LocRM(B[i][j]) = B的起始位址 + B[i][j]相對於陣列起始位置之位移= α + (i  n + j)  z 。 資料結構導論 - C語言實作

  18. 2.3.2 二維陣列的表示法 • 以行為主(Column Major)的表示法: • 假設 • 假設二維陣列B在記憶體的起始位置為α 。 • 陣列之個別元素所需的記憶體空間大小為z 。 • 陣列元素B[i][j]的記憶體位址為Loc(B[i][j]) 。 • 則: LocCM(B[i][j]) = B的起始位址 + B[i][j]相對於陣列起始位置之位移= α + (j  m + i)  z 。 資料結構導論 - C語言實作

  19. 2.3.2 二維陣列的表示法 【例1】已知A[1][2]之記憶體位置為22,且A[2][4]和A[4][2] 之記憶體位置分別為30和40,則A[5][5]之位置為何? 【解答】 因為A[2][4]的記憶體位置30小於A[4][2] 的記憶體位置40,可見該陣列是採「以列為主」排列。因此: LocRM(A[i][j]) = A的起始位址 + A[i][j]相對於陣列起始位置之位移= α + (i  n + j)  z。 資料結構導論 - C語言實作

  20. 2.3.2 二維陣列的表示法 LocRM(A[2][4]) = A[1][2]的位址 + A[2][4]相對於A[1][2]之位移 = 22 + ((2-1)  n + (4-2)) z = 22 + (n + 2) z = 30。 所以,nz + 2z = 8 …………(1) LocRM(A[4][2]) = A[1][2]的位址 + A[4][2]相對於A[1][2]之位移 = 22 + ((4-1) n + (2-2)) z = 22 + (3n + 0)  z = 40。 所以,3nz = 18 ,nz = 6 …………(2),將(2)代入(1)得到 6 + 2z = 8,z = 1,代入(2) 得到 n = 6,因此 資料結構導論 - C語言實作

  21. 2.3.2 二維陣列的表示法 LocRM(A[5][5]) = A[1][2]的位址 + A[5][5]相對於A[1][2]之位移= 22 + ((5-1) n + (5-2)) z= 22 + (4 6 + 3) 1 = 49。 資料結構導論 - C語言實作

  22. 2.3.2 二維陣列的表示法 【例2】設A[f1:t1][f2:t2] 為一個二維陣列宣告,其記憶體起始位置為α,每個元素所佔的記憶體空間為z。則陣列元素A[i][j]之位置為何? 【解答】 • 已知A[f1][f2]在記憶體之起始位置為α,且每個元素所佔的記憶體空間為z。 • 設二維陣列A共有m列n行,則m = t1-f1+1,n = t2-f2+1。 資料結構導論 - C語言實作

  23. 2.3.2 二維陣列的表示法 • 以列為主 LocRM(A[i][j]) = A[f1][f2]的起始位址 + A[i][j]相對於A[f1][f2]之位移= α + ((i-f1)  n + (j-f2))  z • 以行為主 LocCM(A[i][j]) = A[f1][f2]的起始位址 + A[i][j]相對於A[f1][f2]之位移= α + ((j-f2)  m + (i-f1))  z 資料結構導論 - C語言實作

  24. 2.3.3 三維陣列的表示法 int cubic[3][2][3] = { {1,2,3,4,5,6}, {7,8,9,1,2,3}, {4,5,6,7,8,9}}; • 它包括3個平面,每個平面有2列及3行。 平面 列 行 資料結構導論 - C語言實作

  25. 2.3.3 三維陣列的表示法 • 假設我們宣告了一個三維陣列C[l][m][n] • l 代表第一個維度的大小。 • m代表第二個維度的大小。 • n 代表第三個維度的大小。 • 共計有 lmn 個陣列元素。 • 假設 • C[0][0][0]在記憶體中的起始位置為α。 • 陣列之個別元素所需的記憶體空間大小為z 。 資料結構導論 - C語言實作

  26. 2.3.3 三維陣列的表示法 • 以列為主(Row Major)的表示法: • 共計有 l 個平面,每個平面有 m 列與 n 行。 LocRM(C[i][j][k]) = α + (imn + jn + k)  z • 以行為主(Column Major)的表示法: • 共計有 n 個平面,每個平面有 l 列與 m 行。 LocCM(C[i][j][k]) = α + (klm + jl + i)  z 資料結構導論 - C語言實作

  27. 2.3.4 多維度陣列的表示法 • 假設 • n維度陣列D[s1][s2][s3]…[sn]在記憶體中的起始位置為α。 • 其中s1,s2,…,sn分別為D陣列的第1維、第2維,…,第n維的元素個數。 • 每個陣列元素所須要的記憶體儲存空間為z。 資料結構導論 - C語言實作

  28. 2.3.4 多維度陣列的表示法 • 以列為主(Row Major)的表示法: LocRM(D[i1][i2]…[in]) = α + (i1s2s3…sn-1sn + i2s3s4…sn-1sn + i3s4s5…sn-1sn + … + in-3sn-2sn-1sn + in-2sn-1sn + in-1sn + in)  z 。 資料結構導論 - C語言實作

  29. 2.3.4 多維度陣列的表示法 • 以行為主(Column Major)的表示法: LocCM(D[i1][i2]…[in]) = α + (ins1s2…sn-2sn-1 + in-1s1s2…sn-3sn-2 + in-2s1s2…sn-4sn-3 + … + i3s1s2 + i2s1 + i1)  z 。 資料結構導論 - C語言實作

  30. 2.3.5 對角線矩陣的表示法 • 對角線矩陣(Diagonal Matrix) • 是一個「方陣」。 • 除了對角線的元素值可能不為0外,其餘元素值均為0。 • 亦即,矩陣元素vi,j = 0,i ≠ j。 資料結構導論 - C語言實作

  31. 2.3.5 對角線矩陣的表示法 • 對角線矩陣(Diagonal Matrix) • 對角線矩陣DM[m][m]共有m個非0元素。 • 我們可以直接用一個一維陣列X[m]來表示對角線矩陣。 • 亦即X[i]= DM[i][i]。 資料結構導論 - C語言實作

  32. 2.3.6 下三角矩陣的表示法 • 下三角矩陣(Lower Triangular Matrix) • 它是一個「方陣」。 • 對角線以上(不含對角線)的元素值均為0。 資料結構導論 - C語言實作

  33. 2.3.6 下三角矩陣的表示法 • 假設 • 下三角矩陣式的陣列X在記憶體之起始位置為α。 • 且每個陣列元素所需的記憶體空間為z。 • 採「以列為主」的儲存策略,則 LocRM(Xi,j)=  + ((i(i+1))/2 + j)  z 。 資料結構導論 - C語言實作

  34. 2.3.6 下三角矩陣的表示法 【例1】設X[n][n]為一個下三角矩陣,若要用一個一維陣列Y[m]來表示X,則m的最小值應該宣告為何? 【解答】 m = 1+2+3+...+n = n(n+1)/2。 資料結構導論 - C語言實作

  35. 2.3.7 上三角矩陣的表示法 • 上三角矩陣(Upper Triangular Matrix) • 它是一個「方陣」。 • 對角線以下 (不含對角線)的元素值均為0。 資料結構導論 - C語言實作

  36. 2.3.7 上三角矩陣的表示法 • 假設 • 下三角矩陣式的陣列X在記憶體之起始位置為α。 • 且每個陣列元素所需的記憶體空間為z。 • 採「以行為主」的儲存策略,則 LocCM(Xi,j)=  + ((j(j+1))/2 + i)  z。 資料結構導論 - C語言實作

  37. 2.4 一維陣列的應用 • 2.4.1 計數器(Counter) • 2.4.2 暫存(Temporary Store) • 2.4.3 取代(Substitution) • 2.4.4 索引(Indexing) • 2.4.5 搜尋(Searching) • 2.4.6 排序(Sorting) 資料結構導論 - C語言實作

  38. 2.4.1 計數器(Counter) • i = i + 1; (或 i++; ) 。 • int count[n]; //宣告 ... count[i] = count[i] + 1; //計數器 + 1 或 count[i]++ ; //計數器 + 1 資料結構導論 - C語言實作

  39. 2_dice_toss.c (p.2-26) #include <stdio.h> #include <math.h> void dicetoss(int *count, int n); void main(void) { int count[6] = {0}; int i, n; clrscr(); printf("請輸入擲骰子的次數 : "); scanf("%d",&n); dicetoss(count, n); 資料結構導論 - C語言實作

  40. printf("\n\n---------------------------"); printf("\n 共計投擲 %2d 次,其中",n); for(i = 0; i < 6; i++) printf("\n %d 點出現 %2d 次",i+1,count[i]); printf("\n---------------------------\n"); } /********************************************/ /* 利用一個亂數產生函數(式)來模擬骰子的投擲 */ /********************************************/ void dicetoss(int *count, int n) { int i, point; for(i = 0; i < n; i++) { point = rand() % 6 ; count[point] = count[point] + 1; } } 資料結構導論 - C語言實作

  41. 2.4.2 暫存(Temporary Store) • 「質數」:大於1的數,除了1與本身以外沒有任何一個數能夠整除它時,該數稱為質數。 • 2是最小的質數。 • 3、5、7均是質數。 • 4、6不是質數,因為4可以被2整除,6可以被2、3整除 。 資料結構導論 - C語言實作

  42. 2.4.2 暫存(Temporary Store) • 如何找出小於等於100的所有質數呢? • 第一種方法: • 根據質數的定義,判斷5是否為質數時,須將5除以2、3、4,只要能被其中一個數整除,那麼5就非質數,否則5就是質數。 • 依此類推,判斷x是否為質數時,須將x除以2、3、4...、x-1,只要能被其中一個數整除,那麼x就非質數,否則x就是質數。 資料結構導論 - C語言實作

  43. 2_prime1.c (p.2-30) #include <stdio.h> void main(void) { int n, count = 0; int i, j; enum boolean isprime; enum boolean {false,true}; clrscr(); printf("請輸入大於 1 的整數 : "); scanf("%d",&n); printf("\n不大於 %d 的質數有...\n\n",n); 資料結構導論 - C語言實作

  44. /* 質數的定義:一個正整數,除了 1 和本身以外沒有別的因數:一個正整數,除了 1 和本身以外不能被其他的數所整除 */ for(i = 1; i <= n; i++) { isprime = true; switch(i) { case 1 : /* 1 非質數 */ isprime = false; break; case 2 : /* 2 是最小的質數 */ break; default : for(j = 2; j < i; j++) { if((i % j) == 0) { /* i 可被 j 整除,非質數 */ isprime = false; break; } else; } } 資料結構導論 - C語言實作

  45. if(isprime == true) { /* 印出質數 */ count ++; printf("%3d ",i); if(count % 15 == 0) /* 每印滿15個質數就跳下一行 */ printf("\n\n"); else; } else; } printf("\n\n==> 不大於 %d 的質數共有 %d 個",n,count); } 資料結構導論 - C語言實作

  46. 2.4.2 暫存(Temporary Store) • 第二種方法: • 將第1個找到的質數暫存於prime[0],將第2個找到的質數暫存於prime[1],將第3個找到的質數暫存於prime[2],依此類推。 • 要判斷一個整數x是否為質數時,我們只須取出prime陣列裡已經找到的質數來當做除數,將x除以這些質數,如果都不能被這些質數整除,即可斷定x為質數。 • 因此,要判斷6是否為質數時,只須分別判斷6是否能被2、3、5整除即可,只要能被其中一個質數整除,6就非質數。因6能被2整除,非質數,不須再判斷能否被3、5整除了。 資料結構導論 - C語言實作

  47. 2_prime2.c (p.2-33) #include <stdio.h> #include <math.h> #define N 120 int find_prime(int *prime, int n); void main(void) { int i, n, count = 0; int prime[N] = {0}; clrscr(); printf("請輸入大於 1 的整數 : "); scanf("%d",&n); printf("\n不大於 %d 的質數有...\n\n",n); /*找出不大於 n 的所有質數 */ count = find_prime(prime, n); 資料結構導論 - C語言實作

  48. /* 印出不大於 n 的所有質數 */ for(i = 0; i <= count; i++) { printf("%d ",prime[i]); if((i+1) % 15 == 0) /* 每印滿 15 個質數就跳下一行 */ printf("\n\n"); } printf("\n\n小於等於 %d 的質數共有 %d 個",n,count+1); } /* 找出 <= n 的所有質數,採用以下定義 */ /* 質數的定義:一個正整數,不能被小於本身的所有質數所整除 */ /* 被找到的質數站存在陣列prime[]之中 */ /*-----------------------------------------------------------*/ int find_prime(int *prime, int n) { enum boolean isprime; enum boolean {false,true}; int i, j, count = -1; 資料結構導論 - C語言實作

  49. for(i = 2; i <= n; i++) { isprime = true; switch(i) { case 2 : /* 2 是最小的質數 */ prime[++count] = i; break; default : for(j = 0; prime[j] != 0 && prime[j] <= sqrt(i) && isprime == true; j++) { if((i % prime[j]) == 0) /* 非質數 */ isprime = false; else; } if(isprime == true) prime[++count] = i; } } return count; } 資料結構導論 - C語言實作

  50. 2.4.3 取代(Substitution) • 要印出 • 則可用陣列來儲存花色和點數以取代之 資料結構導論 - C語言實作

More Related