Mảng (Arrays) là một trong những cấu trúc dữ liệu cơ bản trong ngành công nghệ thông tin nói chung hay lập trình nói riêng. Cùng với sự phổ biến của nó thì việc Xử lý mảng cũng là một công việc thường xuyên phải gặp của các lập trình viên. Đến với bài viết ngày hôm nay, chúng ta sẽ cùng nhau tìm hiểu về Xử lý mảng trong C++.

1. Vậy mảng (arrays) trong C++ là gì?

Mảng (trong C/C++) một tập hợp tuần tự các phần tử có cùng kiểu dữ liệu được lưu trữ liên tục trong một dãy ô nhớ trên bộ nhớ RAM. Với mỗi phần tử của mảng được đánh vị trí bằng các chỉ số dạng Array[N] : mảng sẽ có kích thước N và được đánh số từ 0 tới N -1.

Array in C++

Chúng ta cần mảng để làm gì?

Ví dụ: Giả sử ta cần xây dựng một phần mềm lưu trữ điểm và tính tổng cho học sinh trong một tập hợp nhất định (1 lớp, 1 ngành, 1 trường…)

  • Đối tượng điểm học sinh: int student1
  • Một lớp học có 60 học sinh: int studen1, student2,….., student60
  • Một trường học có 10000 học sinh: int studen1, student2,….., student10000

Ví dụ với phương pháp cơ bản nhất, nhập và tính tổng 10 học sinh rồi in ra màn hình:

#include <iostream>

using namespace std;

int main() {
    int student0, student1, student2, student3, student4, student5, student6, student7, student8, student9;
    cin >> student0 >> student1 >> student2 >> student3 >> student4 >> student5 >> student6 >> student7 >> student8 >> student9;
    int sum = student0 + student1 + student2 + student3 + student4 + student5 + student6 + student7 + student8 + student9;
    cout << sum;
    return 0;
}

Với 1 ví dụ 10 học sinh trên, chúng ta thấy code được viết rất dài dòng và rất dễ bị thiếu phần tử (học sinh) trong trường hợp số lượng học sinh lớn.

Từ những khó khăn trên, ta có mảng để giải quyết:

// Khởi tạo một mảng 1000 phần tử
    int students[1000];

Vậy khi có mảng, chúng ta xử lý và thao tác như thế nào? Chúng mình cùng tiếp tục theo dõi các phần tiếp sau đây.

2. Khai báo và khởi tạo mảng trong C++

Cú pháp trong C++ cho mảng một chiều:

<Kiểu dữ liệu> <Tên biến của mảng> [<Số lượng phần tử>]

Chú ý:

  • [<Số lượng phần tử>] Phải là một hằng số, số cụ thể.
  • Một mảng được đánh số liên tự từ 0 cho tới <Số lượng phần tử> trừ đi 1.
  • Tổng bộ nhớ sử dụng bằng: <Số lượng phần tử> * sizeof(<kiểu dữ liệu>) Ví dụ: khai báo mảng không chứa giá trị int arr[5]; mỗi biến int trong C++ là 4 bytes, vậy cần 20 bytes cho mảng arr.

Với khai báo mảng không có giá trị như trên thì các giá trị trong mảng arr[5] sẽ là các giá trị rác.

Khai báo mảng có giá trị truyền vào:

int arr[5] = {1, 2, 3, 4, 5};

Số lượng các phần tử trong ngoặc kép {} không được phép lớn hơn số lượng phần tử đã khai báo trong ngoặc vuông [].

Nếu bạn lỡ quên kích cỡ mảng thì nó sẽ tự khởi tạo mảng đó cho phù hợp

int arr[] = {1, 2, 3}; // Mảng gồm 3 phần tử 1, 2, 3

Khi không điền đủ số phần tử thì các phần tử còn lại sẽ được xác định là 0

int arr[5] = {1, 2, 3};  	// Giá trị của mảng sẽ là 1, 2, 3, 0, 0
int arr[4] = {};	 // 0, 0, 0, 0

3. Sử dụng các phần tử trong mảng một chiều

Truy cập giá trị:<Tên Mảng> [<Vị trí cần truy cập>]

Gán giá trị: <Tên Mảng> [<Vị trí cần truy cập>] = <Giá trị cần nhập>

Ví dụ một chương trình dử dụng mảng:

#include <iostream>
#include <string>
using namespace std;
// định nghĩa số phần tử của mảng
#define MAX 8

