Mảng 2 chiều trong C++: Ví dụ và các bài toán liên quan

196

Mảng là một kiểu dữ liệu cơ bản có cấu trúc mà mọi lập trình viên đều phải nắm vững, tuy vậy khi một mảng có nhiều chiều thì cấu trúc dữ liệu này sẽ trở nên phức tạp hơn. Với ngôn ngữ lập trình thiên về khả năng tính toán như C++, cấu trúc mảng 2 chiều là một phần kiến thức quan trọng có tính ứng dụng cao giúp chúng ta có thể xử lý các bài toán lưu trữ và thao tác với dữ liệu thực tế. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về mảng 2 chiều trong C++ và làm quen với nó thông qua các ví dụ cụ thể nhé. 

Mảng 2 chiều trong C++

Trong C++, mảng 2 chiều được hiểu đơn giản là một mảng có 2 phần tử mà trong đó mỗi phần tử chính là một mảng. Định nghĩa này cũng có thể được mở rộng ra với mảng nhiều chiều. 

Mảng 2 chiều trong C++

Mảng 2 chiều có thể được biểu diễn tương tự như một bảng gồm các hàng và cột được đánh số từ 0, các phần tử trong mảng được xác định thông qua chỉ số theo hàng và cột (hàng trước cột sau). Các phần tử trong mảng có chung kiểu dữ liệu được khai báo từ trước.

Trong cấu trúc dữ liệu, mảng 2 chiều là một kiểu phổ biến và có tính ứng dụng cao trong thực tế. Với C++, một ngôn ngữ thường được sử dụng cho việc tính toán dữ liệu, thì mảng 2 chiều được sử dụng để lưu trữ dữ liệu dưới dạng ma trận trong toán học; từ đó có thể thao tác thêm, sửa, xóa dễ dàng với dữ liệu. Để hiểu rõ hơn cách hoạt động của mảng 2 chiều trong C++, chúng ta cùng tìm hiểu các thao tác với kiểu dữ liệu này nhé.

Khai báo mảng 2 chiều trong C++

Cú pháp khai báo mảng 2 chiều trong C++ như sau:

datatype arrayName[row_size][col_size];

Trong đó:

  • datatype: kiểu dữ liệu được lưu trữ trong mảng
  • arrayName: tên biến mảng 2 chiều
  • row_size, col_size: kích thước của mỗi chiều, row_size là số dòng và col_size là số cột. Khi khai báo mảng 2 chiều, bạn bắt buộc phải xác định row_size, col_size cụ thể.
  • Tổng số phần tử trong mảng = row_size * col_size. Bộ nhớ sử dụng được khởi tạo bằng sizeof(kiểu dữ liệu) * tổng số phần tử.

Ví dụ: 

#include <iostream>
using namespace std;

int main()
{
  // Mảng 2 chiều các số
  int two_d_int[2][3] =
      {
          {6, 4, 3}, // row 1
          {7, 2, 8}  // row 2
      };
  // Mảng 2 chiều các chuỗi ký tự:
  char two_d_str[4][10] = {"Blue", "Red", "Orange", "Yellow"};

  cout << two_d_str[1][1] << endl; //e
  cout << two_d_int[1][2] << endl; //8

  return 0;
}

Ở ví dụ trên, 2 biến two_d_inttwo_d_str là 2 mảng 2 chiều trong C++, two_d_int có kiểu dữ liệu int chứa các số, two_d_str có kiểu dữ liệu char chứa các ký tự. Bản thân kiểu string (chuỗi) trong C++ là một dạng mảng các ký tự, vì thế two_d_str có thể được khai báo như trên.

Thao tác nhập xuất mảng 2 chiều trong C++

Thao tác nhập xuất mảng 2 chiều trong C++ được xử lý thông qua các chỉ số hàng và cột. Lưu ý rằng khi truy cập một phần tử của mảng thì luôn phải đảm bảo chỉ số đó là hợp lệ trong phạm vi của mảng. Cú pháp xử lý nhập xuất như sau:

Lấy giá trị của phần tử trong mảng:

arrayName[i][j]

Gán giá trị cho phần tử trong mảng:

arrayName[i][j] = value;

Trong đó:

  • Chỉ số i: chỉ số hàng thứ i trong mảng, i < row_size
  • Chỉ số j: chỉ số cột thứ j trong mảng, j < col_size

Ví dụ:

#include <iostream>
using namespace std;
int main()
{
  // Mảng 2 chiều các số
  int two_d_int[2][3] =
      {
          {6, 4, 3}, // row 1
          {7, 2, 8}  // row 2
      };
  // Truy cập phần tử dòng thứ 2, cột thứ 2 của mảng
  cout << two_d_int[1][1] << endl; // 2

  // Gán giá trị phần tử dòng thứ 1, cột thứ 3 của mảng = 100
  two_d_int[0][2] = 100;
  // In lại để kiểm tra
  cout << two_d_int[0][2] << endl; // 100

  return 0;
}

  IDE C++ là gì? Tiêu chí lựa chọn IDE cho lập trình C++

  Toán tử trong C++ và thứ tự ưu tiên thực hiện

