C++: Bài 21. Mảng (Array) hai chiều


Đăng ký nhận thông báo về những video mới nhất

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:

lớp_lưu_trữ kiểu_dữ_liệu tên_mảng[d1][d2]...[dN];

, 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:

toado[0][0] = 1    toado[0][1] = 2   toado[0][2] = 3
toado[1][0] = 4    toado[1][1] = 5   toado[1][2] = 6
toado[2][0] = 7    toado[2][1] = 8   toado[2][2] = 9
toado[3][0] = 10  toado[3][1] = 11  toado[3][2] = 12

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 phn t mng đu được khi to 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++){ //ly s hàng
    for(int j=0; j<2; j++) { //ly s ct
      cout<<"a["<<i<<"]["<<j<<"] = ";
      cin>>a[i][j]; //nhp liu cho tng phn t mng hai chiu
    }
  }
  //Tính tng
  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 phi 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 nhp các phn t cho mng
  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 tng ca các phn t ca mng
  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 ca các phn t ca mng
  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;
}

Nếu bạn có điều thắc mắc, bạn hãy comment cho V1Study để được giải đáp.
Bài viết này được chia sẻ bởi LongDT. Nếu bạn muốn chia sẻ bài viết, bạn hãy Đăng ký làm thành viên!
« Prev
Next »
Copied !!!