創作內容

4 GP

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

作者:藍貓│2013-06-27 21:09:48│巴幣:8│人氣:268
陣列介紹
前面我們第一章講過,變數你可以把它看成”一個盒子”。
 
那你會想問,陣列是什麼呢?
 
陣列喔,其實講真的,概念很簡單,一般你宣告變數一次只能造一個盒子,陣列可以一次表示很多個變數盒子。
 
簡單來說,你可以將陣列看成"一群變數",而不是"一個變數",所以你也可以將陣列看作"一堆黏在一起的盒子"
 
 
陣列宣告
其實陣列的宣告和變數一樣,一樣是有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++;
      }
   }


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

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

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


基本練習例題
你遇到的任何問題都可以試著自己轉化練習,這裡就不提供陣列本身的練習題了,因為陣列有很多應用,但是要討論這些應用又太深入太艱澀了,所以我選擇跳過不談。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2061905
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

4喜歡★ertyk122 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:(程式語言)基礎理論-3... 後一篇:自創勇造1...

追蹤私訊切換新版閱覽

作品資料夾

小說連載 (0)
英雄聯盟小說(英雄聯盟系列) (19)
[外傳]昏黃歲月(英雄聯盟系列) (1)
阿宅與美女代打(英雄聯盟系列) (0)
[寫實小說]_糾心恥笑園 (0)
[寫實小說]_倒數末日 (0)
[寫實小說]_憂鬱天堂 (2)
[寫實小說]_網路殺人魔 (0)
[寫實小說]_錢魔 (0)
[神幻小說]_犬族的命運 (58)
[神幻小說]_捨不得你。妄想 (0)
國中生小說 (3)

漫畫連載 (0)
[搞笑四格]_場外舉人 (0)
[少年漫畫]_台北大地震 (0)
[少年漫畫]_就是愛運動 (0)
[少年漫畫]_餵愛一口香 (0)
[寫實漫畫]_白狼 (0)
[寫實漫畫]_天刑三二三 (0)
[寫實漫畫]_橫血英雄 (0)
[寫實漫畫]_恐龍妹 (0)
[神幻漫畫]_剩水童子 (0)
[神幻漫畫]_永遠的父女 (0)
[神幻漫畫]_勇者我家人 (0)
[其它]_音魂 (1)

劇本創作 (0)
[寫實劇本]_白狼 (1)
[寫實劇本]_天刑三二三 (0)
[神幻劇本]_繪魔 (0)
[神幻劇本]_魔曲 (0)

電腦理論 (6)
程式設計相關理論 (14)
高階程式語言理論 (6)
實作程式 (15)
程序之相關問題 (0)
硬體管理與計算機結構 (3)

創作理論 (3)
文學理論 (3)
文學實作要領 (0)
繪畫理論 (1)

生活日記 (241)
自我提醒 (5)

文創作品 (2)
散文與詩 (25)
故事大綱 (1)
繪圖 (57)
processing文創應用 (0)
勇造創作 (3)

數學領域相關證明 (0)

英雄聯盟豪洨文 (3)

辯論大會 (0)

未分類 (22)

coopdar1345我的GP超人
「總有一天,人們會再度跨越障礙,再絕望的時刻,都存在著希望,只要妳如此深信著。」——《遙遠的星球》看更多我要大聲說昨天21:30


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

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