360 likes | 533 Views
陣列 Array. chapter 3. 陣列的觀念. 陣列是指一群變數之集合,具有 相同名稱 相同資料型態 若要存取陣列中的變數 , 我們只需要透過陣列的編號 ( 註標 、 索引 ) 來指定變數即可 陣列與變數的功能都是用來儲存資料 每一個變數只能儲存一項資料,而陣列可以同時連續儲放多項資料, 陣列一次可宣告很多個變數,而不用一個一個宣告 陣列可以少寫許多行程式,並且搭配迴圈可重複執行相同指令運算. 陣列的觀念. p3-2. 【 說明 】 A 陣列表示內共有 5 個陣列元素 ,也就是有 5 個變數 ,分別為 A[0] 、 A[1] 、 A[2]……A[4]
E N D
陣列Array chapter 3 德明科技大學資訊科技系
陣列的觀念 • 陣列是指一群變數之集合,具有 • 相同名稱 • 相同資料型態 • 若要存取陣列中的變數, 我們只需要透過陣列的編號(註標、索引)來指定變數即可 • 陣列與變數的功能都是用來儲存資料 • 每一個變數只能儲存一項資料,而陣列可以同時連續儲放多項資料, • 陣列一次可宣告很多個變數,而不用一個一個宣告 • 陣列可以少寫許多行程式,並且搭配迴圈可重複執行相同指令運算 德明科技大學資訊科技系
陣列的觀念 p3-2 • 【說明】 • A陣列表示內共有5個陣列元素,也就是有5個變數,分別為A[0]、A[1]、A[2]……A[4] • (2)每一個陣列元素可以存放一筆資料 • (3)陣列內容的存取,通常是以迴圈指令配合輸入或輸出指令來進行,如下片段程式 德明科技大學資訊科技系
陣列的宣告 p3-5 【語法】資料型態 陣列名稱[陣列大小];【說明】 (1)「陣列名稱」的命名規則和一般變數相同 (2)「陣列大小」必須是一數字 宣告一個A[3]的陣列: int A[3]; //宣告一維陣列A,共有A[0]、A[1]、A[2]三個元素此時,主記憶體就會即時配置3個位置 宣告三個變數(A,B,C)為整數型態 int A, B, C; 德明科技大學資訊科技系
使用陣列的優缺點 • 優點 • 利用索引值(Index)可以快速的存取資料 • 搭配迴圈一次可以處理大批的資料 • 較容易表達資料處理的技巧 • 缺點 • 資料新增刪除比較麻煩 • 記憶體配置在宣告陣列時就固定,缺乏彈性 • 欲避免陣列的缺點,一般使用動態記憶體配置,即指標的方式建置陣列 • 運作較為複雜,在鏈結串列時介紹 德明科技大學資訊科技系
陣列儲存方式 p3-7 【舉例】宣告一個A[3]的陣列,並分別儲存10, 20, 30 int A[3]; A[0]=10; //指把10指定給A陣列中的第0項的資料中 A[1]=20; A[2]=30; 【變化】陣列比變數有彈性,使用時索引可以是各種變化 如果變數 x=1,則A[x] = 20; 也可以用 A[x*2]=30; 如果B[0]=1,則A[B[0]]=20; 德明科技大學資訊科技系
【舉例】 請依序輸入六位同學的成績到陣列中,並計算及輸出 總和 p3-7 未使用for迴圈演算法 德明科技大學資訊科技系
【舉例】 請依序輸入六位同學的成績到陣列中,並計算及輸出 總和 int A[6]; p3-8 使用for迴圈演算法 德明科技大學資訊科技系
使用陣列的注意事項 p3-9 • 不能夠一次讀取或指定整個陣列的資料 • 寫一個程式,利用A陣列來存放數字10 直覺想法:以下的方法是錯誤 int A[10]; A=10; 不能直接指定給陣列名稱 德明科技大學資訊科技系
使用陣列的注意事項 • 用來指定某一項資料的索引不能超過陣列的註標範圍 例如:int A[50]; // 宣告一個陣列A其索引是從0~49 A[-1]=100; //索引是 –1,超出陣列A的範圍 A[50]=100; //索引是 50,超出陣列A的範圍 德明科技大學資訊科技系
陣列的初值設定 p3-10 在宣告陣列的同時並指定初值,其方法只要等號(=)在後面接著大括號,將初值寫在括號內,初值間以逗號隔開即可。 【語法】資料型別 陣列名稱[ ] ={陣列初值串列}; 德明科技大學資訊科技系
二維陣列的觀念 p3-11 【語法】資料型態 陣列名稱[M][N]; 【說明】M代表列數,N代表行數 【例如】int Score[4][5]; //列索引表示範圍: 0~3 共有4列 //行索引表示範圍: 0~4 共有5行 德明科技大學資訊科技系
多維陣列的觀念 p3-14 【語法】資料型態 陣列名稱[L][M][N]; 【說明】L代表二維陣列個數: M代表列數, N代表行數 【例如】int Score[3][4][5]; //二維陣列的個數: 0~2 共有3個二維陣列 //列索引表示範圍: 0~3 共有4列 //行索引表示範圍: 0~4 共有5行 【說明】此例子中Score陣列共有三個索引,故Score陣列是一個三維陣列。宣告Score是由3個(0~2)二維陣列,每個二維陣列包含4列(0~3),5行(0~4)組合而成的整數三維陣列。並且共計有3×4×5=60元素。 德明科技大學資訊科技系
19 115 5 21 28 陣列在記憶體中的表示法 • 陣列 • 相同資料型態在記憶體內連續的空間 • 每個元素其實有自己的位址 • 宣告: int list[5]; 如果每個元素大小為 d 個bytes list[0] list[0] 的位址是 X list[1] list[1] 的位址是 X + 1 × d list[2] list[2] 的位址是 X + 2 × d : list[3] list[4] list[k] 的位址是 X + k × d 德明科技大學資訊科技系
一維陣列在記憶體中的表示法 p3-17 若陣列A有N個元素,其陣列的起始位址為Lo,並且索引值從0開始,d 為元素大小,則A[i]的起始位置為多少? 以C語言宣告方式:int A[N]; 令:Lo為起始位址 d為元素大小 則A[i]之位置計算 = Lo + i * d 德明科技大學資訊科技系
一維陣列在記憶體中的表示法 若陣列A的索引從L到U,其陣列的起始位址為Lo,d為元素大小,則A[i]的起始位置為多少? 宣告方式:A[L…U] 令:Lo為起始位址 d為元素大小 則A[i]之位置計算= Lo + (i-L) * d 德明科技大學資訊科技系
【舉例】假設每一個整數佔用2個byte,若A陣列的起始位址是100開始,則A[5]的起始位址為多少?【舉例】假設每一個整數佔用2個byte,若A陣列的起始位址是100開始,則A[5]的起始位址為多少? 令:Lo=100 d=2 則A[5]=100+5*2=100+10=110 【舉例】假設每一個整數佔用2個byte,若A[10]起始位址是200開始,則A[20]的位址為多少? 令:Lo=200 d=2 則A[20]=200+(20-10)*2=200+10*2=220 德明科技大學資訊科技系
有一整數陣列int A[60]; 則此陣列共佔多少位元組(設sizeof(int)=2)?若A[0]在記憶體中的位址為03C416,則元素A[20] 的位址為何?A陣列共佔 60 × 2 = 120 (bytes) A[20] 的位址 = A[0] 的位址 + 位移量= 03C416 + (20 – 0 ) × 2= 03C416 + 2816= 03EC16 A[39] 的位址 = A[0] 的位址 + 位移量= 03C416+ (39 – 0 ) × 2= 03C416+ 4E16= 041216 A[0] A[1] 位移量 A[2] ﹋ ﹋ ﹋ ﹋ A[20] ﹋ ﹋ ﹋ ﹋ A[59] 德明科技大學資訊科技系
練習 • 題目 • int A[1000],每個整數以2 bytes儲存資料。假設A[0]的地址是100116,請問A[i]的地址是? • float A[1000] ,每個實數以4 bytes儲存資料。假設A[100]的地址是101116,請問A[900]的地址是? • 在一維陣列的題目中,計算參數有 • 每個元素大小, ex: 2 or 4 • 起點位址, ex: A[0] • 目標元素, ex: A[i] or A[900] 德明科技大學資訊科技系
二維陣列在記憶體中的表示法 p3-19 宣告方式:A[0…M-1, 0…N-1] M代表列數(Row): 橫向;N代表行數(Column): 縱向,共M*N格 舉例:圖的儲存位置:A[1,4] △圖的儲存位置:A[2,1] 圖的儲存位置:A[M-1,N-2] • 將二維陣列儲存的邏輯位置轉換成實際在主記憶體的存儲方式 • 以列為主 • 以行為主 德明科技大學資訊科技系
以列為主 Row Major p3-20 • 以列為主的二維陣列要轉為一維陣列 • 將二維陣列「由上往下」一列一列讀入一維陣列 德明科技大學資訊科技系
以列為主 Row Major 令Lo為起始位址 d為元素大小 則A[i,j]的位置=Lo+[i*N+j]*d 德明科技大學資訊科技系
以行為主 Column Major p3-23 • 以行為主的二維陣列要轉為一維陣列 • 將二維陣列「由左往右」一行一行讀入一維陣列 德明科技大學資訊科技系
以行為主 Column Major 令Lo為起始位址 d為元素大小 則A[i,j]的位置=Lo+[j*M+i]*d 德明科技大學資訊科技系
二維陣列的四個題型 • p3-26 以下 德明科技大學資訊科技系
陣列的應用 • 需要多個相同型態的資料變數時,就是使用陣列的時機 • 多項式表示與計算 • 矩陣運算 • 矩陣表示 v • 矩陣轉置 v • 矩陣加法、減法、乘法 v • 稀疏矩陣 • 特殊矩陣(上三角、對角矩陣) 德明科技大學資訊科技系
矩陣 p3-34 • 數學上一個m x n的矩陣,包含m個列與n個行,正好由m x n的二維陣列所表示 • int A[2][3]; //可代表 2x3的矩陣 • 直接以兩層迴圈處理 • 數學上的矩陣有非常多的用途 • 在程式設計上大部分都以陣列為資料結構 德明科技大學資訊科技系
矩陣轉置 p3-35 • 一個矩陣Am × n,則矩陣B是A的轉置矩陣 • B矩陣的第i列第j行的元素等於A矩陣的第j列第i行的元素 • Bij=Aji 德明科技大學資訊科技系
矩陣轉置 演算法 德明科技大學資訊科技系
矩陣加法 p3-38 • 假設A,B都是(m × n)矩陣,則A與B可以相加並得到一個C矩陣(m × n • 在C矩陣上的第i列第j行的元素必定等於A矩陣的第i列第j行的元素加上B矩陣的第i列第j行的元素 • Cij= Aij+Bij 德明科技大學資訊科技系
矩陣加法 例如 演算法 德明科技大學資訊科技系
矩陣乘法 p3-42 • 假設A為(m × n)矩陣,而B為(n × p)矩陣,則A與B相乘得到C矩陣(m × p) • 在C矩陣上的第i列第j行的元素必定等於A矩陣的第i列乘上B矩陣的第j行 • 兩個向量的內積 德明科技大學資訊科技系
矩陣乘法 演算法 德明科技大學資訊科技系