C++: Bài 21. Mảng (Array) hai chiều
Giải phóng thời gian, khai phóng năng lực
Tổng quan
Chúng ta đã biết mảng một chiều là mảng chỉ có một chỉ số. Ngôn ngữ C++ cho phép ta có thể tạo mảng có nhiều hơn một chiều, mảng như vậy gọi là mảng đa chiều. Mảng đa chiều giúp ta dễ dàng trình bày các đối tượng đa chiều, chẳng hạn một đồ thị dạng phẳng với các hàng và cột, hay tọa độ màn hình của máy tính hoặc tọa độ của của một nhân vật trong không gian ba chiều. Mảng đa chiều được khai báo giống như mảng một chiều, ngoại trừ có thêm một hoặc nhiều cặp ngoặc vuông []. Cú pháp tổng quát để khai báo một mảng đa chiều như sau:
, trong đó, d1, d2, ..., dN là các chỉ số ứng với từng chiều.
Trong các loại mảng đa chiều thì mảng hai chiều là đơn giản và hay được sử dụng nhất. Một mảng hai chiều hay còn gọi là mảng phẳng có thể xem như là một mảng của các 'mảng một chiều'. Một mảng hai chiều đặc trưng như bảng lịch trình của máy bay, xe lửa, bảng dữ liệu với các hàng và cột. Mảng hai chiều có hai chỉ số tương ứng là chỉ số hàng và chỉ số cột. Lúc này, một phần tử của mảng sẽ tương ứng là một biến và được xác định khi biết chỉ số hàng và chỉ số cột của nó.
Ví dụ, nếu bạn muốn khai báo một mảng có tên là toado (tọa độ) gồm 4 hàng và 3 cột và có kiểu int chẳng hạn, thì bạn làm như sau:
int toado[4][3];
Khai báo trên sẽ cho ta mảng toado bao gồm 4 x 3 = 12 phần tử, và ta có thể biểu diễn các phần tử này như sau:
toado[0][0] toado[0][1] toado[0][2]
toado[1][0] toado[1][1] toado[1][2]
toado[2][0] toado[2][1] toado[2][2]
toado[3][0] toado[3][1] toado[3][2]
Ở đây bạn thấy rằng chỉ số hàng bắt đầu từ 0 đến 3, còn chỉ số cột bắt đầu từ 0 đến 2. Phần tử thứ 8 của mảng toado là phần tử có chỉ số hàng là 2 và chỉ số cột là 1, tức là toado[2][1].
Khởi tạo mảng hai chiều
Ta có thể khai báo mảng hai chiều đồng thời khởi tạo giá trị cho các phần tử của mảng ngay tại câu lệnh khai báo. Giả sử bạn muốn khai báo đồng thời khởi tạo giá trị cho mảng toado ở trên thì bạn có thể làm như sau:
int toado[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12};
Kết quả là mỗi phần tử của mảng toado sẽ nhận được một giá trị cụ thể như sau:
Ta cũng có thể khởi tạo giá trị cho các phần tử mảng bằng cách sử dụng cặp ngoặc xoắn ({}) để khởi tạo giá trị cho các phần tử trên từng hàng. Ví dụ:
int toado[4][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} };
Còn đây là cách khởi tạo đơn giản nhất, với cách này thì tất cả các phần tử của mảng hai chiều đều nhận cùng một giá trị:
int toado[4][3] = {0}; //các phần tử mảng đều được khởi tạo giá trị ban đầu là 0
Ví dụ áp dụng sau đây sẽ viết chương trình tính tổng và tích các phần tử trong mảng số thực a[3][2] (3 hàng, 2 cột), trong đó các phần tử của mảng được khởi tạo giá trị ban đầu là 0. Chương trình được viết như sau:
#include<iostream> using namespace std; main() { float a[3][2] = {0}; double addition=0, multiple=1; cout<<"Nhap lieu cho mang:"<<endl; for(int i=0; i<3; i++){ //lấy số hàng for(int j=0; j<2; j++) { //lấy số cột cout<<"a["<<i<<"]["<<j<<"] = "; cin>>a[i][j]; //nhập liệu cho từng phần tử mảng hai chiều } } //Tính tổng cout<<"Addition: "; for(int i=0; i<3;i++){ for(int j=0; j<2;j++){ addition += a[i][j]; } } cout<<addition<<endl; //Tính tích cout<<"Multiple: "; for(int i=0; i<3; i++){ for(int j=0; j<2; j++){ multiple *= a[i][j]; } } cout<<multiple; return 0; }
Một kết quả về việc thực thi chương trình trên như sau:
Truyền tham số mảng 2 chiều cho hàm
Giả sử ta có mảng 2 chiều a có kiểu float gồm M hàng và N cột (float a[M][N];), và ta muốn viết một chương trình dùng để tính tổng các phần tử của mảng, trong đó sử dụng hàm tinhtong() để tính, thì khi đó ta phải truyền mảng a cho hàm tinhtong(). Khi đó mảng a sẽ được truyền như sau:
tinhTong(a); //Chứ không phải là tinhTong(a[M][N]);
, tức là ta chỉ cần truyền tên của mảng mà không cần có kích thước hàng hay kích thước cột.
Và ở phần định nghĩa (và cả ở phần khai báo nếu có khai báo) hàm tinhtong() ta sẽ viết như sau:
void tinhTong(float a[][N]) { //Thân hàm }
, tức là trong phần khai báo biến cho hàm tinhtong() lúc này ta sẽ khai báo một mảng hai chiều trong đó không cần khai báo kích thước hàng, mà chỉ cần khai bao kích thước cột mà thôi. Ví dụ sau đây yêu cầu phải viết chương trình dưới dạng các hàm, bao gồm:
- Hàm nhập dữ liệu cho mảng.
- Hàm tính tổng các phần tử của mảng.
- Hàm tính tích các phần tử của mảng.
Chương trình được viết như sau:
#include<iostream> using namespace std; void nhap(float a[][2]) { //hàm nhập các phần tử cho mảng int i, j; cout<<"Nhap cac phan tu cho mang:"<<endl; for(i=0; i<3; i++){ for(j=0; j<2; j++){ cout<<"a["<<i<<"]["<<j<<"] = "; cin>>a[i][j]; } } } void tinhTong(float a[][2]) { //hàm tính tổng của các phần tử của mảng float tong=0.0; int i, j; cout<<"Tong cua cac phan tu cua mang la: "; for(i=0; i<3; i++){ for(j=0; j<2; j++){ tong += a[i][j]; } } cout<<tong<<endl; } void tinhTich(float a[][2]) { //hàm tính tích của các phần tử của mảng float tich=1.0; int i, j; cout<<"Tich cua cac phan tu cua mang la: "; for(i=0;i<3;i++){ for(j=0; j<2; j++){ tich *= a[i][j]; } } cout<<tich; } main() { float a[3][2]; nhap(a); tinhTong(a); tinhTich(a); return 0; }
Giải phóng thời gian, khai phóng năng lực