Mảng
Giả sử cần viết một chương trình để lưu trữ dữ liệu điểm học sinh của một lớp:

Ví dụ
Với một lớp có \(5\) học sinh, cần phải tạo \(5\) biến khác nhau để chứa dữ liệu điểm của học sinh như sau:
Mã nguồn
#include <bits/stdc++.h>
using namespace std;
double diem_1, diem_2, diem_3, diem_4, diem_5;
int main() {
cin >> diem_1 >> diem_2 >> diem_3 >> diem_4 >> diem_5;
return 0;
}
Tuy nhiên, khi quy mô dữ liệu tăng lên, chẳng hạn để quản lí thông tin \(50\) học sinh của một lớp hay \(1000\) học sinh của một trường học, việc khai báo từng biến “thủ công” trở nên bất khả thi. Để khắc phục hạn chế trên, C++
cung cấp cấu trúc dữ liệu mảng (array), cho phép lưu trữ và xử lí nhiều biến có cùng kiểu dữ liệu và có tính chất tương tự nhau.
Mảng
Mảng là tập hợp các phần tử có thứ tự, mỗi phần tử có cùng kiểu dữ liệu và có tính chất tương tự nhau.
Cú pháp:
<kiểu_dữ_liệu> <tên_mảng>[<kích_thước_mảng>];
Ví dụ
Tạo một mảng gồm 5 phần tử để chứa dữ liệu điểm của 5 học sinh:
Mã nguồn
double diem[5];
Khởi tạo các giá trị của mảng như sau:
Mã nguồn
double diem[5] = {7.5, 9, 10, 8.5, 9.5};

Truy cập phần tử trong mảng
Cú pháp:
<tên_mảng>[<chỉ_số>];
Ví dụ
In ra phần tử có chỉ số 3
trong mảng diem
, gọi diem[3]
;
Mảng trong C++
được đánh số bắt đầu từ \(0\), các phần tử hợp lệ của mảng diem
là diem[0]
, diem[1]
, diem[2]
, diem[3]
, diem[4]
(5 phần tử).
Nếu mã nguồn truy cập vào các phần tử không hợp lệ như: diem[-1]
, diem[5]
, diem[10]
, ... thì chương trình sẽ sinh ra lỗi.
Các thao tác với các phần tử của mảng sẽ giống như một biến bình thường:
Ví dụ 1
Mã nguồn
#include <bits/stdc++.h>
using namespace std;
double diem[5] = {7.5, 9, 10, 8.5, 9.5};
int main() {
cout << diem[0] << " ";
cout << diem[1] << " ";
cout << diem[2] << " ";
cout << diem[3] << " ";
cout << diem[4];
return 0;
}
Đầu ra
7.5 9 10 8.5 9.5
Để thuận tiện cho các thao tác nhập, xuất và xử lí các phần tử, mảng thường được sử dụng kết hợp với vòng lặp.
Ví dụ 2
In ra các phần tử trong mảng.
Mã nguồn
#include <bits/stdc++.h>
using namespace std;
double diem[5] = {7.5, 9, 10, 8.5, 9.5};
int main() {
for (int i = 0; i < 5; i++) {
cout << diem[i] << " ";
}
return 0;
}
Đầu ra
7.5 9 10 8.5 9.5
Ví dụ 3
Sửa điểm của một số bạn trong lớp
Mã nguồn
#include <bits/stdc++.h>
using namespace std;
double diem[5] = {7.5, 9, 10, 8.5, 9.5};
int main() {
cout << "Diem truoc khi sua: ";
for (int i = 0; i < 5; i++) {
cout << diem[i] << " ";
}
cout << "\n";
diem[1] -= 1;
diem[3] += 0.5;
diem[4] = 10;
cout << "Diem sau khi sua: ";
for (int i = 0; i < 5; i++) {
cout << diem[i] << " ";
}
return 0;
}
Đầu ra
Diem truoc khi sua: 7.5 9 10 8.5 9.5
Diem sau khi sua: 7.5 8 10 9 10
Ví dụ 4
Nhập điểm của 5 học sinh từ bàn phím, in ra tổng điểm của 5 học sinh đó.
Mã nguồn
#include <bits/stdc++.h>
using namespace std;
double diem[5];
int main() {
// Nhập điểm vào mảng
for (int i = 0; i < 5; i++) {
cin >> diem[i];
}
// Tính tổng các phần tử trong mảng
double tong = 0;
for (int i = 0; i < 5; i++) {
tong += diem[i];
}
cout << tong;
return 0;
}
Đầu vào
7.5 9 10 8.5 9.5
Đầu ra
44.5
Chỉ số 0 và chỉ số 1
Việc bắt đầu đánh số từ chỉ số \(0\) cho một danh sách có thể không quen thuộc với người mới bắt đầu. Trên thực tế, việc đánh dấu từ chỉ số \(1\) thường phổ biến hơn. Ví dụ, trong danh sách lớp thì học sinh đầu tiên thường được đánh số \(1\), ngày đầu tiên của một tháng là ngày \(1\), \(\ldots\)
Do đó, để "xê dịch" các chỉ số phần tử trong mảng \(1\) đơn vị, ta thường khai báo mảng có kích thước lớn hơn. Ví dụ, để tạo mảng chứa điểm của \(5\) học sinh và các học sinh đánh số từ \(1\), có thể tạo một mảng có kích thước bằng \(6\), và bỏ qua phần tử diem[0]
.
Ví dụ
Mã nguồn
#include <bits/stdc++.h>
using namespace std;
double diem[6];
int main() {
// Nhập điểm vào mảng
for (int i = 1; i <= 5; i++) {
cin >> diem[i];
}
// Tính tổng các phần tử trong mảng
int tong = 0;
for (int i = 1; i <= 5; i++) {
tong += diem[i];
}
cout << tong;
return 0;
}
Đầu vào
7.5 9 10 8.5 9.5
Đầu ra
44.5
Việc sử dụng mảng từ chỉ số \(1\) được gọi là đánh số bắt đầu từ \(1\) (one-based indexing), còn theo mặc định C++
sử dụng đánh số bắt đầu từ \(0\) (zero-based indexing).