Mảng Hai Chiều – Mảng Đa Chiều Trong C++

Các phần tử trong mảng hai chiều trong Lập trình C ++

Xuất các phần tử mảng 2 chiều

Để truy xuất giá trị của phần tử trong mảng, ta sử dụng cú pháp:

<tên biến mảng>[<chỉ số dòng thứ x>][<chỉ số cột thứ y>];

Ví dụ: Cho mảng như sau:

int a[2][3] // 2 dòng, 3 cột​

Các truy xuất:

  • Hợp lệ:

     

    a[0][0], a[0][1], …, a[1][1], a[1][2]

  • Không hợp lệ:

     

    a[-1][0], a[0][-1], a[2][3], … => cho kết quả không như mong muốn (có thể gây chết chương trình).

Chú ý: khi truy xuất một phần tử mảng, luôn đảm bảo chỉ số của phần tử đó là hợp lệ trong phạm vi của mảng.

1.Nhập và xuất mảng 2 chiều

Bên dưới là ví dụ về nhập, xuất dữ liệu cho mảng:

#include <iostream>
#include <cstdlib> // for srand() and rand()
#include <ctime> // for time()
using namespace std;

// định nghĩa số phần tử mảng
#define ROW 100
#define COL 100

// khai báo prototype
void nhapMang(int mt[][COL], int &m, int &n);
void xuatMang(int mt[][COL], int m, int n);

int main()
{
	int mt[ROW][COL]; // mảng myArray có MAX phần tử
	int nRow, nCol; // số phần tử dòng và cột được sử dụng

	// nhập xuất mảng tự động
	nhapMang(mt, nRow, nCol);
	xuatMang(mt, nRow, nCol);

	return 0;
}

// hàm nhập mảng
void nhapMang(int mt[][COL], int &m, int &n)
{
	// khởi tạo số ngẫu nhiên
	srand(time(NULL));

	cout << "Nhap so dong : ";
	cin >> m;
	cout << "Nhap so cot : ";
	cin >> n;

	// khởi tạo mảng ngẫu nhiên từ [0][0] đến [m-1][n-1].
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			mt[i][j] = rand() % 100;
		}
	}
}

// hàm xuất mảng
void xuatMang(int mt[][COL], int m, int n)
{
	// xuất từng phần tử cho mảng
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << mt[i][j] << "\t";
		}
		cout << endl;
	}
}

Output:

Nhap so dong : 2
Nhap so cot : 3
61	63	46	
37	92	40	

2.Tính tổng các phần tử trong mảng

Yêu cầu: cho trước ma trận mt, kích thước mxn. Tính tổng các phần tử trên dòng d, cột c.

Ý tưởng: duyệt ma trận và cộng dồn các phần tử có tọa độ (dòng, cột) thỏa yêu cầu.

#include <iostream>
#include <cstdlib> // for srand() and rand()
#include <ctime> // for time()
using namespace std;

// định nghĩa số phần tử mảng
#define ROW 100
#define COL 100

// khai báo prototype
void nhapMang(int mt[][COL], int &m, int &n);
void xuatMang(int mt[][COL], int m, int n);
int tongDong(int mt[][COL], int n, int d);
int tongCot(int mt[][COL], int m, int c);


int main()
{
	int mt[ROW][COL]; // mảng myArray có MAX phần tử
	int nRow, nCol; // số phần tử dòng và cột được sử dụng

	// nhập xuất mảng tự động
	nhapMang(mt, nRow, nCol);
	xuatMang(mt, nRow, nCol);

	// tính tổng dòng d, cột c
	int d;
	cout << "Nhap dong can tinh tong: ";
	cin >> d;
	cout << "Tong dong: " << tongDong(mt, nCol, d) << endl;

	// tính tổng cột c
	int c;
	cout << "Nhap dong can tinh tong: ";
	cin >> c;
	cout << "Tong dong: " << tongCot(mt, nRow, c) << endl;

	return 0;
}

