Mảng trong lập trình
Bài học này giúp em hiểu vì sao cần dùng mảng, cách khai báo mảng 1 chiều, cách duyệt mảng để tính tổng, tìm giá trị lớn nhất/nhỏ nhất và bước đầu làm quen với mảng 2 chiều.
Mục tiêu bài học
Sau bài này, em cần nắm được các ý nền tảng trước khi học sâu hơn về thuật toán xử lý dãy số.
Hiểu mảng là gì và tại sao phải dùng mảng thay vì dùng từng biến lẻ tẻ.
Biết cách khai báo mảng 1 chiều và truy cập phần tử theo chỉ số.
Biết cách tính tổng, tìm min/max trong mảng.
Làm quen với mảng 2 chiều để lưu bảng điểm, ma trận pixel, bàn cờ.
So sánh cách làm trong C++ và Python để hiểu điểm giống và khác nhau.
Khởi động: Vì sao cần có mảng?
Hãy tưởng tượng em cần lưu điểm của 5 môn học cho bạn Nam. Nếu chỉ có 5 môn, ta còn có thể dùng nhiều biến riêng lẻ. Nhưng nếu là 45 học sinh, 200 học sinh hoặc 10 000 số trong một bài thi lập trình, cách dùng từng biến sẽ rất khó quản lý.
// C++
int d1, d2, d3, d4, d5;
cin >> d1 >> d2 >> d3 >> d4 >> d5;
Thử suy nghĩ nhanh
Nếu cần lưu điểm của 45 học sinh, mỗi học sinh có 5 môn, cách nào hợp lý hơn?
1. Mảng là gì?
Minh họa mảng điểm 5 môn
Mỗi ô trong mảng giống như một ngăn tủ. Muốn lấy dữ liệu ở ngăn nào, ta gọi đúng chỉ số của ngăn đó.
int a[5]; // khai báo mảng 5 phần tử
for (int i = 0; i < 5; i++) {
cin >> a[i]; // nhập từng điểm
}
a = [] # danh sách rỗng
for i in range(5):
x = int(input())
a.append(x) # thêm vào cuối danh sách
C++: chỉ số mảng bắt đầu từ 0.
Python: cũng bắt đầu từ 0.
2. Duyệt mảng và tính toán cơ bản
Duyệt mảng nghĩa là dùng vòng lặp đi qua từng phần tử trong mảng. Khi duyệt, ta có thể cộng dồn để tính tổng, đếm số chẵn, tìm số lớn nhất hoặc nhỏ nhất.
Ví dụ: Tính tổng các phần tử trong mảng
#include
using namespace std;
int main() {
int n;
cin >> n; // số lượng phần tử
vector a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
long long sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
}
cout << sum;
return 0;
}
n = int(input())
a = list(map(int, input().split())) # nhập n số trên 1 dòng
total = 0
for x in a:
total += x
print(total)
Mô phỏng vòng lặp cộng tổng
Mảng ví dụ: [3, 5, 2, 4]
sum = 0. Bấm “Bước tiếp” để xem vòng lặp hoạt động.
Thực hành nhanh: nhập mảng và xem kết quả
Nhập các số cách nhau bởi dấu cách. Ví dụ: 4 7 2 10 6
3. Tìm giá trị lớn nhất / nhỏ nhất trong mảng
Ý tưởng rất tự nhiên: giả sử phần tử đầu tiên là lớn nhất, sau đó đi qua các phần tử còn lại. Nếu gặp số lớn hơn, ta cập nhật lại kết quả.
mx = a[0].
i = 1 đến n - 1.
a[i] > mx, cập nhật mx = a[i].
mx là giá trị lớn nhất.
mx = 0.
Nếu mảng toàn số âm, cách này sẽ cho kết quả sai. Nên khởi tạo bằng a[0].
int mx = a[0];
for (int i = 1; i < n; i++) {
if (a[i] > mx) mx = a[i];
}
cout << mx;
mx = a[0]
for x in a[1:]:
if x > mx:
mx = x
print(mx)
Trong Python có sẵn max(a) và min(a),
nhưng tự viết vòng lặp giúp em hiểu thuật toán.
4. Mảng 2 chiều: dữ liệu dạng hàng - cột
Mảng 2 chiều dùng khi dữ liệu có dạng hàng-cột như bảng điểm nhiều bạn với nhiều môn, ma trận ảnh, bàn cờ, sơ đồ chỗ ngồi, bảng nhiệt độ theo ngày và giờ.
Ma trận 3 hàng, 4 cột
i, cột j:
C++:
a[i][j]
Python:
a[i][j]
int a[3][4]; // ma trận 3 hàng, 4 cột
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
cin >> a[i][j];
}
}
rows = 3
cols = 4
a = []
for i in range(rows):
row = list(map(int, input().split()))
a.append(row)
Kiểm tra nhanh sau bài học
Câu 1
Mảng C++ int a[5] có các chỉ số hợp lệ nào?
Câu 2
Để tính tổng các phần tử, ta thường dùng kỹ thuật nào?
Câu 3
Mảng 2 chiều phù hợp để lưu dữ liệu nào?
Bài tập tự luyện
Nhập n và một mảng n số nguyên. In ra tổng và giá trị lớn nhất.
Nhập ma trận kích thước R x C. In tổng từng hàng.
Đếm có bao nhiêu số chẵn trong mảng.
#include
using namespace std;
int main() {
int n;
cin >> n;
vector a(n);
for (int i = 0; i < n; i++) cin >> a[i];
long long sum = 0;
int mx = a[0];
int even_count = 0;
for (int x : a) {
sum += x;
if (x > mx) mx = x;
if (x % 2 == 0) even_count++;
}
cout << "Tong = " << sum << "
";
cout << "Max = " << mx << "
";
cout << "So chan = " << even_count << "
";
return 0;
}
n = int(input())
a = list(map(int, input().split()))
total = sum(a)
mx = max(a)
even_count = sum(1 for x in a if x % 2 == 0)
print("Tong =", total)
print("Max =", mx)
print("So chan =", even_count)
Tổng kết
Thay vì tạo nhiều biến rời rạc, ta dùng mảng để quản lý dữ liệu có cấu trúc.
Phần tử đầu tiên là a[0], phần tử cuối cùng là a[n - 1].
Tính tổng, tìm min/max, đếm phần tử đều bắt đầu từ việc duyệt từng phần tử.
Tiếp theo: Chuỗi ký tự — xử lý text, tên học sinh, câu tiếng Việt có dấu.
💳 Quét mã ủng hộ tuỳ tâm nhé!