陣列介紹
前面我們第一章講過,變數你可以把它看成”一個盒子”。
那你會想問,陣列是什麼呢?
陣列喔,其實講真的,概念很簡單,一般你宣告變數一次只能造一個盒子,陣列可以一次表示很多個變數盒子。
簡單來說,你可以將陣列看成"一群變數",而不是"一個變數",所以你也可以將陣列看作"一堆黏在一起的盒子"
陣列宣告
其實陣列的宣告和變數一樣,一樣是有int.float,這些都不變,只是,這個對象變成一整個陣列。
int a[3]; /* int為整數資料型態 */
在這裡,我宣告a[3]等於一次宣告3個變數盒子,而且這3個盒子是有編號的,意思是說你想使用某個盒子,只要呼叫盒子的編號就好了,在c語言裡,盒子的編號是從0開始,不同的程式語言會有不同的編號方式。
如果還是看不懂,底下有示意圖,不難理解。
所以若要宣告陣列裡變數的初值,我們可以這樣……
Int a[3];
a[0]=1; /* 宣告編號0的初值 */
a[1]=2;
a[2]=3;
這個時後,問題來了,我們可不可以不要宣告整個陣列都是擺整數資料型態?
這個答案是否定的,宣告陣列固然可以一次宣告一整群變數,固然有它好用的地方,但是陣列並不是沒有限制的,整個陣列裡所有的變數都必需是同一個資料類型,所以在陣列裡,你不可能又放單精確浮點數,又放整數。
等一下,你會說,那我們為什麼需要陣列,既然陣列的限制那麼多,那我們直接用一般的變數宣告方式各別宣告就好了啊,幹嘛那麼麻煩?
原因是因為我們需要儲存的資料數量可能上百,上千筆,你想直接用傳統方式一個一個宣告還是用陣列?這種情況你就想,光是變數名稱你就沒辦法用26個字母表示完了,更不用說要記得每個變數的意義,那會搞死你。
告訴我,假設我宣告a[1000],你要怎麼用傳統的變數宣告來做到?
不舉太誇張的例子,全班38個人就夠你受了……
假設一班有38個人,要把全班成績結果儲存起來的時後,你不可能一個一個宣告,假設有a,b,c,.......你宣告不完,你能用的英文字算一算,要寫一長串才能宣告完38個盒子,38個人的成績,你光是寫這一段就沒完沒了了XD,還能寫程式嗎?XD
至於在什麼情況下我們可以使用陣列呢?
當我們必需處理為數眾多的資料,並且重覆對資料進行相同的運算或配置動作,那麼我們就必需用陣列去處理。
陣列的使用
前面講到你要儲存全班38個人的成績,這裡你只要這樣宣告就好……
int a[38];
這個陣列有編號0~37,總共38個變數盒子,但是這裡會有個麻煩,我陣列宣告是很輕鬆,但是當我開始使用陣列以後,立刻就頭大了……
我們要開始在陣列裡輸入38個人的成績了……
scanf(a[0]);
scanf(a[1]);
.
.
.
scanf(a[37]);
同樣的動作寫38次,這樣可以解決,但是如果今天陣列是a[1000]的話,那就太累又太長了......
既然提到,如果陣列1000會很麻煩,所以我們應該怎麼解決這個麻煩?
先別氣的跳腳摔鍵盤……
因為我要重覆38次的輸入動作,所以我可以用迴圈做,不必寫38次相同的動作。
沒用迴圈
int a[38];
scanf(a[0]);
scanf(a[1]);
scanf(a[2]);
scanf(a[3]);.
scanf(a[4]);
scanf(a[5]);
.
.
.
scanf(a[33]);
scanf(a[34]);
scanf(a[35]);
scanf(a[36]);
scanf(a[37]);
沒用迴圈
使用迴圈
int a[38];
int i;
for(i=0;i<=37;i++)
{
scanf(a[i]);
}
使用迴圈
這個時後,for迴圈就非常好用了,你看上下兩個範例程式,上下同樣是輸入38個人的成績,上面卻得很麻煩的重複寫38個動作。
所以陣列是必需搭配迴圈使用的,因為有迴圈才能把重複的動作用一個迴圈來代替,不用把重複的動作複製38次,所以原則上陣列是非常仰賴迴圈的。
其實陣列的觀念很簡單,就是一次宣告一整群的變數盒子,但你們知道為什麼陣列不能先教嗎?因為就算知道陣列是什麼概念的東西,但是不會使用陣列,還是沒用的......
這就是為什麼學陣列之前一定要先會用迴圈,複雜的迴圈邏輯都能搞懂了,應用在陣列上當然是更輕鬆、更簡單、更無負擔囉。
你會說我幹嘛儲存38個人的成績啊,那我們就要問,你想解決哪一類的問題?
拿全班38個人的成績簡單舉個例子……
全班平均成績你不需要動用陣列就可以算了,但是全班有多少人低於平均,這個除非你用陣列把每個人結果儲存起來,否則沒辦法求出來,以下用兩個範例程式便能說明該類問題一定得使用陣列解決。
int sum=1;
float avg;
int i;
for( i=1;i<=38;i++ )
{
scanf(n); /* 輸入每個人的成績 */
sum = sum + n;
}
float avg = sum/38;
/*平均算出來了,可是......接下來怎麼判定有幾個人成績低於平均?? */
像這類問題,你總不可能用1個變數就解決吧,所以這類判定問題通常一定得用陣列做。
以下是使用陣列的程式版本,從下例可以看出,只要使用陣列來儲存所有人的成績資訊,該類問題便能迎刃而解……
int a[38];
int sum=0;
int i;
for(i=0;i<=37;i++)
{
scanf(a[i]);
sum= sum + a[i];
}
float avg = sum/38
/* 平均算出來了,接下來判定有幾個人的成績低於平均 */
int p = 0; /* 宣告一個變數代表小於平均的總人數 */
for(i=0;i<=37;i++)
{
if(a[i]<avg) /* 判斷成績是否低於平均,是的話,p值加1 */
{
p++;
}
}
後序
陣列這種概念簡單的東西,難不是難在理解,而是難在使用,因為陣列的使用常常是一連串的重複動作,不管陣列怎麼玩,都跟迴圈很難擺脫關係。
基本上,學完這一章,所有簡單的程式,幾乎都能夠自己動手寫出來了,至於更複雜的程式理論,我會在兩年後的今天再和大家探討,到時後寫出來的東西就不會那麼囉嗦了,我相信大家基礎的東西都懂了,所以後續的篇章廢話就會少一點。
簡言之,我後續講的都是進階的程式理論和應用,不會再執著於簡單的應用了。
基本練習例題
你遇到的任何問題都可以試著自己轉化練習,這裡就不提供陣列本身的練習題了,因為陣列有很多應用,但是要討論這些應用又太深入太艱澀了,所以我選擇跳過不談。