int main() {
    // Khởi tạo mảng với 8 phần tử "S, t, r, i, n, g, E, e"
    char arr[MAX] = {'S', 't', 'r', 'i', 'n', 'g', 'E', 'e'};
    // Thay đổi giá trị vị trí số 6 trong mảng
    arr[6] = 'e';
    // xuất mảng
    for (int i = 0; i < MAX; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

Sau khi chạy ta sẽ có kết quả in ra màn hình: Stringee

Chú ý: Cần truy cập giá trị trong phạm vi của mảng và đúng loại dữ liệu, nếu truy cập sai sẽ gây lỗi chương trình.

string arr[3];
arr[-1] = "StringEE"; // Vị trí mảng bị âm
arr[3] = "Call APIs"; // vượt quá mảng
arr[3] = 1,32; // Sai kiểu dữ liệu

Bạn có thể chạy trương trình sau và kiểm nghiệm:

#include <iostream>
using namespace std;

int main() {

    char str[8] = {'S', 't', 'r', 'i', 'n', 'g', 'E', 'E'};
    
    int pos;
    while (true) {
        cout << "Chon vi tri can in: " << endl;
        // Nhập vào giá trị vị trí position cần hiển thị 
        cin >> pos;
        // In ra giá trị tại vị trí đó
        cout << "Gia tri ban chon la: " << str[pos] << endl;
    }
    return 0;
}
  • Ví dụ một số trường hợp có giá trị:
int a = 1;
int b;
int foo[5] = {0, 1, 2, 3, 4}
        
foo[0] = a; // foo[0] = 1
foo[a] = 2; // foo[0] = 2
b = foo [a+2]; // b = foo[3] = 3
foo[foo[a]] = foo[2] + 5; // foo[2] = 2 + 5 = 7

4. Mảng đa chiều trong C++

Multidimensional Array in C++

Tương tự như mảng một chiều thì mảng đa chiều cũng bao gồm nhiều phần tử được xếp liền kề nhau trên bộ nhớ RAM, tuy nhiên thì chúng được tác ra gồm nhiều mảng một chiều khác nhau tạo ra mảng 2 chiều, nhiều mảng 2 chiều gộp lại thành mảng 3 chiều … do tính chất phức tạp trong việc xử lý cùng với yêu cầu bộ nhớ cao thì ở chúng ta sẽ chỉ tìm hiểu tới mảng 2 chiều, từ đó nếu cần thiết ta có thể liên hệ sang mảng 3, 4 … chiều tùy thuộc vào mục đích.

Cú pháp khởi tạo:

<Kiểu dữ liệu> <Tên Mảng> [<Số lượng mảng 1>][<Số lượng mảng 2>]…[<Số lượng mảng N>]

Ví dụ:

int stringEE[1][2][3][4];

Khởi tạo giá trị cho mảng 2 chiều:

int a[4][4] = {
    {0, 1, 2, 3},
    {4, 5, 6, 7},
    {8, 9, 10, 11},
    {12, 13, 14, 15}
}

Hoặc cũng có thể khởi tạo như sau:

int a[4][4] = {
    0, 1, 2, 3,
    4, 5, 6, 7,
    8, 9, 10, 11,
    12, 13, 14, 15
};

Chú ý: Như bạn thấy thì chỉ với mảng 2 chiều 4x4 đã có tới 16 phần tử. Nếu mảng 3 chiều 100x100x100 sẽ là 1.000.000 phần tử. Chúng tăng theo cấp số nhân và sẽ tăng số lượng rất lớn, ảnh hưởng tới bộ nhớ sử dụng có thể dẫn tới chết chương trình, trương trình không phản hồi. Cần chú ý khi khởi tạo.

Ví dụ truy cập mảng 2 chiều:

#include <iostream>

using namespace std;
int main() {
    int arr_2D[3][3] = {{2, -5, 2}, // 2, -5, 2
        {4, 0},                    // 4, 0, 0
        {}};                       // 0, 0, 0
    // sử dụng vòng for lồng nhau để truy cập từng phần tử
    for (int i = 0; i < 3; i ++) {
        // truy cập các cột của mảng
        for (int j = 0; j < 3; i++) {
            cout << " arr_2D[" << i << "][" << j << "] = " << arr_2D[i][j] << endl;
        }
    }
    // khởi tạo index hàng cột
    int row, col;
    cout << "Nhap vi tri mang 2 chieu: ";
    cin >> row >> col;
    cout << "Thay doi gia tri: ";
    cin >> arr_2D[row][col];
    cout << "Mang 2 chieu sau khi thay doi:" << endl;
    // Xem lại kết quả
    for (int i = 0; i < 3; i ++) {
        for (int j = 0; j < 3; i++) {
            cout << " arr_2D[" << i << "][" << j << "] = " << arr_2D[i][j] << endl;
        }
    }        
    return 0;
}

Như ta có thể thấy thì khai báo mảng đa chiều cũng tương tự như mảng một chiều, vì vậy bạn có thể thực hiện các thao tác trên mảng nhiều chiều giống như một chiều. Các chú ý và yêu cầu cũng giống, chỉ thay bằng việc bạn có thêm tham số truyền vào để chọn giá trị của phần tử trong mảng tùy vào bài toán mà bạn gặp phải. Một số bài toán về mảng 2 chiều bạn có thể nghĩ tới như Xử lý, đọc ghi ảnh, Tính toán với ma trận, Notepad, cờ caro …

Kết bài

Thông qua bài học hôm nay, bạn đã hiểu được thế nào là mảng, cách xử lý mảng trong C++ cùng với khái niệm mảng đa chiều. Nó cực kì hữu dụng trong các công việc xử lý tính toán số trên máy tính mà bất cứ lập trình viên nào đều cần phải hiểu và thông thạo. Đây là nền tảng cơ bản để có thể giúp bạn xây dựng và tìm hiểu về những dạng dữ liệu danh sách tiên tiến hơn sau này. Cảm ơn bạn đã theo dõi hết bài viết.

Stringee API cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng (CSKH) có thể được nhúng trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Điều này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp, trong khi nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Quý doanh nghiệp quan tâm xin mời đăng ký nhận tư vấn tại đây: