C/C++基礎程式設計班 陣列 (Array) 講師:鄒尚軒, 2/4, 2015
課程大綱 迴圈複習 一維陣列 二維陣列 多維陣列
for 迴圈 for (第一次做的事;迴圈繼續的條件;每次做完做的事) 印出下列九九乘法表:
九九乘法 #include <stdio.h> #include <stdlib.h> int main() { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf("%d*%d=%2d ", j, i, i*j); } printf("\n"); system("pause"); return 0;
while 迴圈 while (執行迴圈的條件) 九九乘法 while 版 #include <stdio.h> #include <stdlib.h> int main() { int i, j; i = 1; //初始化i while (i <= 9) { j = 1; //每次外面的迴圈重做就要重新初始化j while (j <= 9) { printf("%d*%d=%2d ", j, i, i*j); j++; } printf("\n"); i++; system("pause"); return 0;
課程大綱 迴圈複習 一維陣列 二維陣列 多維陣列
陣列是什麼 當你想存10個整數的時候? 當你想存100個整數的時候? 那一個變數有十個格子? 10個變數? 勉強可以接受 當你想存100個整數的時候? 100個變數? IMPOSSIBLE 那一個變數有十個格子? 簡單來說,陣列就是一個有很多格子的東西, 可以讓你放進很多個一樣型態的變數
一維陣列的宣告 用途:在記憶體中找出一塊連續的空間來存放 多個相同資料型態的內容 語法:資料型態 陣列名稱[長度] int a[N]; N是一個不變的常數,不可為變數(in C) 索引由 0~N-1,而不是1~N 記憶體位址: a a[0] a[1] a[2] … a[N-1] N個欄位
一維陣列的宣告 宣告與初始化方式有很多種: 一旦宣告後,就無法再進行初始化! int a[10] = {0}; 同上面的結果 int a[3] = {1}; 只有第一個會被設成1,後面都會初始化為0 int a[3] = {1, 2, 3, 4}; 編譯會過但程式會壞掉...... int a[]; compile error.... 一旦宣告後,就無法再進行初始化!
一維陣列的使用 宣告好之後想使用裡面的元素:陣列名稱[索引] 範例: 「陣列名稱」:連續的記憶體空間的起始位址 「索引」:陣列元素是在記憶體空間的第幾個位置 範例: 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> #include <stdlib.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); system("pause"); return 0; } int i; int score[3]; for (i = 0; i < 3; i++ ) { scanf("%d", &score[i]); printf("I get %d\n", score[i]);
一維陣列的使用 使用陣列常搭配使用#define用來定義陣列大小,方便做程 式修改,並配合for迴圈使用 #define OO XX在編譯時,編譯器就會幫你把程式碼中的OO全換 成XX 範例:輸入全班50位同學的成績並輸出 #include <stdio.h> #include <stdlib.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]); } system("pause"); return 0;
一維陣列的應用 範例:輸入班上3位 同學分數,求出它們 的平均值 #include <stdio.h> #include <stdlib.h> #define STUDENT 3 int main() { int i; double sum = 0; int score[STUDENT]; // 分別讀入3個數值 for (i = 0; i < STUDENT; i++) { scanf("%d", &score[i]); } // 計算總和 for ( i = 0; i < STUDENT; i++) { sum += score[i]; printf("avg=%lf\n", sum / STUDENT); system("pause"); return 0;
練習 練習一 練習二 如果上面兩個練習不能滿足你.... 延續上頁範例,輸入三位同學成績(假設都不一樣), 印出平均分數後,再印出分數小於平均分數的同學 的號碼(1~3)及分數 練習二 延續上頁範例,在印出上頁結果後,再多印出分數 最高的同學的號碼和分數。 如果上面兩個練習不能滿足你.... int a[10] = {37, 91, 16, 74, 88, 96, 84, 2, 85, 62}; 請將這個陣列依大排到小
課程大綱 迴圈複習 一維陣列 二維陣列 多維陣列
二維陣列的宣告 二維陣列宣告方式 資料型態 陣列名稱[長度 1][長度2]; int a[M][N]; M、N 為整數常數,不可 為變數 邏輯上: a[0][0] … a[0][N-1] a[M-1][0] a[M-1][N-1] 電腦中: 記憶體位址: 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個欄位
二維陣列的宣告 利用連續的記憶體空間我們可以: 製作行列的效果(矩陣) 模擬平面座標系(XY座標) 位置: a y軸 第0列 第1列 第0行 第1行 第2行 a[0][0] (0, 0) a[0][1] (0, 1) a[0][2] (0, 2) a[1][0] (1, 0) a[1][1] (1, 1) a[1][2] (1, 2) x軸
二維陣列的宣告 宣告與初始化方式有很多種: 一旦宣告以後,就無法再進行初始化! int a[10] [10]= {0}; 與一維不同,語法錯誤 int a[][3] = {1, 2, 3}; a只有1*3個位置(=int a[1][3];),而三個各為1,2,3 int a[3][3] = {{1}}; 只有第一個會被設成1,後面都會初始化為0 一旦宣告以後,就無法再進行初始化!
二維陣列的使用 當宣告陣列後,要設定陣列時,就必須一個一 個欄位做設定 int main() { int a[2][2];// = {{1, 2}, {3, 4}}; a[0][0] = 1; a[0][1] = 2; a[1][0] = 3; a[1][1] = 4; return 0; }
二維陣列與巢狀迴圈 範例:使用巢狀迴圈輸出二維陣列內容 #include <stdio.h> #include <stdlib.h> int main() { int a[3][3]={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%d ", a[i][j]); } printf("\n"); system("pause"); return 0;
二維陣列與巢狀迴圈 範例:輸入不同 兩班三位同學的 分數,並印出成 績 #include <stdio.h> #include <stdlib.h> #define CLASS 2 #define STUDENT 3 int main() { int i, j; int score[CLASS][STUDENT]; // 分別讀入兩班各個數值 for (i = 0; i < CLASS; i++) { printf("班級%d:\n", i+1); for (j = 0; j < STUDENT; j++) { printf("學生%d: ", j+1); scanf("%d", &score[i][j]); } // 分別輸出兩班各個數值 printf("學生%d: %d分\n", j+1, score[i][j]); system("pause"); return 0; 範例:輸入不同 兩班三位同學的 分數,並印出成 績
二維陣列與巢狀迴圈 範例:輸入不同 兩班三位同學的 分數,並印出平 均值 #include <stdio.h> #include <stdlib.h> #define CLASS 2 #define STUDENT 3 int main() { int i, j, sum = 0; int score[CLASS][STUDENT]; // 分別讀入兩班各個數值 for (i = 0; i < CLASS; i++) { printf("班級%d:\n", i+1); for (j = 0; j < STUDENT; j++) { printf("學生%d: ", j+1); scanf("%d", &score[i][j]); } // 計算所有學生分數總合 sum+=score[i][j]; printf("平均:%.2lf\n", (double)sum/(CLASS*STUDENT)); system("pause"); return 0; 範例:輸入不同 兩班三位同學的 分數,並印出平 均值
練習 修改上上頁範例,輸入兩班三位同學後,印出 各班平均 如果練習不能滿足你... 模擬下列矩陣乘法 矩陣B: 1 2 3 5 6 7 5 6 7 8 5 5 4 5 6 矩陣A: 1 2 3 4 5 6 7 8 4 5 6 7 矩陣C: 51 49 56 123 121 140 105 103 119 X =
練習 有個 3*4 的陣列,先試著輸出各列的總和(橫的), 再輸出各行的總和 例如: 先輸出 10 26 22 再輸出 10 13 16 19 A: 1 2 3 4 5 6 7 8 4 5 6 7
課程大綱 迴圈複習 一維陣列 二維陣列 多維陣列
其他多維陣列的使用 三維陣列 四維陣列 以此類推 資料型態 陣列名稱[長度1][長度2][長度3]; 資料型態 陣列名稱[長度1][長度2][長度3][長度4]; 以此類推
其他多維陣列的應用 三維坐標系(xyz) 高維資料處理 等等...
三維陣列範例:輸出兩班三位同學兩科考試成績 #include <stdio.h> #include <stdlib.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 (i = 0; i < CLASS; i++) { printf("班級%d:\n", i+1); for (j = 0; j < STUDENT; j++ ) { printf("學生%d:\n", j+1); for (k = 0; k < SUBJECT; k++) { printf("第%d科: %d分\n", k+1, score[i][j][k]); } printf("\n"); system("pause"); return 0;
三維陣列練習 續上頁範例,請分別輸出班平均以及全校的各 科平均