陣列

2012/10/26 謝碧景(c)編製更新

 學習目標

摘要

一、一維數值陣列

(一)陣列 (Array)

(二)宣告格式

 資料型別 陣列名稱[n]={值1,...,值n}

  n:陣列大小,即元素個數。

  索引:為 0 至 n-1

*註:陣列名稱是指向陣列之記憶體起始位址

 //a[0]=90 , a[1]=80 , a[2]=87

(三)陣列初始化

 例:以迴圈指定陣列元素的初始值皆為0。

 for(i=0;i<5;i++)

  a[i]={0}; 

 //相同於  int a[5]={ };

 //相同於  int a[5]={0,0,0,0,0};

 例:給予全部元素初始值。

 int a[3]={90,80,87};

 例:指定值給陣列元素。

 int a[3]; 

 a[0]=90; a[1]=80; a[2]=87;

(四)一維陣列與重複結構

(五)一維陣列空間大小:

 ◆範例1:計算成績:以一維陣列,存放班上五位同學之成績,並合計五個成績之總分及平均。

二、陣列的應用:排序 (Sort)

(一)氣泡排序 (Bubble Sort)

 ◆範例2:輸入n個數值,並將該數列由小至大排序後顯示。

(二)選擇排序法(Selection Sort)

(三) sort 排序函數

*註:

三、陣列的應用:搜尋 (Search)

(一)循序搜尋法(Sequential search)

 ◆範例3:在10個數值資料中尋找一數,並顯示其在資料中第幾個找到,若無則顯示“查無此數"。【參閱:流程圖

*註:

(二)二分搜尋法 (Binary Search)

 ◆範例4:園遊會中獎者姓名查詢。【參閱:流程圖

1.先將num陣列由小至大排序

2.二分搜尋法

執行結果

3.延伸思考:先依num陣列由小至大排序好後(注意:name陣列也需一起交換),再以二分搜尋法比對中獎編號。

四、 一維字元陣列

(一)字元陣列

 char 字串名稱[長度]; // 例 char str[8];  宣告一個長度為8個字元的字串 str

例如:char str[]={'D','e','v','-','C','+','+'}; 

亦可利用『字串常數』來初始化。

2.字串初始化:

 char 字串名稱[長度]={'字元1','字元2','字元3','字元4','字元5',…};

 char 字串名稱[長度]="字串常數";   

  char str[8]="Dev-C++";             //以字串常數初始化,系統會自動加入'\0' 字元於陣列結尾 

或 char str[]="Dev-C++";               //省略陣列長度,則長度由系統自動分配

◆ 範例5:輸入一串字元(<10),並輸出每個陣列元素之值。

*註:cin 指令在接受使用者輸入資料後按下【Enter鍵】時,會自動以空白(Space)鍵Tab鍵作為資料的結束字元,故輸入之資料不可含空白(Space)鍵或Tab鍵,否則空白(Space)鍵或Tab鍵之後的資料會被移除。若輸入資料需包含空白,則可使用gets函式。

(二) gets、puts 函式

 gets(字元陣列);

 puts(字元陣列);

 gets() 函式可取得字串資料(含空白字元),其參數必須是字元陣列

 puts() 函式可顯示字元陣列,但只能顯示字串資料,顯示後會自動換行

 ◆範例6:以 gets() 及 puts() 函式,存取字元陣列。

執行結果

五、 二維陣列

(一)宣告格式

 資料型別 陣列名稱[列索引1][行索引2]

     // 元素個數 = 列(左方) x 行(上方)

 例 int sc[300][10];

  // 宣告陣列 sc 儲存 300*10=3000個元素

(二)對應關係:

1.如下表:左方為列上方為行,即 sc[列][行],一列接一列存放至記憶體中,sc[0][0]…sc[0][9]→sc[1][0]…sc[1][9]…。

2.初始值設定:例如:2x3 的二維陣列,初始值設定如下:

 int sc[2][3]={{80,83,73},{66,77,88}};

→對應關係如表:元素個數為6個(2x3=6)

3.二維陣列初始化,可省略列或行的大小,但不可同時省略列及行,因編譯器會無法確認陣列的形式。

例如:陣列元素6個,可能為1x6、6x1、2x3、3x2等。

int sc[2][]={80,83,73,66,77,88};

int sc[][3]={80,83,73,66,77,88};

(三)陣列之元素個數為各索引之乘積:

  元素個數 = 列索引 x 行索引

