Xem thêm

Xử lý mảng trong C++ và những điều cần lưu ý

Huy Erick
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ử...

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 khám phá về cách xử lý mảng trong ngôn ngữ lập trình C++.

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

Mảng (trong C/C++) là 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++ (Credit: Nanado.edu.vn)

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 student1, student2,….., student60
  • Một trường học có 10000 học sinh: int student1, 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 
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 ví dụ 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:

 []

Chú ý:

  • [] phải là một hằng số, số cụ thể.
  • Mảng được đánh số liên tục từ 0 cho tới [] trừ đi 1.
  • Tổng bộ nhớ sử dụng bằng: [] * sizeof() 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ị: []
  • Gán giá trị: [] =

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

#include 
#include 
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 chương trình sau và kiểm nghiệm:

#include 
using namespace std;

int main() {
    char str[8] = {'S', 't', 'r', 'i', 'n', 'g', 'E', 'E'};
    int pos;

    while (true) {
        cout << "Chọn vị trí cần 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 << "Giá trị bạn chọn là: " << 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++ (Credit: Nanado.edu.vn)

Tương tự như mảng một chiều, 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, chúng được tạo ra bằng cách gom 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. Trong bài viết này, chúng ta chỉ tìm hiểu về mảng 2 chiều, đồng thời có thể mở rộng sang mảng 3, 4... chiều tùy thuộc vào mục đích sử dụng.

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

 [][]…[]

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 có kích thước 100x100x100, sẽ có tới 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 việc sử dụng bộ nhớ, có thể dẫn tới chết chương trình hoặc 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 
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; j++) {
            cout << "arr_2D[" << i << "][" << j << "] = " << arr_2D[i][j] << endl;
        }
    }
    // khởi tạo index hàng cột
    int row, col;
    cout << "Nhập vị trí mảng 2 chiều: ";
    cin >> row >> col;
    cout << "Thay đổi giá trị: ";
    cin >> arr_2D[row][col];
    cout << "Mảng 2 chiều sau khi thay đổi:" << endl;
    // Xem lại kết quả
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << "arr_2D[" << i << "][" << j << "] = " << arr_2D[i][j] << endl;
        }
    }
    return 0;
}

Như ta có thể thấy, khai báo mảng đa chiều tương tự như mảng một chiều. Do đó, bạn có thể thực hiện các thao tác trên mảng nhiều chiều giống như trên mảng một chiều. Nhưng có thêm tham số truyền vào để chọn giá trị của phần tử trong mảng tùy thuộc vào bài toán cụ thể. 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 ý nghĩa của mảng, cách xử lý mảng trong C++ cùng với khái niệm mảng đa chiều. Đây là kiến thức cực kỳ hữu ích trong các công việc xử lý tính toán số trên máy tính mà bất kỳ lập trình viên nào cũng cần phải hiểu và sử dụng thành thạo. Đây cũng là nền tảng cơ bản giúp bạn xây dựng và tìm hiểu về các dạng dữ liệu danh sách tiên tiến hơn trong tương lai. Cảm ơn bạn đã theo dõi bài viết này.

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:

Stringee API

1