一、陣列是什麼
在討論陣列是什麼之前,我們先來看一個問題,假設我們要連續輸入 5 個人的成績,然後再從最後一個人的成績印回來,這個程式可以寫成:
#include <stdio.h>
void main()
{
int a1, a2, a3, a4, a5;
scanf("%d",&a1);
scanf("%d",&a2);
scanf("%d",&a3);
scanf("%d",&a4);
scanf("%d",&a5);
printf("%d\n",a5);
printf("%d\n",a4);
printf("%d\n",a3);
printf("%d\n",a2);
printf("%d\n",a1);
}
上面的程式,我們宣告了五個變數 a1、a2、a3、a4、a5 來記錄五個人的成績,程式要寫出來不難,但是如果我們將程式要改成輸入 100 個人的成績,以上面的寫法,要有 100 個變數,程式碼也會變得很長。這個程式其實重複的程式碼很多,前面我們學過可以用迴圈來簡短程式碼,但是上面的例子,又無法改成 ai 這樣的變數名稱,於是有人提出了陣列來解決這個問題。
陣列(Array)是一組相同型態的連續變數,它們使用同一個變數名稱,而另外用一個索引值來指定使用第幾個變數,在 C 語言中要宣告一個陣列,可以使用下面的語法:
變數型態 陣列名稱[元素個數];
例如:
int s[100];
即是宣告 s 是一個 int 的陣列,它有 100 個元素,分別是 s[0]、s[1]、s[2]、...、s[99],特別注意的是它的索引值是從 0 開始到 99,而非 1 到 100。在程式中,索引值除了直接使用數字外,也可以使用變數或運算式,例如:s[i+2]。另外,在宣告陣列的時候也可以和其他非陣列的變數一起宣告,例如:
int a[100], b[200], c, d;
接下來我們用陣列把上面的問題改寫:
#include <stdio.h>
void main()
{
int a[100], i;
for(i=0; i<100; i++)
scanf("%d",&a[i]);
for(i=99; i>=0; i--)
printf("%d\n",a[i]);
}
二、排序法
接下來,我們來討論如果將陣列裡面的資料從小排到大。一個最簡單的排序法叫做「選擇排序法(Selection Sort)」,它用的方法如下:
- 先拿陣列中第一個元素依序和後面的元素比較,如果第一個元素比後面的元素大,則將兩個變數對調。
- 反覆上面的步驟,直到最後一個元素為止,此時第一個元素即是整個陣列最小的元素。
- 再取出陣列中第二個元素,重複上面的步驟 1、2,完成後第二個元素將是陣列中第二小的元素。
- 反覆步驟 3 的動作,從第二個一直做到第 n-1 個,全部完成後,整個排序動作即完成。
我們把上面的方法寫成程式如下:
#include <stdio.h>
void main()
{
int a[10], b, i, j;
for(i=0; i<10; i++)
scanf("%d",&a[i]);
for(i=0; i<9; i++)
for(j=i+1; j<10; j++)
if(a[i]>a[j]) {
b=a[i];
a[i]=a[j];
a[j]=b;
}
for(i=0; i<10; i++)
printf("%d\n",a[i]);
}
上面黃色那段程式碼即是選擇排序法的上面這段:
b=a[i];
a[i]=a[j];
a[j]=b;
即是將兩個變數的值對調,我們先用一個變數 b 保留 a[i] 的值,再將 a[j] 的值給 a[i],最後再把 b 的值(也就是 a[i] 原先的值)給 a[j],這個技巧很常用,各位同學要熟記。
三、二維陣列及多維陣列:
我們也可以在宣告陣列的時候,使用兩層的索引值,例如:
int s[100][100];
即宣告陣列 s 有 100x100 個元素,分別是 s[0][0]、s[0][1]、...、s[0][99]、s[1][0]、s[1][1]、...、s[99][98]、s[99][99] 等 10000 個元素。這種陣列我們稱為二維陣列。我們可以把二維陣列想成一個表格,這樣會比較容易理解。
同樣的,有二維陣列,當然也有三維陣列、四維陣列,我們稱三維以上的陣列為多維陣列。例如:
int x[10][10][10];