Mảng 2 chiều (ma trận) là một trong những chủ đề bài tập lập trình C phổ biến nhất trong các trường đại học. Bài viết này hướng dẫn từng bước cách khai báo, nhập xuất mảng 2 chiều trong C, đồng thời giải các bài tập thường gặp như tính tổng, tìm phần tử lớn nhất/nhỏ nhất và chuyển vị ma trận.

Mảng hai chiều là gì

Mảng hai chiều có thể được định nghĩa như một mảng của các mảng. Mảng hai chiều được tổ chức như một ma trận đại diện bởi các cột và hàng.

Cú pháp:

DataType ArrayName[rows][columns];

Ví dụ:

int matrices[4][3]

Ở đây, mảng hai chiều matrices có kiểu int, 4 hàng, 3 cột.

Để truy cập một phần tử ở vị trí nào thì ta có thể chỉ định ArrayName[i][j], trong đó i là chỉ số của hàng (bắt đầu từ 0) và j là chỉ số của cột (bắt đầu từ 0).

Cùng xem ví dụ dưới đây:

#include <stdio.h>

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

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

        printf("\n");
    }
    return 0;
}

Kết quả:

1 2
3 4
5 6

Lưu ý: Một số bạn thường bị nhầm ở chỗ chỉ số hàng i và chỉ số cột j.

Bài toán nhập xuất mảng hai chiều

Bài toán: Hãy nhập một ma trận gồm m hàng và n cột, sau đó xuất chúng ra màn hình.

Code:

#include <stdio.h>

int main() {
    int rows;
    int columns;

    printf("Rows: ");
    scanf("%d", &rows);
    printf("Column: ");
    scanf("%d", &columns);

    int matrices[rows][columns]; // Khai bao mang hai chieu

    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < columns; ++j) {
            printf("A[%d][%d]: ", i, j);
            scanf("%d", &matrices[i][j]);
        }
    }

    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < columns; ++j) {
            printf("%d ", matrices[i][j]);
        }

        printf("\n");
    }
    return 0;
}

Kết quả:

Rows: 2
Column: 3
A[0][0]: 1
A[0][1]: 2
A[0][2]: 3
A[1][0]: 4
A[1][1]: 5
A[1][2]: 6
1 2 3
4 5 6

Kết luận

Như vậy mình đã hướng dẫn các bạn cách nhập xuất mảng hai chiều trong ngôn ngữ C.


Các bài tập mảng 2 chiều phổ biến

Bài tập 1: Tính tổng tất cả các phần tử trong ma trận

#include <stdio.h>

int main() {
    int rows, cols;
    printf("Nhap so hang: "); scanf("%d", &rows);
    printf("Nhap so cot: ");  scanf("%d", &cols);

    int a[rows][cols];
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++) {
            printf("a[%d][%d] = ", i, j);
            scanf("%d", &a[i][j]);
        }

    int sum = 0;
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++)
            sum += a[i][j];

    printf("Tong cac phan tu: %d\n", sum);
    return 0;
}

Bài tập 2: Tìm phần tử lớn nhất và nhỏ nhất trong ma trận

#include <stdio.h>

int main() {
    int rows, cols;
    printf("Nhap so hang: "); scanf("%d", &rows);
    printf("Nhap so cot: ");  scanf("%d", &cols);

    int a[rows][cols];
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++) {
            printf("a[%d][%d] = ", i, j);
            scanf("%d", &a[i][j]);
        }

    int maxVal = a[0][0], minVal = a[0][0];
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++) {
            if (a[i][j] > maxVal) maxVal = a[i][j];
            if (a[i][j] < minVal) minVal = a[i][j];
        }

    printf("Phan tu lon nhat: %d\n", maxVal);
    printf("Phan tu nho nhat: %d\n", minVal);
    return 0;
}

Bài tập 3: Chuyển vị ma trận (Transpose)

Chuyển vị ma trận là phép biến đổi đổi vị trí hàng và cột: phần tử a[i][j] trở thành a[j][i].

#include <stdio.h>

int main() {
    int n;
    printf("Nhap cap ma tran vuong n: "); scanf("%d", &n);

    int a[n][n];
    printf("Nhap ma tran %dx%d:\n", n, n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            printf("a[%d][%d] = ", i, j);
            scanf("%d", &a[i][j]);
        }

    // Chuyển vị tại chỗ (in-place)
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++) {
            int temp = a[i][j];
            a[i][j] = a[j][i];
            a[j][i] = temp;
        }

    printf("Ma tran chuyen vi:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            printf("%4d", a[i][j]);
        printf("\n");
    }
    return 0;
}

Ví dụ:

Nhap:        Ket qua chuyen vi:
1  2  3      1  4  7
4  5  6  →   2  5  8
7  8  9      3  6  9

Bài tập 4: Sắp xếp từng hàng của ma trận tăng dần

#include <stdio.h>

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (arr[j] > arr[j + 1]) {
                int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t;
            }
}

int main() {
    int rows, cols;
    printf("Nhap so hang: "); scanf("%d", &rows);
    printf("Nhap so cot: ");  scanf("%d", &cols);

    int a[rows][cols];
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++) {
            printf("a[%d][%d] = ", i, j);
            scanf("%d", &a[i][j]);
        }

    for (int i = 0; i < rows; i++)
        bubbleSort(a[i], cols);

    printf("Ma tran sau khi sap xep tung hang:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++)
            printf("%4d", a[i][j]);
        printf("\n");
    }
    return 0;
}

Xem thêm