Ví dụ và bài tập thực hành mảng 2 chiều trong C++

Dữ liệu trong mảng 2 chiều được lưu trữ theo hàng và cột, vì thế không dễ để có thể hình dung và làm việc với các phần tử trong mảng. Chúng ta cùng thử giải quyết một số bài tập thực hành cơ bản khi thao tác với mảng 2 chiều trong C++ dưới đây nhé:

Bài toán 1: Liệt kê các phần tử trong mảng

Với C++, bạn không thể sử dụng lệnh in ra màn hình trực tiếp tất cả các phần tử trong mảng thông qua biến mà thông thường sẽ dùng cách duyệt bằng vòng lặp.

#include <iostream>
using namespace std;

int main()
{
  // Mảng 2 chiều các số
  int two_d_int[2][3] =
      {
          {6, 4, 3}, // row 1
          {7, 2, 8}  // row 2
      };
  // Vòng lặp in ra tất cả phần tử của mảng
  cout << "Mang vua nhap :n";
  for (int i = 0; i < 2; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      cout << two_d_int[i][j] << " ";
    }
    cout << endl;
  }

  // Mang vua nhap :
  // 6 4 3
  // 7 2 8

  return 0;
}

Từ việc sử dụng vòng lặp for để duyệt qua tất cả các phần tử trong mảng, chúng ta sẽ giải quyết được bài toán liệt kê các phần tử theo điều kiện nhất định. Thủ tục duyệt toàn bộ phần tử trong mảng sẽ còn được áp dụng để giải quyết 2 bài toán tiếp theo dưới đây.

Xem thêm việc làm C++ hấp dẫn trên TopDev

Bài toán 2: Hoán vị hàng và cột

Yêu cầu của đề bài là hoán vị các phần tử trong mảng theo hàng và cột, tức là nếu phần tử ở hàng 3 cột 2 sẽ trở thành phần tử hàng 2 cột 3 trong mảng 2 chiều kết quả. Để giải quyết bài toán này, chúng ta cũng thực hiện duyệt qua tất cả phần tử trong mảng và gán giá trị phần tử cho mảng mới.

#include <iostream>
using namespace std;

int main()
{
  // Mảng đầu vào
  int input_two_d_int[4][4] = {
    {3, 1, 0, 7},
    {2, 5, 10, 3},
    {3, 7, 4, 1},
    {10, 2, 0, 3}
  };

  //Mảng đầu ra
  int output_two_d_int[4][4];

  // Thực hiện hoán vị
  for (int i = 0; i < 4; i++)
  {
    for (int j = 0; j < 4; j++)
    {
        output_two_d_int[j][i] = input_two_d_int[i][j];
    }
  }

  // In mảng đầu ra
  cout << "Mang hoan vi :n";
  for (int i = 0; i < 4; i++)
  {
    for (int j = 0; j < 4; j++)
    {
      cout << output_two_d_int[i][j] << " ";
    }
    cout << endl;
  }

  // Mang hoan vi :
  // 3 2 3 10 
  // 1 5 7 2 
  // 0 10 4 0 
  // 7 3 1 3

  return 0;
}

Bài toán 3: Sắp xếp theo hàng

Để thực hiện việc sắp xếp mảng 2 chiều theo hàng, chúng ta đưa bài toán về thành sắp xếp các phần tử từng hàng; điều tương tự nếu muốn sắp xếp theo cột và chỉ cần thay cách duyệt mảng. Trường hợp muốn sắp xếp toàn bộ phần tử trong mảng, chúng ta có thể đơn giản biến đổi mảng 2 chiều về thành 1 chiều và thực hiện sắp xếp.

#include <iostream>
#include <bits/stdc++.h>

using namespace std;
int main()
{
  // Mảng đầu vào
  int two_d_int[4][4] = {
    {3, 1, 0, 7},
    {2, 5, 10, 3},
    {3, 7, 4, 1},
    {10, 2, 0, 3}
  };

  // Thực hiện sắp xếp theo hàng
  for (int i = 0; i < 4; i++)
    sort(two_d_int[i], two_d_int[i] + 4);

  // In mảng đã sắp xếp
  cout << "Mang sap xep :n";
  for (int i = 0; i < 4; i++)
  {
    for (int j = 0; j < 4; j++)
    {
      cout << two_d_int[i][j] << " ";
    }
    cout << endl;
  }

  // Mang Mang sap xep :
  // 0 1 3 7 
  // 2 3 5 10 
  // 1 3 4 7 
  // 0 2 3 10

  return 0;
}

Kết luận

Qua bài viết này, hy vọng các bạn đã củng cố được thêm kiến thức về mảng 2 chiều trong C++ và có thể áp dụng nó để giải quyết được các bài toán thực tế. Từ mảng 2 chiều, chúng ta có thể dễ dàng mở rộng ra thành mảng nhiều chiều với các thao tác xử lý tương tự. Cảm ơn các bạn đã đọc bài và hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Xem ngay tin đăng tuyển lập trình viên đãi ngộ tốt trên TopDev