Introduction to the C Programming Language 陣列 (Array)
陣列 可存放相同資料型態的資料,陣列與變數一樣,也需要經過宣告才能使用。 Compiler給陣列的記憶體是一個連續的區塊。 一維陣列宣告格式: 資料型態 陣列名稱 [元素個數]; int score[3]; /*宣告整數陣列score,可存放3個元素*/ 宣告完陣列後,如果要使用陣列的元素,就可以利用陣列的”索引值”來操作。 陣列就好比宿舍的房間,索引值就是房間的編號,只要根據房間編號(索引值) ,就能找到房客(陣列的元素)。 []為陣列修飾符號,每一組方括號表示一維(dimension). 在C/C++語言中,第一個元素的索引值一定是0. score[0] score[1] score[2] 陣列共有3個元素,起始索引值為0.
一維陣列(1D Array) 宣告格式 : 資料型態 陣列名稱[陣列大小]; 例如: int score[5]; score[1]=23; 資料型態 陣列名稱[陣列大小]; 例如: int score[5]; score[1]=23; m score[0] m+4 score[1] m+8 score[2] m+12 score[3] m+16 score[4] 記憶體位址 記憶體 陣列名稱 陣列第一個元素之位址 23 註一: 長度為無號整數(1~65535) 註二: m 代表第一個元素的位址. 註三: 因為是整數,所以每個元素佔2個位元組; 如果是浮點數,則佔4個位元組. 註四: 陣列的名稱就代表該陣列在記憶體內開頭的位址. 例如: int aa[10]; printf(“The start address of this array is %d”,aa)
一維陣列(1D Array) --- 初值設定 設定陣列初值的格式 : 資料型態 陣列名稱[陣列大小]={xx,xx,…,xx}; 例如: int num[5]={3,6,7,5,9}; (或int num[]={3,6,7,5,9}; ) num[0] num[1] num[2] num[3] num[4] 記憶體 3 6 7 5 9 註一: 長度部分, 可有可無(因為C編譯程式在設定陣列的初值時, 會自行計算有多少個資料元素,然後配予足夠空間給它). 註二: 必須以一對大括號將所要設定之陣列元素值圍住, 陣列元素值間 以逗號相隔. 參考來源 : Borland C++入門與應用徹底剖析(P.203) C入門與Turbo系統 (P.8-7)
範例一: 比較3個數字的大小. 一維陣列(1D Array) #include <stdio.h> #include <stdlib.h> int main( ) { int count, max=0; int number[3]={5, 9, 3}; for (count = 0; count <=2 ; count++ ) if(number[count]>max) max=number[count]; } cout<<“三數中最大的值:”; cout<<max<<endl; return 0; C/C++ 編譯程式時, 並不會檢查存取陣列時的編號, 因此, 若使用負的, 或大於陣列大小的編號時, 編譯器並不會 檢查出來. 唯有執行結果可能有誤
範例二:陣列界限正確版 #include<iostream.h> int main(void) { int x[4]; //用來儲存user輸入的值 int i; for(i=0;i<=3;i++) cout<<“x[”<<i<<“]”<<“=”; //控制可以輸入多少個數值 cin>>x[i]; } cout<<"The output is:"<<endl; for(i=0;i<=3;i++) //分別輸出x陣列的值 cout<<x[i]<<endl; return 0;
陣列界限的檢查 #include<iostream.h> int main(void) { int x[4]; int i; 這種錯誤在run-time才會發生!! #include<iostream.h> int main(void) { int x[4]; int i; for(i=0;i<=5;i++) cout<<"x["<<i<<"]"<<"="; cin>>x[i]; } cout<<"The output is:"<<endl; cout<<x[i]<<endl; return 0;
字元陣列 宣告格式 : char 陣列的名稱 [陣列的大小] ; 或 char 陣列的名稱 [列陣列的大小][行陣列大小] ; For example: char array1 [ 10 ] ; char array2 [ 5 ][ 25 ] ; 例一 : int string[6]={'A','B','C','D','E','\0'}; 或 int string[5]="ABCDE"; 例二 : int string1[2][6]={{'A','B','C','D','E','\0'}, {'F','G','H','I','J','\0'}; 或 int string1[2][5]={ "ABCDE","FGHIJ" }; 如 果 字 元 陣 列 以 字 元 的 方 式 來 存 取 陣 列 , 則 須 加 結 束 字 元 \0 於 陣 列 的 最 末 端 , 表 示 此 字 元 陣 列 的 結 束 如 果 字 元 陣 列 以 字 串 的 方 式 來 存 取 陣 列 , 則 C 編 譯 器 會 自 動 在 字 串 最 末 端 加 上 結 束 字 元 \0 表 示 此 字 元 陣 列 的 結 束 , 所 以 我 們 不 需 自 行 加 入
為什麼用陣列儲存字串,陣列的size會多一個字元單位? 字元陣列 – 範例一 /*列印出字元及字串之長度*/ #include<iostream.h> int main(void) { char arr[]="friend"; char word[]={'b'}; char cad[]="b"; cout<<"size of a[]="<<sizeof(arr)<<endl; cout<<"size of word="<<sizeof(word)<<endl; cout<<"size of c[]="<<sizeof(cad)<<endl; return 0; } 執行結果: size of arr[]=7 size of word[]=1 size of cad[]=2 為什麼用陣列儲存字串,陣列的size會多一個字元單位? str_arr_1.c sizeof(a) =10 sizeof(b)=1 sizeof(str)=2 字串 a 的內容為 My friend, 包括空白共 9 個字元, 但結果為 10, 這是因為字串結尾之結束字元為 \0 字元變數 b 與字串變數 str內容皆為 c, 但長度不同, 因字串 str 以雙引號設定, 結束時自動加上 \0, 因此 str 長度為 2 個位元組, 字元變數以單引號設定, 並不會自動加上字串結束字元 \0
矩陣圖示 char a[ ]=“friend"; [0] [1] [2] [3] [4] [5] [6] [0] [1] [2] [3] [4] [5] [6] char arr[4]=“C++”; [0] [1] [2] [3] char arr[4]={‘C’,’+’,’+’}; f r i e n d \0 C + \0 C +
二維陣列(2D Array) 宣告格式 : 資料型態 陣列名稱[列數][行數]; 資料型態 陣列名稱[列數][行數]; 例如: int num[3][2]; /* 宣告一個 3x2 的陣列*/ row 1 m num[0][0] m+4 num[0][1] m+8 num[1][0] m+12 num[1][1] m+16 num[2][0] m+20 num[2][1] 記憶體 num[0][0] num[0][1] num[1][0] num[1][1] num[2][0] num[2][1] row2 row3 註一: m 代表第一個元素的位址. 註二: 因為是整數,所以每個元素佔4個位元組; 如果是浮點數,則佔24個位元組. 註三: 元素個數 = 2*3 = 6 個 註四: 二維陣列的輸入與輸出均需藉由兩層的for迴圈來處理. 參考來源 : Borland C++入門與應用徹底剖析(P.206) C入門與Turbo系統 (P.8-14)
二維陣列初值的設定 資料型態 陣列名稱[列個數][行個數]={{第一列初值}, {第二列初值}, …, {第N列初值}}; int sale[2][4]={{30,35,26,32}, {33,34,30,29}}; 1維陣列,有4個元素 1維陣列,有4個元素 第4行 第3行 第2行 第1行 (0,0) 30 (0,1) 35 (0,2) 26 (0,3) 32 (1,0) 33 (1,1) 34 (1,2) (1,3) 29 第一列 第二列
二維陣列(2D Array) 範例: 輸入兩個3*3的陣列, 將加總結果存入第三個陣列內. 範例: 輸入兩個3*3的陣列, 將加總結果存入第三個陣列內. #include<iostream.h> int main(void) { int num1[3][3],num2[3][3],num3[3][3]; int i,j; cout<<“please input first 2D-dimension array:\n”; //請輸入第一個2維陣列的值 for(i=0;i<3;i++) for(j=0;j<3;j++) cin>>num1[i][j]; } cout<<"please input second 2D-dimension array:\n"; for(i=0;i<3;i++) //請輸入第二個2維陣列的值 cin>>num2[i][j]; for(j=0;j<3;j++) //算出前兩個陣列加總的結果並存入第三個2維陣列 num3[i][j]=num1[i][j]+num2[i][j]; cout<<"num3["<<i<<"]"; cout<<"["<<j<<"]"<<"="<<num3[i][j]<<endl; } } return 0; 檔名 : 2darray2.c 執行結果: Please input first 2 dimension array. 3 4 5 2 3 4 1 2 3 Please input second 2 dimension array. 2 2 2 3 3 3 4 4 4 The result 2 dimension array is as following : 5 6 7 參考來源 : Borland C++入門與應用徹底剖析(P.208)
找出二維陣列的最大值 #include<iostream.h> int main(void) { int arr[2][4]={{3,13,26,32},{33,10,25,29}}; int i,j,max=arr[0][0]; //將max的值預設為arr[0][0]的值 for(i=0;i<2;i++) for(j=0;j<4;j++) if(max<arr[i][j]) //在二維陣列中,若找到更大的值就儲存在max max=arr[i][j]; } cout<<"\n 最大的數是"<<max; return 0;
多維陣列(Multi-dimensional Array) 宣告格式 : 資料型態 陣列名稱[平面數][列數][行數]; 例如: int x[2][3][4]; x[1][0][0] x[1][0][1] x[1][0][2] x[1][0][3] x[1][1][0] x[1][1][1] x[1][1][2] x[1][1] [3] x[1][2][0] x[1][2][1] x[1][2][2] x[1][2] [3] 註一: 整數,所以共佔2*3*4*2=48個位元組. 註二: 元素個數 = 2*3*4 = 48 個 註三: 三維陣列的輸入與輸出均需藉由三層的for迴圈來處理. 參考來源 : C入門與Turbo系統 (P.8-17) x[0][0][0] x[0][0][1] x[0][0][2] x[0][0][3] x[0][1][0] x[0][1][1] x[0][1][2] x[0][1] [3] x[0][2][0] x[0][2][1] x[0][2][2] x[0][2] [3]