Lập trình C: Mảng hai chiều

Tổng quan

Chúng ta đã biết mảng một chiều là mảng chỉ có một chỉ số. Ngôn ngữ C cho phép ta có thể tạo mảng có nhiều hơn một chiều, mảng như vậy gọi là mảng đa chiều. Mảng đa chiều giúp ta dễ dàng trình bày các đối tượng đa chiều, chẳng hạn một đồ thị dạng phẳng với các hàng và cột, hay tọa độ màn hình của máy tính hoặc tọa độ của của một nhân vật trong không gian ba chiều. Mảng đa chiều được khai báo giống như mảng một chiều, ngoại trừ có thêm một hoặc nhiều cặp ngoặc vuông ([]). Cú pháp tổng quát để khai báo một mảng đa chiều như sau:

Lớp_lưu_trữ Kiểu_dữ_liệu Tên_mảng[d1][d2]…[dN];

, trong đó, d1, d2, …, dN là các chỉ số ứng với từng chiều.

Trong các loại mảng đa chiều thì mảng hai chiều là đơn giản và hay được sử dụng nhất. Một mảng hai chiều hay còn gọi là mảng phẳng có thể xem như là một mảng của ‘mảng một chiều’. Một mảng hai chiều đặc trưng như bảng lịch trình của máy bay, xe lửa, bảng dữ liệu với các hàng và cột. Mảng hai chiều có hai chỉ số tương ứng là chỉ số hàng và chỉ số cột. Lúc này, một phần tử của mảng sẽ tương ứng là một biến và được xác định khi biết chỉ số hàng và chỉ số cột của nó.

Ví dụ, nếu bạn muốn khai báo một mảng có tên là toado (tọa độ) gồm 4 hàng và 3 cột và có kiểu int chẳng hạn, thì bạn làm như sau:

int toado[4][3];

Khai báo trên sẽ cho ta mảng toado bao gồm 4 x 3=12 phần tử, và ta có thể biểu diễn các phần tử này như sau:

toado[0][0]  toado[0][1]  toado[0][2]

toado[1][0]  toado[1][1]  toado[1][2]

toado[2][0]  toado[2][1]  toado[2][2]

toado[3][0]  toado[3][1]  toado[3][2]

Ở đây bạn thấy rằng chỉ số hàng bắt đầu từ 0 đến 3, còn chỉ số cột bắt đầu từ 0 đến 2. Phần tử thứ 8 của mảng toado là phần tử có chỉ số hàng là 2 và chỉ số cột là 1, tức là toado[2][1].

Khởi tạo mảng hai chiều

Ta có thể khai báo mảng hai chiều đồng thời khởi tạo giá trị cho các phần tử của mảng ngay tại câu lệnh khai báo. Giả sử bạn muốn khai báo đồng thời khởi tạo giá trị cho mảng toado ở trên thì bạn có thể làm như sau:

int toado[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12};

Kết quả là mỗi phần tử của mảng toado sẽ nhận được một giá trị cụ thể như sau:

toado[0][0] = 1    toado[0][1] = 2   toado[0][2] = 3

toado[1][0] = 4    toado[1][1] = 5   toado[1][2] = 6

toado[2][0] = 7    toado[2][1] = 8   toado[2][2] = 9

toado[3][0] = 10  toado[3][1] = 11  toado[3][2] = 12

Ta cũng có thể khởi tạo giá trị cho các phần tử mảng bằng cách sử dụng cặp ngoặc xoắn ({}) để khởi tạo giá trị cho các phần tử trên từng hàng. Ví dụ:

int toado[4][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} };

Còn đây là cách khởi tạo đơn giản nhất, với cách này thì tất cả các phần tử của mảng hai chiều đều nhận cùng một giá trị:

int toado[4][3] = {0}; //các phần tử mảng đều được khởi tạo giá trị ban đầu là 0

Ví dụ áp dụng sau đây sẽ viết chương trình tính tổng và tích các phần tử trong mảng số thực a[3][2] (3 hàng, 2 cột), trong đó các phần tử của mảng được khởi tạo giá trị ban đầu là 0. Chương trình được viết như sau:

#include <

stdio

.h> main() {

float

a[

3

][

2

] = {

0

};

double

addition=

0

, multiple=

1

;

int

i, j; printf(

"

\n

Nhap lieu cho mang:

\n

"

);

for

(i=

0

; i<

3

; i++){ //lấy số hàng

for

(j=

0

; j<

2

; j++) { //lấy số cột printf(

"

\n

a[%d][%d] = "

,i,j); scanf(

"%f"

, &a[i][j]); //nhập liệu cho từng phần tử mảng hai chiều } } //Tính tổng printf(

"

\n

Addition: "

);

for

(i=

0

; i<

3

;i++){

for

(j=

0

; j<

2

;j++){ addition += a[i][j]; } } printf(

"%lf"

, addition); //Tính tích printf(

"

\n

Multiple: "

);

for

(i=

0

; i<

3

; i++){

for

(j=

0

; j<

2

; j++){ multiple *= a[i][j]; } } printf(

"%lf"

, multiple);

return

0

; }