C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015
課程大綱 一維陣列 二維陣列 其他多維陣列
一維陣列的宣告 用途:在記憶體中找出一塊連續的空間來存放多 個相同資料型態的內容 一維陣列的宣告 例如: int a[N]; 語法: 資料型態 陣列名稱[長度]; 例如: int a[N]; (N為一個整數常數, 不為變數) 位置: a a[0] a[1] a[2] … a[N-1] N個欄位
一維陣列的使用 在使用宣告好的陣列時,要使用一個陣列中的元 素可以表示成:陣列名稱[索引]。 範例: 陣列名稱: 用來表示一塊緊密相鄰的記憶體空間的起始位址 索引: 用來表示該陣列元素是在記憶體空間的第幾號位置 範例: int a[3]; // 宣告陣列a有3個整數 a[0]=1; // 把a[0]設定為1 a[1]=2; // 把a[1]設定為2 a[2]=3; // 把a[2]設定為3 a[3] 不要使用超過索引值的資料!
一維陣列的使用 範例:輸入全班3位同學的成績並輸出 比較下列兩個版本程式 思考:如果班上有50位同學的話呢? #include <stdio.h> int main() { int score1, score2, score3; scanf("%d",&score1); printf("I get %d\n",score1); scanf("%d",&score2); printf("I get %d\n",score2); scanf("%d",&score3); printf("I get %d\n",score3); return 0; } #include <stdio.h> int main() { int i; int score[3]; for ( i=0; i<3; i++ ) scanf("%d", &score[i]); printf("I get %d\n", score[i]); } return 0;
一維陣列的使用 使用陣列常搭配使用#define用來定義一個常數, 方便做程式修改 範例:輸入全班50位同學的成績並輸出 #include <stdio.h> #define STUDENT 50 int main() { int i; int score[STUDENT]; for ( i=0; i < STUDENT; i++ ) scanf("%d", &score[i]); printf("I get %d\n",score[i]); } return 0;
一維陣列的初始化 宣告陣列並給初始內容的語法: 資料型態 陣列名稱[長度]={內容0,內容1,內容2,…,內容N-1}; 資料型態 陣列名稱[長度]={0}; //所有資料設為0 int main() { int a[5]={1,2,3,4,5}; // 設定 a[0]=1, a[1]=2, a[2]=3, a[3]=4, a[4]=5 int b[]={1,2,3}; // 若size沒指定, 因為給了3個數字, 在此會自動設定為b[3]; int c[5]={0}; // 設定 c[0]=0, c[1]=0, c[2]=0, c[3]=0, c[4]=0 return 0; }
陣列的複製 因為宣告陣列後如果沒有初始化,之後只能夠一 個一個索引值做設定,如果想要複製整個陣列可 以用memcpy函式做資料複製 memcpy(目標陣列, 來源陣列, sizeof(型態)*個數); #include <string.h> int main() { int a[5] = {1,2,3,4,5}; int b[5]; memcpy(b, a, sizeof(int)*5); return 0; }
一維陣列的應用 範例:輸入班上3位同學分數, 求出它們的平均值. #include <stdio.h> #define STUDENT 3 int main() { int i; double sum=0; double aver; int score[STUDENT]; // 分別讀入3個數值 for ( i=0; i < STUDENT; i++ ) scanf("%d", &score[i]); } // 計算總和 sum+=score[i]; // 求平均值 aver=sum/STUDENT; printf("average=%lf\n",aver); return 0;
練習 延續上頁範例,輸入3位同學成績, 印出平均分數 後, 印出不及格的同學之號碼與分數
練習: 找出數列中最大值 延續上頁範例,輸入3位同學成績, 印出平均分數 與不及格的同學之號碼與分數後, 印出其中最高分 同學之分數
課程大綱 一維陣列 二維陣列 其他多維陣列
二維陣列的使用 二維陣列 Example: int a[M][N]; 資料型態 陣列名稱[長度1][長度2]; (N,M為整數常數, 不為變數) 位置: a a[0][0] … a[0][N-1] a[1][0] … a[1][N-1] … a[M-1][0] … a[M-1][N-1] N個欄位 N個欄位 N個欄位 M*N個欄位
二維陣列的使用 利用連續的記憶體空間,製作行列的效果! EX: int a[2][3]; 位置: a 第0列 第1列 第0行 第1行 第2行
二維陣列 設定二維陣列初值的方法為 宣告陣列後,要設定陣列時, 就必須一個一個欄位 做設定 int main() { int a[2][3]={ {1, 2, 3}, {4, 5, 6} }; int b[2][2]={ 1,2,3,4 }; int c[2][2]={0}; //所有資料設為0 return 0; } int main() { int a[2][2]; a[0][0] = 1; a[0][1] = 2; a[1][0] = 3; a[1][1] = 4; return 0; }
二維陣列與巢狀迴圈 使用巢狀迴圈輸出二維陣列內容: #include <stdio.h> int main() { int a[3][3]={ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int i,j; for ( j=0; j<3; j++ ) for ( i=0; i<3; i++ ) printf("%d ", a[j][i]); } printf("\n"); return 0;
二維陣列與巢狀迴圈 範例:輸入兩班上3位同學分數, 然後再次輸出成績. #include <stdio.h> #define CLASS 2 #define STUDENT 3 int main() { int i, j; int score[CLASS][STUDENT]; // 分別讀入兩班各個數值 for ( j=0; j < CLASS; j++ ) printf("班級%d:\n", j+1); for ( i=0; i < STUDENT; i++ ) printf("學生%d: ", i+1); scanf("%d", &score[j][i]); } // 分別輸出兩班各個數值 printf("學生%d: %d分\n", i+1, score[j][i]); return 0;
二維陣列與巢狀迴圈 範例:輸入兩班上3位同學分數, 求出它們的平均值. #include <stdio.h> #define CLASS 2 #define STUDENT 3 int main() { int i, j; double sum=0; double aver; int score[CLASS][STUDENT]; // 分別讀入兩班各3個數值 for ( j=0; j < CLASS; j++ ) printf("班級%d:\n", j+1); for ( i=0; i < STUDENT; i++ ) printf("學生%d: ", i+1); scanf("%d", &score[j][i]); } // 計算總和 sum+=score[j][i]; // 求平均值 aver=sum/(STUDENT*CLASS); printf("average=%lf\n",aver); return 0;
練習 修改上頁範例,輸入兩班3位同學分數後, 印出各 班總分
課程大綱 一維陣列 二維陣列 其他多維陣列
其他多維陣列的使用 三維陣列 四維陣列 … 資料型態 陣列名稱[長度1][長度2][長度3]; 資料型態 陣列名稱[長度1][長度2][長度3][長度4]; …
其他多維陣列的應用 例如:儲存2班同學, 每班2人, 2科考試成績 宣告要用的資料 第一班,第二號同學,第一科100分 int score[2][2][2]; 第一班,第二號同學,第一科100分 score[0][1][0] = 100;
其他多維陣列的應用 範例:輸出2班2位同學2科考試成績. #include <stdio.h> #define CLASS 2 #define STUDENT 2 #define SUBJECT 2 int main() { int i, j, k; int score[CLASS][STUDENT][SUBJECT] = {20,30,40,50,60,70,80,90}; // 分別輸出兩班各個數值 for ( j=0; j < CLASS; j++ ) printf("班級%d:\n", j+1); for ( i=0; i < STUDENT; i++ ) printf("學生%d:\n", i+1); for ( k=0; k < SUBJECT; k++ ) printf("第%d科: %d分\n", k+1, score[j][i][k]); } printf("\n"); return 0;