Mảng đa chiều trong C

Xin chào các bạn future programmers! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của các mảng đa chiều trong C. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người bạn thân thiện của bạn, và chúng ta sẽ cùng nhau giải quyết chủ đề này từng bước một. Cuối cùng của bài hướng dẫn này, bạn sẽ thành thạo trong việc xử lý các cấu trúc dữ liệu mạnh mẽ này!

C - Multi-Dimensional Arrays

Mảng đa chiều trong C

Hãy bắt đầu từ cơ bản. Hãy tưởng tượng bạn có một nhóm hộp, và trong mỗi hộp, bạn có thêm nhiều hộp khác. Đó chính là bản chất của một mảng đa chiều - một cách để tổ chức dữ liệu ở nhiều cấp độ hoặc chiều.

Trong C, chúng ta có thể tạo ra các mảng với hơn một chiều. Các loại phổ biến nhất là 2D (hai chiều) và 3D (ba chiều), nhưng về lý thuyết, bạn có thể có nhiều chiều tùy thuộc vào bộ nhớ của máy tính của bạn!

Dưới đây là cách đơn giản để khai báo một mảng 2D:

int matrix[3][4];

Điều này tạo ra một mảng 2D có tên là matrix với 3 hàng và 4 cột. Hãy nghĩ của nó như một lưới hoặc bảng với 3 hàng và 4 cột.

Mảng hai chiều trong C

Hãy cùng đi sâu hơn vào mảng 2D với một ví dụ thực tế. Hãy tưởng tượng bạn đang tạo một bảng trò chơi đơn giản cho tic-tac-toe:

#include <stdio.h>

int main() {
    char board[3][3] = {
        {'_', '_', '_'},
        {'_', '_', '_'},
        {'_', '_', '_'}
    };

    // In bảng
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Trong ví dụ này, chúng ta tạo một bảng 3x3 cho tic-tac-toe. Mỗi ô được khởi tạo với một gạch ngang '_' để đại diện cho không gian trống. Sau đó, chúng ta sử dụng các vòng lặp lồng nhau để in bảng.

Vòng lặp ngoài for(int i = 0; i < 3; i++) sẽ duyệt qua mỗi hàng, trong khi vòng lặp trong for(int j = 0; j < 3; j++) sẽ duyệt qua mỗi cột trong hàng đó.

Mảng ba chiều trong C

Bây giờ, hãy nâng cấp và khám phá mảng 3D. Hãy tưởng tượng bạn đang thiết kế một thế giới trò chơi 3D đơn giản:

#include <stdio.h>

int main() {
    int gameWorld[2][3][4] = {
        {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
        {{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}
    };

    // In thế giới trò chơi
    for(int i = 0; i < 2; i++) {
        printf("Level %d:\n", i+1);
        for(int j = 0; j < 3; j++) {
            for(int k = 0; k < 4; k++) {
                printf("%2d ", gameWorld[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }

    return 0;
}

Ở đây, chúng ta tạo một mảng 3D gameWorld với 2 cấp độ, mỗi cấp độ có 3 hàng và 4 cột. Bạn có thể nghĩ của nó như hai lưới 2D chồng lên nhau.

Chúng ta sử dụng ba vòng lặp lồng nhau để in thế giới 3D này. Vòng lặp ngoài cùng duyệt qua mỗi cấp độ, vòng lặp giữa duyệt qua mỗi hàng trong cấp độ, và vòng lặp trong cùng duyệt qua mỗi cột trong hàng.

Tổng theo hàng của các phần tử trong mảng đa chiều

Bây giờ, hãy thử một điều gì đó thực tế hơn. Chúng ta sẽ tính tổng của mỗi hàng trong một mảng 2D:

#include <stdio.h>

int main() {
    int grades[3][4] = {
        {85, 92, 78, 88},
        {91, 87, 93, 89},
        {76, 82, 95, 90}
    };

    printf("Student  Math  Science  English  History  Total\n");
    printf("----------------------------------------------\n");

    for(int i = 0; i < 3; i++) {
        int sum = 0;
        printf("%7d", i+1);
        for(int j = 0; j < 4; j++) {
            printf("%8d", grades[i][j]);
            sum += grades[i][j];
        }
        printf("%8d\n", sum);
    }

    return 0;
}

Trong ví dụ này, chúng ta có một mảng 2D grades đại diện cho điểm số của 3 học sinh trong 4 môn học. Chúng ta tính tổng điểm của mỗi học sinh (hàng) và in nó cùng với điểm cá nhân.

Nhân ma trận

Cuối cùng, hãy thực hiện phép nhân ma trận - một thao tác phổ biến trong nhiều ứng dụng khoa học và kỹ thuật:

#include <stdio.h>

int main() {
    int matA[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int matB[3][2] = {{7, 8}, {9, 10}, {11, 12}};
    int result[2][2] = {{0, 0}, {0, 0}};

    // Thực hiện phép nhân ma trận
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 2; j++) {
            for(int k = 0; k < 3; k++) {
                result[i][j] += matA[i][k] * matB[k][j];
            }
        }
    }

    // In kết quả
    printf("Result of matrix multiplication:\n");
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 2; j++) {
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Ở đây, chúng ta nhân hai ma trận matA (2x3) và matB (3x2) để được ma trận result (2x2). Ba vòng lặp lồng nhau thực hiện phép nhân: vòng lặp ngoài cùng và vòng lặp giữa duyệt qua mỗi phần tử của ma trận kết quả, trong khi vòng lặp trong cùng tính toán giá trị cho phần tử đó.

Và thế là xong! Chúng ta đã覆盖 các kiến thức cơ bản về mảng đa chiều trong C, từ 2D đến 3D, và thậm chí đã giải quyết một số ứng dụng thực tế. Nhớ rằng, thực hành là cách tốt nhất để hoàn thiện kỹ năng, vì vậy đừng ngần ngại thử nghiệm với các khái niệm này. Chúc các bạn lập trình vui vẻ!

Credits: Image by storyset