Bài 54. Mảng 2 chiều trong C – Multi-dimensional Array

Mảng là một cấu trúc dữ liệu cơ bản và được sử dụng rất nhiều trong các bài toán lập trình. Mảng đa chiều là một cấu trúc dữ liệu mảng có nhiều vai trò quan trọng. Với mảng đa chiều, chúng ta thường chỉ sử dụng đến mảng 2 chiều(ma trận) và đôi khi sử dụng mảng 3 chiều. Bài viết này xin chia sẻ tới các bạn kiến thức về mảng đa chiều.

1. Lý thuyết về mảng đa chiều

Mảng đa chiều(TA: multi-dimensional array) là một mảng của các mảng. Mảng 2 chiều hay ma trận là mảng đa chiều thường được sử dụng nhất; Khi đó, mảng 2 chiều là một mảng của các mảng 1 chiều. Mảng 2 chiều có cách lưu trữ các phần tử giống như một bảng.

Mảng 2 chiều
Một mô phỏng về mảng 2 chiều có kích thước 3 x 5

Sau đây, bài hướng dẫn sẽ chỉ trình bày về ma trận(mảng 2 chiều). Tôi xin lưu ý, mảng 2 chiều còn được gọi với tên khác là ma trận.

Cách truy cập tới phần tử của ma trận cũng giống như với mảng 1 chiều. Tuy nhiên, chúng ta sẽ có 2 chỉ số khác nhau là chỉ số hàng và chỉ số cột. Cú pháp như sau: arr[row_index][col_index].

Mình xin 5 phút quảng cáo nha =))

2. Khai báo mảng 2 chiều

Để khai báo mảng 2 chiều, bạn phải chỉ định các tham số sau:

  • row-size: Khai báo số hàng của mảng 2 chiều
  • column-size: Khai báo số cột của mảng 2 chiều
  • Type of array: Kiểu dữ liệu của mảng 2 chiều. Việc này chỉ định kiểu dữ liệu của các phần tử trong mảng; là số nguyên, số thực, ký tự hay là kiểu dữ liệu nào đó

Cú pháp khai báo mảng 2 chiều có dạng:

Một ví dụ khai báo mảng 2 chiều trong C/C++:

3. Khởi tạo mảng 2 chiều

Giống như mảng 1 chiều, mảng 2 chiều cũng có thể khởi tạo trong quá trình khai báo hoặc khởi tạo sau khi khai báo.

Cú pháp khởi tạo mảng 2 chiều trong khi khai báo như sau:

Đây là một ví dụ khai báo và khởi tạo mảng cùng lúc trong C/C++:

Với cách khởi tạo mảng 2 chiều sau khi khai báo, sử dụng chỉ số để truy cập tới từng ô của mảng, chúng ta có cú pháp như sau:

Một ví dụ trên ngôn ngữ C/C++ với việc khởi tạo mảng 2 chiều sau khi khai báo:

Việc khai báo như thế này khá là ngây thơ và ít được sử dụng. Thay vào đó, chúng ta thường khởi tạo giá trị cho mảng 2 chiều bằng việc đọc từ stdin; Bạn có thể thấy ở phần nhập mảng 2 chiều trong mục tiếp theo.

4. Các thao tác với mảng 2 chiều

Một thao tác đơn giản nhất và hay sử dụng nhất đó là việc lặp qua tất cả các phần tử của mảng 2 chiều theo cách sau:

Đây là một ví dụ cho việc lặp qua tất cả các phần tử trong mảng và in nó ra trên ngôn ngữ C/C++:

Ngay bây giờ, chúng ta sẽ đi vào việc viết các hàm xử lý các thao tác cơ bản nhất trên mảng 2 chiều.

4.1. Thao tác nhập mảng 2 chiều

Hàm NhapMaTran nhận vào các đối số là mảng 2 chiều a, số hàng m, số cột n. Hàm này không trả về giá trị nên có kiểu là void.

Câu hỏi: Tại sao phải chỉ định kích thước cột của ma trận trong tham số hàm: a[][100] ?

Xem câu trả lời cho câu hỏi trên tại đây.

4.2. Thao tác xuất mảng 2 chiều

Hàm này tương đối giống với hàm NhapMaTran phía trên. Do vậy, mình không trình bày lại nữa.

Sau mỗi hàng chúng ta in thêm “\n” để kết quả in ra được dạng bảng.

4.3. Tìm kiếm trong mảng 2 chiều

Chú ý: pair có trong thư viện #include <utility>.Nếu tìm thấy, trả về vị trí đầu tiên tìm được, ngược lại trả về {-1, -1}.

Full source code cho các chức năng trên và lời gọi hàm trong hàm main:

5. Bài tập thực hành

Cho một mảng 2 chiều. Nhiệm vụ của bạn là đổi tất cả các hàng thành cột, tất cả các cột thành hàng(Nó chính là bài toán chuyển vị ma trận).

Input:

  • Dòng đầu tiên là 2 số N – số hàng và M – số cột của ma trận.
  • N dòng tiếp theo, mỗi dòng có M số nguyên phân tách bởi dấu cách.

Ouput:

  • In ra M dòng, mỗi dòng gồm N số nguyên

Ràng buộc:

  • 1 <= N, M <= 10
  • 0 <= A[i][j] <= 100, với 0 <= i < N, 0 <= j < M
SAMPLE INPUTSAMPLE OUTPUT
3 5
13 4 8 14 1
9 6 3 7 21
5 12 17 9 3
13 9 5
4 6 12
8 3 17
14 7 9
1 21 3

 

Lưu ý: Các bạn nộp bài tập xuống mục bình luận của bài học. Admin sẽ chữa bài và đánh giá lời giải giúp các bạn.

avatar
  Subscribe  
Notify of