(四)二維陣列與重複結構的應用

 ◆範例7:輸入兩位學生各三科成績後,顯示每位學生之總分及平均。

*註:外迴圈控制列索引,內迴圈控制行索引。

六、指標

(一)指標變數宣告:

 資料型態 *指標變數;

(二)格式:

 資料型別 變數名稱=值;

 資料型別 *指標變數=&變數名稱;

int n=10; 

 int *p=&n; //宣告指標變數儲存變數 n 的位址

cout<<"p="<<p<<endl; //p=0x28ff44,指標 p 指向變數 n 的位址

cout<<"*p="<<*p<<endl; //顯示*p=10

*註:

(三)一維陣列與指標:

1.一維陣列與指標存取陣列元素:

 存取陣列元素:

 陣列名稱[索引];

 指標存取

*(陣列名稱+索引);

 int array[3]={1,2,3};

 cout<<array[0]<<"\t"<<*array<<endl;    //顯示 1   1

 cout<<array[1]<<"\t"<<*(array+1)<<"\n";    // 2   2

 cout<<array[2]<<"\t"<<*(array+2)<<endl;    // 3   3

2.一維陣列與指標存取陣列元素位址:

 存取陣列元素位址:

 &陣列名稱[索引];

 指標存取位址

 陣列名稱+索引;

 int array={1,2,3};

 cout<<&array[0]<<"\t"<<array<<endl;    //0x28ff30  0x28ff30

 cout<<&array[1]<<"\t"<<array+1<<"\n";  //0x28ff34  0x28ff34

 cout<<&array[2]<<"\t"<<array+2<<"\n";  //0x28ff38  0x28ff38

 ◆範例8:dim_ex.cpp

 ◆範例9:輸入一字串,並請倒著輸出此字串。

*註:cin 指令在接受使用者輸入資料後按下【Enter鍵】時,會自動以空白(Space)鍵Tab鍵作為資料的結束字元,故輸入之資料不可含空白(Space)鍵或Tab鍵,否則空白(Space)鍵或Tab鍵之後的資料會被移除。若輸入資料需包含空白,則可使用gets函式,如下範例。

七、補充

(一)貪婪演算法(Greedy Algorithm)

範例10:銀行提款以最少紙鈔、硬幣組成此現金,輸入n元,請以最少的紙鈔、硬幣兌換。

【提示:常用的紙鈔有2000、1000、500、100,硬幣有50、10、5、1元等,可指定給陣列[0]-陣列[7],兌換參閱:if 題11

執行結果

* 延伸題:Scarecrow。【想法:由左往右看田地,一發現有好地沒被保護到,就放一個稻草人在此好地的右邊一格,該稻草人除了保護此地,還有機會保護到右邊一格和右邊兩格的好地。摘自:Lucky貓

 §實作練習

 ◆數值陣列

 題1:一維陣列,輸入一串數字(以空白鍵隔開,至多26個,0為結束),請由小至大排列,並求出算數平均數。

題2:輸入一個十進位整數,請轉換為二進位輸出。【參閱:十進位轉二,八,十六進位,摘自 YouTube】

 題3:求費氏數列(Fibonacci)﹦0,1,1,2,3,5,8,13,… 即 f[n]=f[n-1]+f[n-2] 且 n>2,請列出Fibonacci數列的前10項。【提示:費氏數列-維基百科

 題4:二維陣列:成績計算

輸入三位學生各三科成績後顯示每位學生之總分及平均成績。

 題5:二維陣列:顯示轉置矩陣。

 題6:以亂數模擬擲骰子連續n次,請統計各點數出現的次數。【參閱:亂數函數

 ◆字元陣列

 題1:輸入一串字元(<50),將大寫字母轉成小寫字母,小寫字母轉成大寫字母,非字母的字元用減號代替 。【參閱 ASCII符號表 提示:ASCII 碼值→A:65、B:66、…Z:90、、a:97、b:98、…z:122、】

 題2:輸入10個字元,輸出共有多少個A,B,C,…Z。(大小寫視為相同) 例:輸入ADAaEVSzaZ    輸出 A:4, D:1, E:1, S:1, V:1, Z:2【提示:方法二→將字母轉為大寫 toupper() 函數定義在 #include <ctype.h>  標頭檔】

 題3:輸入三個句子計算總共輸入了多少個字元(包含空白字元)。【提示:參閱 gets(字元陣列)