// hàm nhập mảng
void nhapMang(int mt[][COL], int &m, int &n)
{
	// khởi tạo số ngẫu nhiên
	srand(time(NULL));

	cout << "Nhap so dong : ";
	cin >> m;
	cout << "Nhap so cot : ";
	cin >> n;

	// khởi tạo mảng ngẫu nhiên từ [0][0] đến [m-1][n-1].
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			mt[i][j] = rand() % 100;
		}
	}
}

// hàm xuất mảng
void xuatMang(int mt[][COL], int m, int n)
{
	// xuất từng phần tử cho mảng
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << mt[i][j] << "\t";
		}
		cout << endl;
	}
}

// tính tổng trên dòng d
int tongDong(int mt[][COL], int n, int d)
{
	int sum(0);
	for (int j = 0; j < n; j++) // Duyệt các cột
		sum += mt[d][j];

	return sum;
}

// tính tổng trên cột c
int tongCot(int mt[][COL], int m, int c)
{
	int sum(0);
	for (int i = 0; i < m; i++) // Duyệt các dòng
		sum += mt[i][c];

	return sum;
}

Ouput 

Nhap so dong : 2
Nhap so cot : 3
83	40	14	
47	22	65	
Nhap dong can tinh tong: 1
Tong dong: 134
Nhap dong can tinh tong: 2
Tong dong: 79

3.Tìm giá trị lớn nhất của mảng 2 chiều

Yêu cầu: Cho trước ma trận mt, kích thước mxn. Tìm giá trị lớn nhất trong ma trận mt (gọi là max)

Ý tưởng:

  • Giả sử giá trị

     

    max

     

    hiện tại là giá trị phần tử đầu tiên

     

    mt[0][0]

  • Lần lượt kiểm tra các phần tử còn lại để cập nhật

     

    max.

#include <iostream>
#include <cstdlib> // for srand() and rand()
#include <ctime> // for time()
using namespace std;

// định nghĩa số phần tử mảng
#define ROW 100
#define COL 100

// khai báo prototype
void nhapMang(int mt[][COL], int &m, int &n);
void xuatMang(int mt[][COL], int m, int n);
int timMax(int mt[][COL], int m, int n);

int main()
{
	int mt[ROW][COL]; // mảng myArray có MAX phần tử
	int nRow, nCol; // số phần tử dòng và cột được sử dụng

	// nhập xuất mảng tự động
	nhapMang(mt, nRow, nCol);
	xuatMang(mt, nRow, nCol);

	// tìm max
	int max = timMax(mt, nRow, nCol);
	cout << "Max = " << max << endl;

	return 0;
}

// hàm nhập mảng
void nhapMang(int mt[][COL], int &m, int &n)
{
	// khởi tạo số ngẫu nhiên
	srand(time(NULL));

	cout << "Nhap so dong : ";
	cin >> m;
	cout << "Nhap so cot : ";
	cin >> n;

	// khởi tạo mảng ngẫu nhiên từ [0][0] đến [m-1][n-1].
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			mt[i][j] = rand() % 100;
		}
	}
}

// hàm xuất mảng
void xuatMang(int mt[][COL], int m, int n)
{
	// xuất từng phần tử cho mảng
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << mt[i][j] << "\t";
		}
		cout << endl;
	}
}

// tìm giá trị max của mảng 2 chiều
int timMax(int mt[][COL], int m, int n)
{
	int i, j, max;
	max = mt[0][0];
	for (i = 0; i < m; i++)
		for (j = 0; j < n; j++)
			if (mt[i][j] > max)
				max = mt[i][j];
	return max;
}

Ouput:

Nhap so dong : 2
Nhap so cot : 3
25	37	41	
95	53	53	
Max = 95
 

Thao tác với mảng đa chiều

1. Mảng đa chiều hoạt động như thế nào?