Download presentation
Presentation is loading. Please wait.
1
第六章 陣列
2
一維陣列 陣列(array) 是由一群相同資料型態的變數所組成的集合 C 語言陣列的第一個元素之註標是從 0 開始
例:50個整數變數,其一維陣列表示法如下: int i[50]; i[0] i[1] i[2] …… i[49]
3
一維陣列位址 陣列之特性 若陣列中有初始值,則索引值將可省略;若陣列中無初始值,則索引值不可省略 一般陣列所配置的記憶體是連續的
陣列名稱表示此陣列第一個元素的位址 i i+1 i+2 i+9 i+49 &i[0] &i[1] &i[2] &i[9] &i[49] i[0] i[1] i[2] … i[9] i[49] address value
4
一維陣列位址 計算某一陣列元素之公式 陣列第一個元素的位址 + (此元素之註標值) * sizeof(資料型態)
1010 1014 1018 1206 i[0] i[1] i[2] …… i[49]
5
一維陣列程式範例(一) /* File name: ex6-1b.c */ #include <stdio.h>
#include <stdlib.h> #define MAX 50 int main() { int num[MAX], index = 0, i; do { printf(“Enter a number (enter 0 to exit):”); scanf(“%d”, &num[index++]); } while(num[index-1] != 0 && index < MAX); for (i = 0; i < index; i++) printf(“%d “, num[i]); }
6
一維陣列程式範例(二) /* File name: ex6-1c.c */ #include <stdio.h>
#include <stdlib.h> int main() { int i[] = {100, 200, 300, 400, 500, 600}; int j; for(j = 0; j < 6; j++) printf(“i + %d = %x, &i[%d] = %x, i[%d] = %d\n”, j, i + j, j, &i[j], j, i[j]); }
7
一維陣列的應用 排序 搜尋 泡沫排序(bubble sort) 選擇排序(selection sort)
循序搜尋(sequential search) 二元搜尋(binary search)
8
泡沫排序 將相鄰的兩個資料相比,假使前一個比後一個大時,則互相對調
假如有 5 個紀錄,其鍵值為 18, 2, 20, 34, 12,利用選擇排序,做法如下: 第一次掃描 18 2 20 34 12 結果 第二次掃描 2 18 20 12 結果 第三次掃描 2 18 12 結果 第四次掃描 2 12 結果
9
泡沫排序程式範例 void bubble_sort(int data[], int n) {
int i, j, k, temp, flag; for(i = 0; i < n – 1; i++) { /* 掃描次數 */ flag = 0; for(j = 0; j < n – i - 1; j++) { /* 做比較動作 */ if(data[j] < data[j + 1]) { flag = 1; temp = data[j]; data[j] = data[j + 1]; data[j + 1] = temp; } printf(“%d: pass: ”, I + 1); for(k = 0; k < n; k++) printf(“%d ”, data[k]); printf(“\n”); if(flag != 1) break;
10
選擇排序 在所有的資料中挑選一個最小的放置在第一個位置(因為由小到大排序),再從第二個開始挑選一個最小的放置於第二個位置,…,一直下去
假如有 5 個紀錄,其鍵值為 18, 2, 20, 34, 12,利用選擇排序,做法如下: 18 2 20 34 12 Step 1: 最小為 2 Step 2: 從 2 位置開始挑最小為 12 Step 3: 從 3 位置開始挑最小為 18 Step 4: 從 4 位置開始挑最小為 20
11
選擇排序程式範例 void select_sort(int data[ ], int n) {
int i, j, k, min, temp; for(i = 0; i < n – 1; i++) { min = i ; for(j = i +1; j < n; j++) if(data[j] < data[min]) min = j; temp = data[min]; data[min] = data[i]; data[i] = temp; printf(“Access: ”); for(k = 0; k < n; k++ printf(“%d ”, data[k]); printf(“\n”); }
12
循序搜尋 循序搜尋 假如已存在數列 21, 35, 25, 9, 18, 36 為從頭開始尋找資料,直到找到為止
此類搜尋不適合資料量很大的時候 假如已存在數列 21, 35, 25, 9, 18, 36 搜尋 25,需比較 3 次 搜尋 21,需比較 1 次 搜尋 36,需比較 6 次
13
二元搜尋 二元搜尋只適用於已排序的資料 中間項 M 等於最左邊的項目 (l) 加最右邊項目 (r) 在除以 2
r = M – 1 l 不變 假使欲搜尋的鍵值大於陣列的中間項 (M) 的鍵值 l = M + 1 r 不變 範例ex6-2d.c
14
二維陣列 二維陣列 二維陣列表示法: 表示法與一維陣列類似,只要兩個中括號即可 若有設定初始值時,則可省略列的索引值,但行的索引值不可省略
int j[2][3]; 行 列 j[0][0] j[0][1] j[0][2] j[1][0] j[1][1] j[1][2]
15
二維陣列位址 二維陣列的記憶體空間分配,是將一列中的各行皆分配位址完畢,在分配下一列 計算某一陣列元素之公式
陣列初始位址 + (此元素的列索引值) * (陣列行數) * sizeof (資料型態) + (此元素的行索引值) * sizeof(資料型態) j j[0][0] j[0][1] j[0][2] j + 1 j[1][0] j[1][1] j[1][2]
16
二維陣列程式範例(一) /* File name: ex6-3a.c */ #include <stdio.h>
#include <stdlib.h> int main() { int num[2][3] = {0, 1, 2, 3, 4, 5}; int i, j; for(i = 0; i < 2; i++) for(j = 0; j < 3; j++) printf(“num[%d][%d] = %d\n”, i, j, num[i][j]); }
17
二維陣列程式範例(二) /* File name: ex6-3d.c */ #include <stdio.h>
#include <stdlib.h> int main() { int j[2][3] = {100, 200, 300, 400, 500, 600}; printf(“j[0][0] = %d\n”, j[0][0]); printf(“&j[0][0] = %x\n”, &j[0][0]); printf(“j = %x\n”, j); printf(“j[0] = %x\n”, j[0]); }
18
二維陣列的應用 二維陣列的應用 數學中的x, y座標軸 每天24小時的氣溫紀錄 撲克牌 棋盤 範例ex6-4a.c
19
多維陣列 多維陣列 多維陣列的表示法如同一維、二維一樣 有幾個[ ]即代表它是多少維,如三個則是三維,四個即是四維,以此類推 如:
int k[2][3][4]; 表示k為一個整數型態之三維陣列
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.