close

這陣子在網路上很多人突然問說,怎麼求使用者輸入的五個數還是十個數裡面的最大值。這個問題怎麼看都覺得用陣列(Array)處理比較適當,不過原發文者又突然丟出了一句話:學校陣列還沒教。嗯,當然也是有其它的解決方案,只是這樣顯得比較麻煩,於是往往得到的答案是:請先去念陣列那章節!

今天主要為初學者銜接學校沒教的陣列問題,看完這篇到懂,估計約二十分鐘左右,如果你覺得你作業二十分鐘內可以自己搞定,那可以猶豫一下要不要繼續往下看。由於這裡所說的東西,目的只是銜接而已,所以這裡只說明一維陣列,至於其它的二維、三維陣列,有興趣可等老師教到的時候會有詳細說明,或是有興趣的話再行進修。

現在假設的問題是:使用者要輸入10個數字,最後要把這10個數字全部都顯示出來,至於計算總合、最小值、最大值、平均值,請再發揮自己的想像力加油!記住,引進門,修行在個人。 

1. 陣列之宣告

鑑於上述問題,當然可以假設10個變數,這十個變數可能是int a0, a1, a2, a3, …, a9; 總共十個,到時候要算加總的時候又變成 int sum=a0+a1+….+a9,這方法實在是太麻煩了,有比較簡單的方式嗎?有!就是用陣列的方式去處理,現在我題意是有10個變數,所以我宣告陣列是

int a[10];

這裡代表 a 宣告成有10個元素之整數陣列,而這10個元素以後要去讀取它的時候,都是用 a[0], a[1], a[2], …. , a[9],在此要特別注意,我元素個數是設成10個,但存取陣列的index (就是[ ] 裡面的那個數字)是從 0-9,如果index 不是在這範圍的其它數字,到時會造成違規存取。 

2.  陣列初值之設定

在我們宣告一般變數時,可以給予以初值,像是

int a0=0, a1=0, a2=0, a3;

如果一般的變數在沒設定初值就印出來看的話,你將發現那個變數的內容值你感覺很莫名奇妙,像是本例中的 a3 便是。而陣列也是一樣,一開始在宣告時,如果你沒給予其初值就直接印出所有陣列值,顯示出來的也是讓人錯鄂的數值 (像是 int a[10], printf(“%d %d”, a[0], a[1]); ) 。那陣列有沒有辦法給它初值呢?可以!主要有二種方式給予初值

int a[10] = {2,4,6}; //
int a[10] = {0}; // 十個元素全都設成0

上述的第一種方式相當於以下這行

a[0] = 2, a[1] = 4, a[2] = 6;

那其它 a[3] ~ a[9] 沒有設定的呢?如果你給的元素不夠的話,剩下來的元素就會被設成0。至於第二種方式,是直接把10個元素全都設成0

 

3.  使用者輸入10次紀錄於陣列中

知道陣列怎麼用之後,我們便可以利用 for-loop 方式存使用者輸入的數值。如果不使用陣列的話,輸入將會像是:

scanf(“%d %d %d…%d”, &a0, &a1, &a2, …, &a9);

這樣等於是要寫10次,很不方便,到時事後的計算也很麻煩,於是我們用一個跑十次的 for-loop 讓使用者輸入數值,並掌握以下原則:

1次輸入存入 a[0] -> scanf(“%d”, &a[0]);
2
次輸入存入 a[1] -> scanf(“%d”, &a[1]);
….
10次輸入存入 a[9] -> scanf(“%d”, &a[9]);

嗯,從上面看來,陣列a裡面的index是從0跑到9 (記住第一點說的,宣告元素個數只有10個的話,可以存取的就只有0-9而已) ,於是我們可以用for-loop 取得使用者輸入的陣列了..

for(int i=0; i<10; i++) scanf(“%d”, &a[i]);

這個loop 的展開動作,就和上述的一樣了。 

4.  印出所有陣列元素值(走訪陣列)

有了第三點的描述,相信聰明的你也知道該怎麼把之前使用者輸入的值都印出來。

for(int i=0; i<10; i++) printf(“%d “, a[i]);

 5. 求最大值、最小值

現在手邊有10筆使用者輸入的資料了,那要怎麼求出這十筆資料的最大、最小值呢?普遍的做法是陣列中的第0筆資料同時設成最大值MAX與最小值MIN,再來用for-loop 跑完陣列(這裡是跑0-9),在for-loop過程中,如果a[i]比目前的MAX還大的話,MAX就被a[i]取代;相同的,如果a[i]比目前的MIN還小的話,MIN就被a[i]取代,實做起來會像這樣:

int max=a[0], min=a[0];
for(int i=0; i<10; i++){
   if(a[i] > max) max = a[i]; // 找到比現有max
還大的就取代
   if(a[i]< min) min = a[i]; // 找到比現有 min
還小的就取代
}

跑完之後,min, max 就是這十筆資料的最小與最大值。

 

6.  陣列使用限制

記住一件事,陣列裡面的元素個數,並不能做浮動性的改變。也就是說,你不可以這麼做:

// 這個例子是錯的
int n1=0;
int n2=10;
scanf(“ %d “, &n);
int array[n]; // 錯誤,n1
會改變
int array2[n2]; // 錯誤,n2 會改變
 

但你卻可以這麼做

// 這個例子是可行的
#define N1  10
const int N2= 10
int array1[N1]; // 元素個數大多用 define
方式
int array2[N2]; // const 方式比較少用

 

如果你要裡面的元素個數是可以變動的話怎麼辦?這部份談論到動態陣列的部份,不在此探討,如果你有興趣的話,這裡有另一篇文章可做參考(使用指標建立一維動態陣列:http://edisonshih.pixnet.net/blog/post/27974938),不過如果沒有底的話,建議等上到指標(指標特輯14篇文章:http://edisonshih.pixnet.net/blog/post/28005680)之後再來探討。

 

謝謝收聽!!!

 

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(0) 人氣()