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.
Sau bài học này, bạn hãy chuyển ngay tới bài viết “Bài tập mảng 2 chiều có đáp án chi tiết” để luyện tập kiến thức vừa học nhé.
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.
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].
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:
type arr[row_size][column_size]
Một ví dụ khai báo mảng 2 chiều trong C/C++:
int arr[3][5];
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:
type arr[row_size][column_size] = {{elements}, {elements} ... }
Đây là một ví dụ khai báo và khởi tạo mảng cùng lúc trong C/C++:
int arr[3][5] = {{5, 12, 17, 9, 3}, {13, 4, 8, 14, 1}, {9, 6, 3, 7, 21}};
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:
type arr[row_size][column_size] arr[i][j] = 14
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:
int arr[3][5]; arr[0][0] = 5; arr[1][3] = 14;
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:
type arr[row_size][column_size] = {{elements}, {elements} ... } for i from 0 to row_size for j from 0 to column_size print arr[i][j]
Đâ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++:
#include <iostream> int main() { // Array declaration and initialization int arr[3][5] = {{5, 12, 17, 9, 3}, {13, 4, 8, 14, 1}, {9, 6, 3, 7, 21}}; // Iterate over the array for(int i=0; i<3; i++) { for(int j=0; j<5; j++) { // Print out each element printf("%5d", arr[i][j]); } // Print new line character after the row is printed in above loop printf("n"); } return 0; }
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.
void NhapMaTran(int a[][100], int m, int n) { for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) { printf("A[%d][%d] = ", i, j); scanf("%d", &a[i][j]); } }
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.
void XuatMaTran(int a[][100], int m, int n) { for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) printf("%dt", a[i][j]); printf("n"); } }
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
Hàm này sẽ trả về một cặp gồm {chỉ số hàng, chỉ số cột} nên mình để kiểu trả về là pair<int, int>
. Ngoài các tham số giống như 2 hàm nhập & xuất, nó còn nhận thêm giá trị cần tìm kiếm v
.
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}.
std::pair<int, int> TimKiem(int a[][100], int m, int n, int v){ for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) if(a[i][j] == v) return {i, j}; } return {-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:
#include <stdio.h> #include <utility> void NhapMaTran(int a[][100], int m, int n) { for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) { printf("A[%d][%d] = ", i, j); scanf("%d", &a[i][j]); } } void XuatMaTran(int a[][100], int m, int n) { for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) printf("%dt", a[i][j]); printf("n"); } } std::pair<int, int> TimKiem(int a[][100], int m, int n, int v){ for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) if(a[i][j] == v) return {i, j}; } return {-1, -1}; } int main(){ int a[100][100]; int m,n; printf("nhap so hang n = "); scanf("%d",&n); printf("nhap so cot m = "); scanf("%d",&m); printf("nhap vao ma tran:n"); NhapMaTran(a, m , n); XuatMaTran(a, m, n); int v; printf("nNhap vao gia tri can tim: "); scanf("%d", &v); std::pair<int, int> rs = TimKiem(a, m, n, v); printf("nTim thay so %d tai hang %d, cot %d!", v, rs.first, rs.second); }
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 INPUT | SAMPLE 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.
Ngoài ra, bạn có thể làm thêm nhiều bài tập mảng 2 chiều trực tuyến tại đây nhé.
Để lại một bình luận