小屋創作

日誌2013-06-27 21:09

(程式語言)基礎理論-4

作者:藍貓

陣列介紹
前面我們第一章講過,變數你可以把它看成”一個盒子”。
 
那你會想問,陣列是什麼呢?
 
陣列喔,其實講真的,概念很簡單,一般你宣告變數一次只能造一個盒子,陣列可以一次表示很多個變數盒子。
 
簡單來說,你可以將陣列看成"一群變數",而不是"一個變數",所以你也可以將陣列看作"一堆黏在一起的盒子"
 
 
陣列宣告
其實陣列的宣告和變數一樣,一樣是有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個人,要把全班成績結果儲存起來的時後,你不可能一個一個宣告,假設有abc.......你宣告不完,你能用的英文字算一算,要寫一長串才能宣告完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++;
      }
   }


後序
陣列這種概念簡單的東西,難不是難在理解,而是難在使用,因為陣列的使用常常是一連串的重複動作,不管陣列怎麼玩,都跟迴圈很難擺脫關係。

基本上,學完這一章,所有簡單的程式,幾乎都能夠自己動手寫出來了,至於更複雜的程式理論,我會在兩年後的今天再和大家探討,到時後寫出來的東西就不會那麼囉嗦了,我相信大家基礎的東西都懂了,所以後續的篇章廢話就會少一點。

簡言之,我後續講的都是進階的程式理論和應用,不會再執著於簡單的應用了。


基本練習例題
你遇到的任何問題都可以試著自己轉化練習,這裡就不提供陣列本身的練習題了,因為陣列有很多應用,但是要討論這些應用又太深入太艱澀了,所以我選擇跳過不談。

4

0

LINE 分享

相關創作

繪圖菜鳥學習繪圖仿畫練習 100 張之第 11 張「2024 年 5 月 29 日」

【OPTCG 】紅紫「羅」香多拉牌組(08環境)

【yotoo】240531

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】