I. Khái niệm về mảng
Trong lập trình, chúng ta thường gặp tình huống cần làm việc với một tập hợp dữ liệu lớn gồm nhiều đối tượng có cùng kiểu dữ liệu. Ví dụ như danh sách điểm tổng kết của các học sinh trong lớp (một danh sách các số thực) hoặc danh sách tên các phòng thi (một danh sách các chuỗi kí tự).
Mỗi ngôn ngữ lập trình đều cung cấp các kiểu dữ liệu có cấu trúc để lưu trữ những tập hợp dữ liệu như trên. Trong trường hợp của ngôn ngữ C++, các cấu trúc dữ liệu phổ biến như mảng (array), mảng động (dynamic array) và danh sách liên kết (linked list) được sử dụng.
II. Khai báo và khởi tạo mảng một chiều như thế nào?
1. Khai báo mảng một chiều
Để khai báo một mảng trong C++, ta sử dụng cú pháp:
Trong trường hợp đó, {Kiểu_phần_tử} được xác định là một kiểu dữ liệu nguyên thủy hoặc một kiểu do người dùng định nghĩa, đại diện cho loại dữ liệu của các phần tử trong mảng. {Tên_mảng} là một cái tên được người dùng đặt và không trùng với từ khóa của hệ thống. {Kích_thước_mảng} là một số nguyên, biểu thị kích thước mà mảng sẽ được tạo ra. Giả sử kích thước được khởi tạo là N, thì hệ thống sẽ cấp phát liên tiếp N ô nhớ trong bộ nhớ để lưu trữ mảng.
Ví dụ: Khai báo một mảng số nguyên gồm 10 phần tử:
Chú ý: Cần tránh khai báo mảng là biến cục bộ, vì điều này có thể gây ra tràn bộ nhớ (điều này được rút ra từ kinh nghiệm trong việc thi cử). Với các mảng có kích thước nhỏ (dưới 1000), việc khai báo là biến cục bộ có thể chấp nhận được, nhưng đối với các mảng có kích thước lớn hoặc kiểu dữ liệu lớn (như long long hay double), việc khai báo mảng là biến toàn cục sẽ an toàn hơn.
2. Khởi tạo mảng một chiều
Tương tự như biến, mảng cũng có thể được khởi tạo với các giá trị ngay khi khai báo. Số lượng phần tử được khởi tạo không được vượt quá kích thước mảng đã khai báo trước đó. Nếu kích thước mảng không được chỉ định, hệ thống sẽ tự động cấp phát đủ ô nhớ để lưu trữ các phần tử được khởi tạo. Cú pháp khởi tạo mảng là:
Có nhiều cách khác nhau để khởi tạo mảng
- Khởi tạo một mảng với kích thước cố định:
- Khởi tạo một mảng có số phần tử khởi tạo ít hơn kích thước đã khai báo:
Trong tình huống này, những phần tử chưa được khởi tạo sẽ nhận giá trị tùy ý. Nếu mảng được khai báo là biến toàn cục, các phần tử chưa được gán giá trị sẽ mặc định là 0 ,Tuy nhiên, nếu mảng là biến cục bộ, các phần tử trống sẽ nhận giá trị bất kỳ. Thông thường, khi khai báo mảng, chúng ta nên khai báo là biến toàn cục thay vì biến cục bộ để tránh những hiểu lầm không cần thiết trong quá trình tính toán do các phần tử có giá trị tùy ý.
- Khởi tạo mảng không có kích thước:
Đối với trường hợp này, mảng sẽ có số vị trí bằng đúng với số phần tử được khởi tạo.
-
Minh họa mảng một chiều bằng hình vẽ:
III. Các thao tác cơ bản trên mảng một chiều
1. Truy cập các phần tử trong mảng
Các phần tử trong mảng đều được đánh số, bắt đầu từ 0 tới N−1 (N là kích thước mảng). Để truy cập và sử dụng một phần tử trong mảng, ta sử dụng toán tử []
với cú pháp:
Mỗi phần tử trong mảng, khi được truy cập, trở thành một biến độc lập, có thể sử dụng để thực hiện tính toán và kết hợp với các câu lệnh và toán tử khác.
Ví dụ:
- Gán giá trị cho một phần tử của mảng:
- Lấy giá trị của mảng gán cho một biến:
2. Duyệt các phần tử của mảng
Để truy cập tất cả các phần tử trong một mảng, chúng ta có thể sử dụng vòng lặp kết hợp với toán tử [] để truy cập từng phần tử trong mảng. Cú pháp tổng quát như sau:
Chẳng hạn, nếu cần duyệt qua và in ra các phần tử trong một mảng A gồm 4 phần tử, ta có thể viết:
3. Nhập dữ liệu vào mảng
Trong trường hợp cần yêu cầu nhập vào giá trị cho một mảng gồm N phần tử, ta có thể làm như sau:
Hoặc nếu muốn cho mảng bắt đầu từ vị trí 1 thì khai báo tăng kích thước thêm 1 đơn vị:
Dưới đây là một ví dụ cụ thể về chương trình nhập vào một mảng gồm N số nguyên và in ra mảng theo thứ tự ngược lại. Bạn có thể tham khảo ví dụ này để hiểu rõ hơn về những điều đã được đề cập ở trên:
Giả sử nhập vào N=4 và mảng a={1,2,3,4}, kết quả chạy chương trình sẽ đưa ra như sau:
4. Thêm giá trị vào cuối mảng
Đôi khi, trong quá trình tính toán, chúng ta cần thêm giá trị mới vào cuối mảng. Để làm điều này, chúng ta sử dụng một biến đếm cnt để lưu số lượng phần tử hiện có trong mảng. Sau đó, ta tăng giá trị của biến cnt và gán phần tử mới vào vị trí cnt trong mảng. Khi đó, kích thước của mảng sẽ chính là cnt :