Bài này sẽ giới thiệu khái niệm cấu trúc dữ liệu dạng mảng. Cách khai báo và khởi tạo mảng một chiều trong C++.
1. Mảng là gì? Tại sao phải sử dụng mảng?
Giả sử, trong một chương trình cần lưu trữ 3 số nguyên để tính toán? Đơn giản là khai báo 3 biến int a1, a2, a3;
Nhưng trong chương trình cần lưu trữ 100 số nguyên? Khai báo 100 biến kiểu số nguyên? Muốn nhập và lưu trữ n số nguyên thì phải thực hiện 100 lần. Cách xử lý như thế lại quá “cồng kềnh”, chỉ khổ thân coder thôi.
Giải pháp: Cần có một cấu trúc dữ liệu cho phép lưu trữ một dãy các số nguyên và dễ dàng truy xuất. Đó là mảng (array).
Mảng (array) là một cấu trúc dữ liệu lưu trữ một dãy các biến có cùng kiểu dữ liệu như dãy các số nguyên, dãy các ký tự,…
Kích thước của mảng (số lượng biến trong mảng) được xác định ngay khi khai báo và không thay đổi. Mảng được cấp phát một khối nhớ liên tục để lưu trữ các biến trong mảng.
2. Mảng một chiều là gì?
Mảng một chiều là tập hợp tuần tự các phần tử có cùng kiểu dữ liệu và các phần tử được lưu trữ trong một dãy các ô nhớ liên tục trên bộ nhớ.
Mỗi phần tử của mảng một chiều được truy xuất bởi tên mảng và vị trí trong mảng gọi là “chỉ mục”, được đặt trong cặp dấu ngoặc vuông [ ]. Vị trí trong mảng luôn bắt đầu từ 0 đến tổng số phần tử trừ đi 1.
3. Cách khai báo và khởi tạo mảng một chiều
3.1. Khai báo mảng một chiều
Cú pháp
<kiểu dữ liệu> <tên biến mảng>[<số phần tử>];
Lưu ý: Phải xác định <số phần tử> cụ thể (hằng) khi khai báo.
Ví dụ: int Mang1Chieu[10];
Lưu ý khi khai báo mảng
Phải xác định cụ thể số phần tử của mảng ngay lúc khai báo. Không được sử dụng biến để khai báo số phần tử của mảng.
int n1 = 10; int a[n1];//error: expected constant expression
Nên sử dụng khai báo hằng số #define để định nghĩa số phần tử của mảng.
#define n1 10
#define n2 20
int a[n1]; //tương đương int a[10];
int b[n1][n2]; //tương đương int b[10][20];
3.2. Khởi tạo mảng một chiều
Cách 1 – Khởi tạo giá trị cho mọi phần tử của mảng
int a[4] = {2912, 1706, 1506, 1904};
Cách 2 – Khởi tạo giá trị cho một số phần tử đầu mảng
int a[4] = {2912, 1706};
Các phần tử trong mảng không được gán giá trị khởi tạo thì sẽ tự động nhận giá trị ngẫu nhiên. Trong mảng, giá trị ngẫu nhiên này thường là 0.
Cách 3 – Khởi tạo giá trị 0 cho mọi phần tử của mảng
int a[4] = {0};
Cách 4 – Tự động xác định số lượng phần tử
int a[] = {2912, 1706, 1506, 1904};
Chương trình tự động hiểu số lượng các phần tử trong mảng là 4, không cần khai báo <số phần tử> (int a[4]) trong mảng.
3.3. Truy xuất đến một phần tử trong mảng một chiều
Truy xuất thông qua chỉ số phần tử của mảng
<tên biến mảng> [<chỉ số>]
Ví dụ một mảng như sau:
Các truy xuất hợp lệ: a[0], a[1], a[2], a[3]
Các truy xuất không hợp lệ: a[-1], a[4], a[5],…
4. Một số lỗi thường gặp khi khai báo và khởi tạo mảng một chiều
Khai báo không chỉ rõ số lượng phần tử
Khai báo int a[]; sẽ bị lỗi, khai báo đúng là int a[100];
Khai báo số lượng phần tử của mảng không được là biến
Khai báo int n1 = 10; int a[n1]; sẽ bị lỗi khai báo đúng là int a[10];
Khởi tạo cách biệt với khai báo
Khởi tạo int a[4]; a = {2912, 1706, 1506, 1904}; sẽ bị lỗi, khởi tạo đúng là int a[4] = {2912, 1706, 1506, 1904};
Chỉ số mảng không hợp lệ
Chỉ số của mảng int a[4]; là 0, 1, 2, 3 nên truy xuất các truy xuất như a[-1] = 1; a[10] = 0; là sai.