陣列

一、陣列是什麼

在討論陣列是什麼之前,我們先來看一個問題,假設我們要連續輸入 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. 再取出陣列中第二個元素,重複上面的步驟 1、2,完成後第二個元素將是陣列中第二小的元素。
  4. 反覆步驟 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];

 

上一頁

首頁

下一頁