Chuyển tới nội dung

Mảng hai chiều C/C++ | Ma trận số nguyên

ma tran trong c

Mảng hai chiều trong C/C++, cách khai báo nhập xuất ma trận số nguyên C++. Bài viết tổng hợp một số nội dung kiến thức, cách xử lý xung quanh mảng đa chiều C/C++.

1. Mảng hai chiều là gì?

Mảng hai chiều trong C/C++ cũng như trong các ngôn ngữ lập trình khác là một cấu trúc điển hình của mảng đa chiều. Mảng đa chiều chủ yếu được thể hiện dưới dạng mảng hai chiều. Nếu như mảng một chiều bạn chỉ có thể tương tác với các phần tử với một thông số vị trí (một chiều) thì mảng hai chiều sẽ có hai thông số vị trí (2 chiều ngang dọc).

Mảng hai chiều còn được gọi là ma trận, ứng dụng của ma trận trong thực tế thực sự rất nhiều. Bạn có thể thấy ở các bài toán tìm đường đi, xử lý xâu, các bài toán quy hoạch động hay lưu trữ dữ liệu phức tạp . . . Thông thường các bài toán lập trình phức tạp đều sử dụng tới ma trận.

Mảng hai chiều sẽ có hai thông số quan trọng đó là chiều ngang và chiều dọc, tức là số hàng và số cột. Đương nhiên mảng hai chiều sẽ không cần kích thước số hàng và số cột bằng nhau. Ví dụ có thể có các mảng 3×8, 10×2 . . .

Khi truy cập dữ liệu trong mảng hai chiều bạn cần phải chú ý đến thông số về vị trí của mảng. Mảng sẽ bắt đầu từ vị trí arr[0][0] giống với mảng một chiều. Nhớ kĩ câu thần chú “hàng trước, cột sau” khi thực hiện khai báo và truy cập dữ liệu nhé!.

Để dễ hình dung, mảng hai chiều sẽ có cấu trúc tương tự với các ô trong một bảng excel. Hai chiều ở đây chính là chiều ngang và chiều dọc. Hình dưới đây là một ví dụ về mảng 2 chiều kiểu số nguyên arr 4 x 4 phần tử.

mang hai chieu c
Ma trận số nguyên 4 x 4 arr[4][4]

Trong ma trận trên:
arr[1][1] = 5
arr[0][1] = 8
arr[1][3] = 11
arr[3][1] = 1

2. Khai báo mảng hai chiều C/C++

Cách khai bảo mảng hai chiều trong C/C++ khá giống với mảng một chiều. Bạn hãy nhớ kĩ câu nói hàng trước cột sau, thông thường ta hay gọi hai biến hàng cột là n, m. Như vậy mảng khai báo sẽ có dạng n x m.

Cú pháp khai báo như sau:

<kiểu dữ liệu> + tên mảng [<số hàng>][<số cột>];

Chú ý: Cú pháp đúng với cả trong C và C++ nhé!

Ta thường tương tác mảng với các số nguyên nhưng không dừng lại ở đó, bạn hoàn toàn có thể sử dụng mảng đề lưu trữ bất kì kiểu dữ liệu nào khác nhé. Ví dụ như string, double hay một đối tượng tự định nghĩa.

Ví dụ khai báo mảng hai chiều ma trận số nguyên dạng arr 4 x 4: int arr[4][4];

Ví dụ khai báo mảng kiểu char 5×2: char c[5][2];

3. Thao tác với mảng hai chiều

Vì mảng có hai chiều nên khi duyệt mảng ta phải duyệt bằng hai vòng lặp, một vòng lặp số hàng, vòng lặp thứ 2 là số cột. Thông thường ta sẽ duyệt theo chiều ngang vì thế sẽ là vòng lặp hàng trước, vòng lặp cột sau.

Cách thao tác, nhập xuất trong C/C++ khá giống với nhập xuất mảng hai chiều trong Java.

Chú ý: Ở phần dưới mình sẽ thực hiện

3.1 Nhập dữ liệu cho mảng 2 chiều

Các hàm dưới đây đều dùng để thao tác với mảng hai chiều với tham số truyền vào là tên mảng, số hàng và số cột.

Code hàm nhập dữ liệu từ bàn phím mảng hai chiều C:

