1.Mảng 2 chiều

Mảng 2 chiều là việc khai báo một danh sách gồm các mảng một chiều, có nghĩa là mảng 2 chiều là tập hợp gồm các mảng 1 chiều.

Ví dụ ta có mảng 1 chiều:

int a[10];

các phần tử của mảng một chiều trên là:

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

Khai báo mảng 2 chiều

type Name[row][col]

Trong đó:

  • type là kiểu dữ liệu của mảng
  • name là tên mảng
  • row là số lượng hàng của mảng
  • col là số lượng cột của mảng

Ví dụ: int a[5][7]

COL 0 COL 1 COL 2 COL 3 COL 4 COL 5 COL 6
ROW 0 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5] a[0][6]
ROW 1 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5] a[1][6]
ROW 2 a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5] a[2][6]
ROW 3 a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] a[3][5] a[3][6]
ROW 4 a[4][0] a[4][1] a[4][2] a[4][3] a[4][4] a[4][5] a[4][6]

Ví dụ ta có phần tử a[0][3] nghĩa là đây là phần tử tại hàng thứ 0 cột thứ 3 trong mảng hay phần tử a[3][4] nghĩa là phần tử tại hàng thứ 3 cột thứ 4

Lưu ý: chỉ số bắt đầu của hàng là 0, chỉ số bắt đầu của cột cũng là 0

Ví dụ khai báo mảng a[5][7] với kiểu dữ liệu int trong C

#include <stdio.h>
int main(){
    int a[5][7];
    return 0;
}

Khai báo và gán giá trị mặc định cho mảng a[5][7]

#include <stdio.h>
int main(){
    int a[5][7] = {
        {5,3,6,5,9,3,7},
        {1,3,6,8,0,9,3},
        {7,3,9,2,8,2,3},
        {7,6,3,2,3,9,2},
        {8,6,3,9,3,2,5}
    };
    printf("Gia tri cua mang tai hang 0 cot 3 la: %d",a[0][1]);
    printf("\nGia tri cua mang tai hang 5 cot 6 la: %d",a[4][6]);
    return 0;
}
Gia tri cua mang tai hang 0 cot 3 la: 3

Gia tri cua mang tai hang 5 cot 6 la: 5

Ta nhìn có thể thấy mảng 2 chiều là các mảng một chiều được viết lại thành một danh sách với dấu “ ,” (dấu phẩy)

Ta cũng có thể truy cập và thay thế giá trị ở hàng thứ m, cột thứ n trong mảng 2 chiều bằng cách a[m][n] = giatri;

Ví dụ dưới đây tôi thay thế a[0][1] = 10

#include <stdio.h>
int main(){
    int a[5][7] = {
        {5,3,6,5,9,3,7},
        {1,3,6,8,0,9,3},
        {7,3,9,2,8,2,3},
        {7,6,3,2,3,9,2},
        {8,6,3,9,3,2,5}
    };
    printf("Gia tri cua mang tai hang 0 cot 3 la: %d",a[0][1]);
    a[0][1] = 10;
    printf("\nGia tri a[0][1]cua mang sau khi thay the la: %d",a[0][1]);
    return 0;
}
Gia tri cua mang tai hang 0 cot 3 la: 3

Gia tri a[0][1]cua mang sau khi thay the la: 10

2.Duyệt mảng 2 chiều

Khác với duyệt mảng 1 chiều, khi thực hiện duyệt mảng hai chiều ta cần sử dụng hai vòng lặp

  • 1 vòng lặp duyệt theo hàng
  • 1 vòng lặp duyệt theo cột

Ví dụ dưới đây tôi duyệt mảng trên với 2 vòng lặp for để in ra màn hình tất cả phần tử có trong mảng

#include <stdio.h>
int main(){
    int a[5][7] = {
        {5,3,6,5,9,3,7},
        {1,3,6,8,0,9,3},
        {7,3,9,2,8,2,3},
        {7,6,3,2,3,9,2},
        {8,6,3,9,3,2,5}
    };
    
    for(int i = 0; i<5; i++){
        for(int j = 0; j < 7; j++){
            printf("%d \t", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
5 3 6 5 9 3 7

1 3 6 8 0 9 3

7 3 9 2 8 2 3

7 6 3 2 3 9 2

8 6 3 9 3 2 5

Giải thích: Vòng for đầu tiên tôi dùng để duyệt phần tử ở các hàng thứ i với điều kiện bắt đầu từ 0 duyệt khi biến i bé hơn 5 và mỗi lần duyệt xong biến i tăng lên 1 đơn vị, vòng for thứ hai tôi dùng để duyệt phần tử ở các cột thứ j với bắt đầu bằng 0 duyệt khi biến j bé hơn 7 và mỗi lần duyệt xong biến j tăng lên một đơn vị sau đó thực hiện in ra giá trị của phần tử trong mảng a[i][j]

Tiếp theo, ví dụ tôi muốn duyệt mảng trên trong khoảng hàng từ 0->2, cột từ 1->3, tôi chỉ việc thay thế biến bắt đầu i,j và biến kết thúc i,j cho phù hợp

#include <stdio.h>
int main(){
    int a[5][7] = {
        {5,3,6,5,9,3,7},
        {1,3,6,8,0,9,3},
        {7,3,9,2,8,2,3},
        {7,6,3,2,3,9,2},
        {8,6,3,9,3,2,5}
    };
    
    for(int i = 0; i<3; i++){
        for(int j = 1; j < 4; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
3 6 5

3 6 8

3 9 2

Lưu ý: Trong một số trường hợp mảng một chiều còn được gọi là vector, còn mảng 2 chiều được gọi là các Matrix (ma trận) m hàng n cột