文章程式碼顯示

2017年11月15日 星期三

《筆記》C語言 - 06_3:多維陣列、二維陣列、三維陣列

多維陣列

C 語言的陣列可以有多重下標,也就是說陣列後面的中括弧 [] 可以不只一個,此稱為多維陣列(multidimensional arrays)。經常會用來表示表格,其數值是依照 列(rows) 和 行(columns) 排列組成,就跟數學的矩陣一樣。

多維陣列參數宣告的第一個下標可以被省略不寫,但其他的下標則都是必須的。

編譯器將利用這些下標來判斷多維陣列的元素位於記憶體中的什麼位置

不論是幾維的陣列,所有的陣列元素都是連續的存放在記憶體中。以二維陣列來說,元素存放在記憶體中的順序是第一列之後跟隨著第二列,且每一列基本上都是一個一維陣列

二維陣列



二維陣列的第一個下標會指定元素的 列(row) ;第二個下標會指定元素的 行(colum)

多維陣列可以和一維陣列一樣,在宣告時指定其初始值。例如

int b[2][2] = { {1,2},
                     {3,4} };

這些數值會以 "列" 為單位(每一列基本上都是一個一維陣列),並且用大括弧括起來。

第一個大括號的集合會初始化第 0 列,第二個大括號的集合會初始化第 1 列 ... 以此類推

如果某一列的初始值個數不夠時,沒有被明確指定的初始值都將被自動補 0。

#include "stdio.h"

void printDoubleSubArray(int array[][2]);

int main(void) {
 int a[3][2] = { {1,2},
                 {3,4},
                 {5,6} };

 int b[3][2] = { {5},
                 {6,7},
                 {8} };

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

 printf( "Array a : \n" );
 printDoubleSubArray( a );

 printf( "\nArray b : \n" );
 printDoubleSubArray( b );

 printf( "\nArray c : \n" );
 printDoubleSubArray( c );

}

void printDoubleSubArray(int array[][2]){
 int i,j;

 for ( i = 0; i < 3 ; i++){
  for( j = 0; j < 2; j++){
   printf( "%d ",array[i][j] );
  }
  printf("\n");
 }
}



前文提到,當我們在接收一維陣列做為函式的引數時,函式的陣列括號是空的。

維陣列的函式標頭第一個下標也可以是空的,但其他下標都是必需的

我們在 printDoubleSubArray 函式裡面使用了雙重迴圈來進行二維陣列的顯示列印。陣列 c 的宣告較特別,因所有的陣列元素都被連續的存放在記憶體位置中,所以編譯器會先用這些數值來填滿第一列,接著再填滿第二列 .... 以此類推

二維陣列的經典應用在於班上學生成績(表格)

一個學生可能對應到四個科目,而總人數為 10 人。如此一來我們就可以建立一個陣列來代表,如

int studentGrade[10][4] = ...(略)

#include "stdio.h"

void average(const int array[][4]);

int main(void) {

 int studentGrade[10][4] = { {50, 30, 62, 67},
                {20, 80, 62, 87},
                {92, 90, 22, 89},
                {90, 94, 98, 82},
                {97, 92, 78, 81},
                {69, 79, 76, 97},
                {63, 84, 74, 76},
                {34, 62, 22, 12},
                {66, 24, 47, 84},
                {74, 64, 37, 98}
                         };
average(studentGrade);

 return 0;
}

void average(const int array[][4]){

 int Average[10] = {0};
 int AverageTemp = 0;

 for( int i = 0; i < 10; i++){
  for ( int j = 0; j < 4; j++){
   AverageTemp = AverageTemp + array[i][j];
  }
  Average[i] = AverageTemp/4;
  AverageTemp = 0;
 }

 printf( "Student's average : \n" );

 for( int k=0; k < 10; k++){
  printf("%d ", Average[k]);
 }
}


補充:

三維陣列

三維陣列常用來代表不同頁面或是不同班級(的成績),而三維陣列中的第一個中括弧代表 "頁" ,如下圖(圖片來源於此)



因這個應用較少用到,故先暫時跳過

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引