// Nhap mang hai chieu C
void iparr(int arr[10][10], int n, int m){   // mảng có tối đa 10 x 10, n hàng, m cột
	printf("Nhap mang hai chieu: \n");
	for(int i =0; i<n; i++){             // Duyệt hàng
		for(int j =0; j<m; j++){
			scanf("%d", &arr[i][j]); /// Duyệt cột
		}
	}
}

Trong C++ chỉ khác chỗ lưu giữ liệu nhập từ bàn phím, ta có code như sau:

// Nhap mang hai chieu C++
void iparr(int arr[10][10], int n, int m){  // Mang arr n hàng, m cột
	cout<<"Nhap mang hai chieu: \n";
	for(int i =0; i<n; i++){            // Duyệt hàng
		for(int j =0; j<m; j++){
			cin>>arr[i][j];     // Duyệt cột
		}
	}
}

3.2 Xuất dữ liệu

Hàm xuất dữ liệu mảng hai chiều C:

// In mang hai chieu C
void printarr(int a[10][10], int n, int m){
	for(int i=0; i<n; i++){
		for(int j=0; j<m; j++){
				printf("%5d", a[i][j]);     // %5d giúp in cách nhau 1 khoảng trắng
		}
		printf("\n");                              // Hết hàng sẽ tự lùi một dòng.
	}
}

Hàm xuất dữ liệu viết bằng C++:

// In mảng hai chiều C++ ra màn hình
void printarr(int a[10][10], int n, int m){
	for(int i=0; i<n; i++){
		for(int j=0; j<m; j++){
		    cout<<a[i][j]<<"  ";
		}
		cout<<"\n";               // Dòng này để khi hết một hàng nó sẽ xuống dòng
	}
}

Chương trình nhập xuất mảng hai chiều hoàn chỉnh C++

Đề bài của mình là: Nhập và hiển thị ma trận số nguyên có kích thước n x m nhập vào từ bàn phím.

Code full bài toán viết bằng C++:
(nếu bạn code c thì chỉ cần sửa đoạn nhập và in ra màn hình là được nhé!)

#include<iostream>
using namespace std;

// Nhập mảng hai chiều C++
void iparr(int arr[10][10], int n, int m){
	cout<<"Nhap mang hai chieu: \n";
	for(int i =0; i<n; i++){
		for(int j =0; j<m; j++){
			cin>>arr[i][j];
		}
	}
}
// In mảng hai chiều C++ ra màn hình
void printarr(int a[10][10], int n, int m){
	for(int i=0; i<n; i++){
		for(int j=0; j<m; j++){
				cout<<a[i][j]<<"  ";
		}
		cout<<"\n";
	}
}

int main(){
	int a[10][10];   // Khai báo mảng hai chiều kiểu số nguyên a tối đa 10x10 phần tử
	int n;			// Số hàng
	int m;			// Số cột
	cout<<"Nhap so hang: "; cin>>n;
	cout<<"Nhap so cot: "; cin>>m;
	iparr(a, n, m);  // Gọi hàm nhập mảng
	cout<<"\nMang da nhap: "<<endl;
	printarr(a, n, m);  // Gọi hàm xuất mảng
	return 0;
}

Và đây là kết quả khi chạy chương trình trên:

nhap xuat mang hai chieu c

4. Lời kết

Một kiến thức cực kì quan trọng, không thể thiếu đối với các bạn học lập trình. Kiến thức này chủ yếu để giải quyết các bài toán, các tình huống phức tạp trong lập trình

Các bài toán ứng hai chiều hay ma trận là một dạng bài tập cực kì hay, mình có làm bài tập liên quan đến mảng hai chiều C++ trong các bài viết:

  • Tìm xâu con chung lớn nhất
  • Bài toán tìm số phép biến đổi ít nhất để xâu A thành xâu B
  • Bài toán tính tổng lớn nhất của một dãy số
  • Thuật toán Dijsktra tìm đường đi nhắn nhất từ một đỉnh tới các đỉnh

Lời cuối, mình xin gửi lời cảm ơn tới bạn vì đã đọc tới phần này của bài viết. Chúc bạn thành công nhé!

Xem thêm các bài viết về lập trình, về C++ khác của mình tại đây nhé!

2 bình luận trong “Mảng hai chiều C/C++ | Ma trận số nguyên”

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *