Download presentation
Presentation is loading. Please wait.
1
陣列 東海大學物理系‧資訊教育 施奇廷
2
使用陣列的時機: 在科學運算中,我們經常要處理大量性質相同的資料,如果逐一宣告處理會,程式的編寫與維護都很麻煩。利用陣列變數處理這些資料,將會方便許多。 程式中有大量性質相同的資料,若逐一命名、宣告資料型態十分不便。 這些資料值在程式中被使用不止一次 經常需要使用多個這些資料
3
程式中要用到 10 個學號, 就要宣告 10 個變數來儲存:
C 語言提供了一種特殊的資料結構:陣列 (Array)。宣告一個陣列, 可以取代宣告多個變數, 讓程式更容易撰寫和閱讀。像上述 10 個學號的例子, 改用陣列的語法來撰寫會方便許多, 如下:
4
陣列的意義 陣列可說是一組同型別與同性質變數的集合, 一個陣列等於一串連續的變數 當我們宣告一個陣列時, 就等於宣告了多個變數
我們可以根據所需變數的多寡, 自由的設定陣列的大小 陣列也可以如變數一樣, 當成引數在函式間的傳遞, 是一種非常方便的資料儲存空間。
5
一維陣列的宣告 格式: 範例: 宣告方式與一般變數類似,只是要宣告這個陣列中有幾個元素
6
陣列的 Index 在上面的例子中,ID[n] 表示 ID 這個陣列有十個元素,其編號分別是 ID[0], ID[1], ID[2]……ID[n-1] 陣列內的每個元素可視為同一型別的 n 個變數,不同資料型別的變數無法塞進同一個陣列內
7
範例
8
陣列初值給定 int x[10]; → 沒有給定初值
int x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; → 表示 x[0]=1, x[1]=2……x[9]=10 int x[10] = {0}; → 表示 x[0] = x[1] = x[2] = …… = x[10]=0 int x[10] = {0,1,2,3,4,5,6,7,8,9,10}; → 會出現錯誤,因為 x 只有十個元素,但是初值集合 { } 內有十一個數
9
矩陣大小宣告較好的方式 把矩陣大小用「define」指令定義,程式本體內全部此取代,若要改變其值時,只要在 define 指令中修改即可
10
練習 將上一章(函式)的範例(輸入八個整數後找出其最大值)改寫,用陣列來儲存輸入的變數。找最大值的方法有二:
用原來的方法:自訂函數compare兩兩比出較大者 將biggest這個變數初值設為很小,保證不會比輸入數字中最大者還大。然後用一迴圈,將所有陣列中的元素(即輸入之值)跟biggest相比,只碰到比biggest大的元素,就將biggest的值更新為該元素的值
11
範例:陣列元素排序 所謂排序, 就是將一個隨意排列的數列, 經過一連串『比較大小』和『調換次序』的處理後, 使數列中的每個數字都依由小到大的升冪或者由大到小的降冪方式排列。 一維陣列元素排序法, 稱為汽泡排序法 (Bubble Sort)。在迴圈配合條件式執行過程, 較大的數值位置會漸漸的往前面移動, 感覺就好像一個氣泡由水底浮到水面, 因為壓力減小, 氣泡的體積會慢慢變大, 這就是其名稱的由來。
12
陣列內所有數值的排序 以下程式是由一個包含 5 個元素的字元陣列, 利用氣泡排序法, 將 5 個字母由大到小排列, 程式如下:
13
將陣列中的資料降冪排序 從螢幕輸出
14
將陣列中的資料降冪排序 從螢幕輸出
15
將陣列中的資料降冪排序 從螢幕輸出
16
執行結果
17
程式執行說明 氣泡排序法會先取第 1 個陣列元素, 與所有陣列元素比較後, 如果第 1 個陣列元素比第 2 個小, 則交換位置, 反之則不換。 i=0 時, 字元大小的比較, 就是在比較其 ASCII 碼, s、c、i、o、n 的 ASCII 碼分別為 115、99、105、111、110:
18
程式執行說明
19
程式執行說明 接著 i=1 時, 取第 2 個陣列元素與其後的所有元素比較:
20
程式執行說明 以此類推, 排序直到完成為止:
21
練習:資料的平均值以及標準差 若有一組資料 {x1, x2, ……, xN},其平均值 標準差為:
試寫作一程式,由鍵盤讀入 5 個數字,計算其平均值與標準差
22
練習:記票 寫作一程式,要求輸入 0~9 的數字,計算每個數字出現的次數以及出現率,若輸入 0~9 以外的數字或字元則結束程式,並輸出統計結果,以及計算各數字出現的比率
23
二維陣列 二維陣列的宣告語法如下: 例如: 注意:與一維陣列相同,index 是由 0 開始計算,以上例而言,為 a[0~4][0~5]
資料型別 陣列名稱[列數][行數] 例如: int a[5][6]; ← 宣告一陣列 a,一共有五列、六行,共三十個元素,皆為整數 注意:與一維陣列相同,index 是由 0 開始計算,以上例而言,為 a[0~4][0~5]
24
二維陣列 宣告完成後, 會產生一個如下圖的空間:
25
二維陣列之初值宣告方式 宣告含有初始值的二維陣列時, 我們需以先行後列的順序, 填入初始值。 假設有一個二維陣列的初始值如下:
int a[3][2] = {1,2,3,4,5,6}; 表示 a[0][0]=1, a[0][1]=2, a[1][0]=3, a[1][1]=4, a[2][0]=5, a[2][1]=6 宣告亦可寫為: int a[3][2]={{1,2},{3,4},{5,6}};
26
以初始值個數決定二維陣列容量 宣告二維陣列時也可用空的中括號, 讓初始值決定其容量。但是, 只有列數可使用空的中括號。因為, 要先知道每一列的長度, 編譯器才知何時該將資料填到下一列:
27
以初始值個數決定二維陣列容量 如果我們未註明行數, 只註明列數, 則會產生以下的情形: 當然, 列數與行數都未註明, 一定也是錯誤的。
28
陣列在函式間的傳遞 陣列也可當成引數可以在函式間傳遞。但由於陣列變數和一般變數不同, 所以要用陣列當引數的函式, 其原型宣告、函式定義的方法, 都與傳遞一般數值的引數略有不同。 一維陣列的傳遞 只傳遞一個陣列元素 傳遞整個陣列到函式中 傳遞二維陣列
29
一維陣列的傳遞 利用原型宣告與函式定義中, 不同的引數宣告方式。我們可以選擇一次只傳一個陣列元素, 或者一次將整個陣列傳遞到函式中。
只傳遞一個陣列元素 傳遞整個陣列到函式中
30
只傳遞一個陣列元素 只傳遞一個陣列元素與傳遞單一數值的方法相同。唯一不同的是, 在呼叫函式時, 我們必須註明想要傳遞的是哪一個陣列元素。比如說, 有一陣列儲存了一個學生 5 次數學模擬考的成績, 如下:
31
只傳遞一個陣列元素 要將其中一次的成績傳遞給函式, 只需指明要傳遞的元素編號, 用它來呼叫函式即可: 在上例中,x 的值即為√2。
double a[2]={1.0,2.0}; double x=sqrt(a[2]);
32
傳遞整個陣列到函式中 將整個陣列傳遞到函式中, 函式宣告、呼叫、定義的語法如下:
33
傳遞整個陣列到函式中 在原型宣告與定義函式處, 只需加上一個中括號 ( [ ] ) 即可:
其餘均與變數在函式間的傳遞相同, 我們將整個陣列的資料傳到函式判斷出最大值後, 再傳回 main ( ) 中輸出, 程式如下:
34
求一數列的最大值
35
求一數列的最大值
36
執行結果 注意以上的傳值方式為 call by address,亦即是主函式將陣列的記憶體位址傳到被呼叫的函式中,因此若在函式中修改了陣列中的值,主函式內的陣列值也會因此而改變
37
傳遞二維陣列 要傳遞二維陣列時, 函式原型宣告處的引數要加上兩個中括號。像傳遞一維陣列一樣, 讓第 1 個中括號為空白, 但是之後的陣列容量一定要填上, 否則會出現 "Size of the type 'int [ ]' is unknown or zero" 的編譯錯誤, 表示無法判斷陣列的大小。 #define SIZE 10 函式型別 函式名(陣列型別[][SIZE]); int main(void) {……} 函式型別 函式名(陣列型別 陣列名稱[][SIZE])
38
作業 寫作一程式,可以做矩陣相乘之計算
Similar presentations